VBScript 错误尝试禁用 SQL 服务器中的动态端口

VBScript Error Trying to disable dynamic port in SQL Server

我一直在尝试在 SQL Server 2012 的新安装中自动禁用动态端口并设置静态 TCP 端口。我可以在 SQL 配置管理器没有问题的情况下执行此操作,但是获取执行此操作的脚本给我带来了更多麻烦。幸运的是,我在这里找到了一个想要做同样事情的人:MSDN Forums

我使用的代码如下:

Private Function setProperty ( ByVal path, ByVal value )
    Set obj = GetObject(path)
    errornumber = obj.SetStringValue(value)
    If Not errornumber = 0 Then
        WScript.Quit(errornumber)
    End If
End Function

Set args = WScript.Arguments
If Not args.Count = 1 Then
    WScript.Echo "ERROR: Invalid arguments"
    WScript.Echo "Usage: cscript " & WScript.ScriptName & " "
    WScript.Quit(255)
End If

' set TCP/IP port of SQLServer instance 'SQLSERVER_MATRIX'
setProperty "WINMGMTS:\.\root\Microsoft\SqlServer\ComputerManagement:ServerNetworkProtocolProperty.InstanceName='SQLSERVER_MATRIX',IPAddressName='IPAll',PropertyName='TcpPort',PropertyType=1,ProtocolName='Tcp'", args(0)
' switch off dynamic ports
setProperty "WINMGMTS:\.\root\Microsoft\SqlServer\ComputerManagement:ServerNetworkProtocolProperty.InstanceName='SQLSERVER_MATRIX',IPAddressName='IPAll',PropertyName='TcpDynamicPorts',PropertyType=1,ProtocolName='Tcp'", ""

我按照网站上的建议尝试 运行

cscript.exe //nologo set_port_property.vbs

并得到错误:

set_port_property.vbs(1,1) (null): 0x8004100E

所以这给了我一个命名空间错误,这就是我卡住的地方。它看起来不像其他人对这个文件有问题,因为我在多个地方找到它,但我正在 Windows 10 计算机上尝试这个 SQL Server 2012 和我的一切发现使用的是 2008,最多 Windows 8。有一个 Scriptomatic 2.0 工具可能会有所帮助,但 Microsoft 页面上的 link 已损坏,所以我不知道从这里去哪里。

您指出的错误代码是

WBEM_E_INVALID_NAMESPACE (0x8004100E)
The specified namespace did not exist on the server.

这是不言自明的,基本上无论出于何种原因都无法识别所传递的命名空间,通常只是输入不正确,但正如您已经提到的,其他人正在毫无问题地使用此脚本。

一些建议

  1. 这很可能指向本机,我首先尝试运行另一台机器上的脚本,看看是否可以单独隔离到本机。

  2. 您可能还想使用 Windows 中提供的内置工具测试 WMI 安装的运行状况。 wbemtest.exe 工具是一个很棒的小工具,用于测试与 WMI 存储库的连接和查询。


偶然发现答案

在回答这个问题的过程中,我觉得我可能是无意中找到了答案。

尝试了建议 2。我自己测试连接到

root\microsoft\sqlserver\computermanagement

但使用 wbemtest.exe 失败并出现同样的错误,但发现我可以连接到

root\microsoft\sqlserver

快速 google 找到描述“How to: Access WMI Provider for Configuration Management using WQL”的 MSDN 文档后,它为我指出了正确的方向。

您会看到 SQL Server 的更高版本的命名空间不同。

连接后

root\Microsoft\SqlServer\ComputerManagement11

使用 wbemtest.exe 我不再收到错误并且能够浏览 类 和实例。

考虑到这一点,更改代码中的命名空间应该可以解决问题。

' set TCP/IP port of SQLServer instance 'SQLSERVER_MATRIX'
setProperty "WINMGMTS:\.\root\Microsoft\SqlServer\ComputerManagement11:ServerNetworkProtocolProperty.InstanceName='SQLSERVER_MATRIX',IPAddressName='IPAll',PropertyName='TcpPort',PropertyType=1,ProtocolName='Tcp'", args(0)
' switch off dynamic ports
setProperty "WINMGMTS:\.\root\Microsoft\SqlServer\ComputerManagement11:ServerNetworkProtocolProperty.InstanceName='SQLSERVER_MATRIX',IPAddressName='IPAll',PropertyName='TcpDynamicPorts',PropertyType=1,ProtocolName='Tcp'", ""

事实上,在 MSDN 上该线程的最底部,有人甚至暗示了这一点,但对于 SQL Server 2008

Goozak posted in MSDN Forums - silent install with fixed tcp port
Date: Wednesday, March 17, 2010 3:13 PM


"know this is an old thread, but since this is the post I found that helped me solve my problem, I just want to add that for SQL Server 2008 Express, you need to use ComputerManagement10 :ServerNetworkProtocolProperty..."