C# 更新WMI实例属性

C# 更新WMI实例属性,c#,wmi,C#,Wmi,我正在尝试将TcpPort更新为1433,将TcpDynamicPorts更新为使用C,但我所做的任何更改都没有生效。我可以在C中找到我想要更新的实例,然后确认实例中存在属性,但是任何更新方法都会被忽略,不会出错 try { var searcher = new ManagementObjectSearcher(@"\\.\root\Microsoft\SqlServer\ComputerManagement10", "select * from ServerNetwor

我正在尝试将TcpPort更新为1433,将TcpDynamicPorts更新为使用C,但我所做的任何更改都没有生效。我可以在C中找到我想要更新的实例,然后确认实例中存在属性,但是任何更新方法都会被忽略,不会出错

try
{
    var searcher = new ManagementObjectSearcher(@"\\.\root\Microsoft\SqlServer\ComputerManagement10",
        "select * from ServerNetworkProtocolProperty where InstanceName='SQLEXPRESS' and ProtocolName='Tcp' and IPAddressName='IPAll'");
    foreach (ManagementObject instance in searcher.Get())
    {
        PutOptions options = new PutOptions();
        options.Type = PutType.UpdateOnly;

        foreach (var property in instance.Properties)
        {
            if (property.Name == "PropertyName" && (string)property.Value == "TcpPort")
            {
                instance.SetPropertyValue("PropertyStrVal", "1433");
            }

            if (property.Name == "PropertyName" && (string)property.Value == "TcpDynamicPorts")
            {
                instance.SetPropertyValue("PropertyStrVal", "");
            }
        }
        instance.Put(options);
    }
}
catch (ManagementException e)
{
    Console.WriteLine("An error occurred setting the WMI data: " + e.Message);
}

谁能告诉我哪里做错了?当我通过WMI Explorer 2.0查询属性时,所有内容都保持不变。

正如我之前在评论中提到的,我认为写入注册表比访问WMI更快、更容易。所以你要做的就是

private static void registryChangeSqlServerPort()
{
    /// SQL Server 2012 registry values
    ///      default instance
    ///          HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQLServer\SuperSocketNetLib\TCP\IPAll
    ///
    ///      named instance
    ///          HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11.(InstanceName)\MSSQLServer\SuperSocketNetLib\TCP\IPAll

    string instanceName = "SQLEXPRESS";
    string key =
                string.Format("SOFTWARE\\Microsoft\\Microsoft SQL Server\\MSSQL11.{0}\\MSSQLServer\\SuperSocketNetLib\\Tcp\\IPAll",
                            instanceName);
    RegistryKey regKey = Registry.LocalMachine.OpenSubKey(key, true);

    /// change TcpPort settings 
    string valueName = "TcpPort";
    string value = "1433";            
    regKey.SetValue(valueName, value, RegistryValueKind.String);

    /// change TcpDynamicPort settings 
    valueName = "TcpDynamicPorts";
    value = "";
    regKey.SetValue(valueName, value, RegistryValueKind.String);
}
有关sql server上的更多密钥,请参见此


请注意,在重新启动计算机之前,注册表中的任何更改都不会显示,因为它只在启动时加载一次。即使在观看regedit.exe时使用F5刷新,也无法显示更改的值

您可以尝试更改端口号以写入/更新注册表信息,而不是WMI。有关注册表位置和编写注册表的详细信息,请参阅此。将您的代码与此进行比较,我没有发现任何错误。谢谢,更新注册表要比尝试使用WMI轻得多。通过注册表更改,我成功地完成了所需的一切。干杯