GetSmoObject错误:尝试为ManagedCompter检索对象数据失败

时间:2018-02-28 17:35:29

标签: powershell .net-client-profile

我正在尝试编写一个PowerShell脚本,该脚本将启用TCP / IP和命名管道服务器协议,但我的服务器无法找到它们。这是我用来连接协议的代码。

[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement")

$wmi = new-object ('Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer')
$uri = "ManagedComputer[@Name='<computer_name>']/ ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']"
$Tcp = $wmi.GetSmoObject($uri)
$Tcp.IsEnabled = $true
$Tcp.Alter()

问题来自GetSmoObject cmdlet,我收到以下错误:

enter image description here

当我将$ uri变量设置为以下时运行GetSmoObject:

$uri = "ManagedComputer[@Name='<computer_name>']"

我得到以下结果:

enter image description here

我的服务器无法找到服务器实例或客户端协议,即使我知道它们存在。

enter image description here

有谁知道如何设置我的服务器,以便它可以检测我需要更新的服务器协议?

2 个答案:

答案 0 :(得分:0)

dbatools在这个模块中有很多非常好的命令。

希望这会让你开始

客户端协议设置: https://dbatools.io/functions/get-dbaclientprotocol/

服务器协议设置:https://dbatools.io/functions/get-dbaserverprotocol/

答案 1 :(得分:0)

是的,使用&#34; Microsoft.SqlServer.SqlWmiManagement&#34;名称空间:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement") | Out-Null

您将创建一台新机器&#34; ManagedComputer类型的级别对象。那将包含该机器上的所有实例:

$machine = New-Object 'Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer' -ArgumentList 'deezNutz'
$machine.ServerInstances.ServerProtocols | Select DisplayName, State, IsEnabled

请记住,ServerInstances是一组实例。如果计算机承载多个实例,则您需要引用所需的实例。为了简单起见,我假设机器有一个默认实例。

现在,如果要禁用协议。只需将该属性设置为$False并退回实例。

$machine.ServerInstances.ServerProtocols.Item(0).IsEnabled = $True

现在在此处显示,但您可以通过Restart-Service循环实例。