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

问题描述 投票:0回答:2

我正在尝试编写一个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

当我运行GetSmoObject时,我的$ uri变量设置为以下内容:

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

我得到以下结果:

enter image description here

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

enter image description here

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

powershell .net-client-profile
2个回答
0
投票

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

希望这会让你开始

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

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


0
投票

是的,使用“Microsoft.SqlServer.SqlWmiManagement”命名空间:

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

您将创建一个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循环实例。

© www.soinside.com 2019 - 2024. All rights reserved.