我有一个小应用程序,它会自动为某些服务器创建必要的 SQL Server 别名条目。大部分代码如下所示:
private static void SetAlias(string aliasName, string server, string protocol, int? port)
{
var scope = new ManagementScope(@"\\.\root\Microsoft\SqlServer\ComputerManagement10");
try
{
scope.Connect();
}
catch
{
scope = new ManagementScope(@"\\.\root\Microsoft\SqlServer\ComputerManagement");
}
var clientAlias = new ManagementClass(scope, new ManagementPath("SqlServerAlias"), null);
clientAlias.Get();
foreach (ManagementObject existingAlias in clientAlias.GetInstances())
{
existingAlias.Get();
if (String.Equals((String)existingAlias.GetPropertyValue("AliasName"), aliasName))
{
UpdateAlias(existingAlias, aliasName, server, protocol, port);
return;
}
}
// create new
ManagementObject newAlias = clientAlias.CreateInstance();
UpdateAlias(newAlias, aliasName, server, protocol, port);
newAlias.Put();
}
private static void UpdateAlias(ManagementObject alias, string aliasName, string server, string protocol, int? port)
{
alias.SetPropertyValue("AliasName", aliasName);
alias.SetPropertyValue("ServerName", server);
alias.SetPropertyValue("ProtocolName", protocol);
alias.SetPropertyValue("ConnectionString", port != null ? port.ToString() : string.Empty);
}
这会在 32 位操作系统上正确创建我想要的条目,但是在 x64 操作系统上我需要将别名也添加到 64 位 SQL Server 客户端配置中。
有什么办法吗?
谢谢。
最佳答案
我将保留注册表答案,因为它是可行的,但您可以使用 ConnectionOptions 上的上下文来指定架构(int、32 或 64)
从 64 位访问两者的示例:
static void Main(string[] args)
{
var options = new ConnectionOptions();
if (Environment.Is64BitOperatingSystem && Environment.Is64BitProcess == false)
{
Console.WriteLine("Please build as AnyCPU or x64");
return;
}
// default behavior, should be 64-bit WMI provider
Console.WriteLine("Print 64-bit aliases");
PrintAliases(options);
// specify the 32-bit arch
Console.WriteLine("Print 32-bit aliases");
options.Context.Add("__ProviderArchitecture", 32);
PrintAliases(options);
}
private static void PrintAliases(ConnectionOptions options)
{
var scope = new ManagementScope(@"\\.\root\Microsoft\SqlServer\ComputerManagement10", options);
try
{
scope.Connect();
}
catch
{
scope = new ManagementScope(@"\\.\root\Microsoft\SqlServer\ComputerManagement");
}
var clientAlias = new ManagementClass(scope, new ManagementPath("SqlServerAlias"), null);
clientAlias.Get();
foreach (ManagementObject existingAlias in clientAlias.GetInstances())
{
existingAlias.Get();
var propertiesToRead = new[] { "AliasName", "ServerName", "ProtocolName", "ConnectionString" };
foreach (var propertyToRead in propertiesToRead)
{
Console.WriteLine("Property {0} = {1}", propertyToRead, existingAlias.GetPropertyValue(propertyToRead));
}
}
}
从 32 位访问两者的示例(注意:当然,可以强制 arch 为 32 位和 64 位,而不管进程位数)
class Program
{
static void Main(string[] args)
{
var options = new ConnectionOptions();
if (Environment.Is64BitProcess)
{
Console.WriteLine("Please run this sample as 32-bit");
return;
}
// default behavior, should be 32-bit WMI provider since we build as x86
Console.WriteLine("Print 32-bit aliases");
PrintAliases(options);
// also prints 32-bit aliases
options.Context.Add("__ProviderArchitecture", 32);
PrintAliases(options);
// specify the 64-bit arch
if (Environment.Is64BitOperatingSystem)
{
Console.WriteLine("Print 64-bit aliases");
options.Context.Add("__ProviderArchitecture", 64);
PrintAliases(options);
}
}
private static void PrintAliases(ConnectionOptions options)
{
var scope = new ManagementScope(@"\\.\root\Microsoft\SqlServer\ComputerManagement10", options);
try
{
scope.Connect();
}
catch
{
scope = new ManagementScope(@"\\.\root\Microsoft\SqlServer\ComputerManagement");
}
var clientAlias = new ManagementClass(scope, new ManagementPath("SqlServerAlias"), null);
clientAlias.Get();
foreach (ManagementObject existingAlias in clientAlias.GetInstances())
{
existingAlias.Get();
var propertiesToRead = new[] { "AliasName", "ServerName", "ProtocolName", "ConnectionString" };
foreach (var propertyToRead in propertiesToRead)
{
Console.WriteLine("Property {0} = {1}", propertyToRead, existingAlias.GetPropertyValue(propertyToRead));
}
}
}
关于c# - 在 x64 上使用 WMI 创建 SQL Server 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3489875/