c# - 在 x64 上使用 WMI 创建 SQL Server 别名

标签 c# sql-server wmi system.management

我有一个小应用程序,它会自动为某些服务器创建必要的 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/

相关文章:

c# - 使用 JWT 声明对 .NET Core Web API Controller 进行单元测试

sql-server - 这是存储过程中写得好的事务吗

Python、WMI、注册表和奇怪的结果

c# - Assert.NotNull(object anObject) 与 Assert.IsNotNull(object anObject)

c# - 通过扩展方法将项目添加到 IEnumerable 不起作用?

sql - 如何给sql server用户授予sendmail权限?

SQL Server - 条件语句的查询执行计划

c# - 在远程计算机 WMI C# 上搜索文件

c# - 在 C# 中使用 WMI 更改用户的家长控制设置

c# - 我如何在 C# 中找出某些东西是结构(值类型)或类(引用类型)