使用Powershell更改mssql服务帐户,但不更改带有LoadWithPartialName的SQL Server WMI提供程序

时间:2018-08-15 09:19:51

标签: sql-server powershell service wmi account

我必须更改数百个MSSQL服务器和代理的服务帐户。

Microsoft建议使用sql服务器配置管理器。这种方法可以正常工作,但是如果必须执行一百次,那将是可怕的。

在Powershell运行良好的最新服务器(Windows Server 2016,SQL Server 2016/2017)上:

$computer = $env:computername
[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement")
$wmi = New-Object ("Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer") $computer
$wmi.Services | Select Name, DisplayName, Type, StartMode, ServiceState, 
ServiceAccount | ft -auto
$sqlserver = $wmi.Services | where {$_.Type -eq "SqlServer"}
$sqlserver.SetServiceAccount($account, $pw)

但是,几乎每台较旧的服务器(Windows Server 2008-2012R2,SQL Server 2008-2014)都会为我提供一个空的WmiConnectionInfo,这是一个例外:

ConnectionSettings : Microsoft.SqlServer.Management.Smo.Wmi.WmiConnectionInfo
Services           : 
ClientProtocols    : 
ServerInstances    : 
ServerAliases      : 
Urn                : ManagedComputer[@Name='SERVER']
Name               : SERVER
Properties         : {}
UserData           : 
State              : Existing
The following exception occurred while trying to enumerate the collection: "SQL Server WMI provider is not available on SERVER.".

在旧服务器上,我检查了已加载的组件。 [reflection.assembly] ::: LoadWithPartialName(“ Microsoft.SqlServer.Smo”)。FullName提供[...] 版本= 13.0.0.0 [...]。 SQL Server 2014是版本12,而不是13。

但是,即使我加载了正确(?)版本的dll,结果也保持不变。

[reflection.assembly]::Load("Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=...")
[reflection.assembly]::Load("Microsoft.SqlServer.SqlWmiManagement, Version=12.0.0.0, Culture=neutral, PublicKeyToken=...")

我是否需要使用正确的版本加载更多的分析物? 是否有另一种建议的方法通过Powershell更改mssql服务帐户?

2 个答案:

答案 0 :(得分:0)

有趣。程序集和Server 2012似乎有些不兼容。如果我针对SQL Server 2012实例运行它:

Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
Add-Type -AssemblyName "Microsoft.SqlServer.SqlWmiManagement, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
$wmi = New-Object -TypeName "Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer" -ArgumentList $ServerName
$wmi.Services | Select-Object -Property Name, DisplayName, Type, StartMode, ServiceState, ServiceAccount | Format-Table -AutoSize

我得到:

Name           DisplayName                                                 Type StartMode ServiceState
----           -----------                                                 ---- --------- ------------
MsDtsServer100 SQL Server Integration Services 10.0 SqlServerIntegrationService  Disabled      Stopped

(注意:出于隐私目的,我在这里故意切断了ServiceAccount列。)

但是对于SQL Server 2008 R2实例,我得到:

Name                   DisplayName                                                               Type StartMode ServiceState
----                   -----------                                                               ---- --------- ------------
MsDtsServer100         SQL Server Integration Services 10.0               SqlServerIntegrationService      Auto      Running
MSSQLFDLauncher        SQL Full-text Filter Daemon Launcher (MSSQLSERVER)                           9    Manual      Running
MSSQLSERVER            SQL Server (MSSQLSERVER)                                             SqlServer      Auto      Running
MSSQLServerOLAPService SQL Server Analysis Services (MSSQLSERVER)                      AnalysisServer      Auto      Running
ReportServer           SQL Server Reporting Services (MSSQLSERVER)                       ReportServer      Auto      Running
SQLBrowser             SQL Server Browser                                                  SqlBrowser  Disabled      Stopped
SQLSERVERAGENT         SQL Server Agent (MSSQLSERVER)                                        SqlAgent      Auto      Running

但是,如果我使用v14的程序集:

Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
Add-Type -AssemblyName "Microsoft.SqlServer.SqlWmiManagement, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
$wmi = New-Object -TypeName "Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer" -ArgumentList $ServerName
$wmi.Services | Select-Object -Property Name, DisplayName, Type, StartMode, ServiceState, ServiceAccount | Format-Table -AutoSize

SQL Server 2012:

Name                   DisplayName                                                               Type StartMode ServiceState
----                   -----------                                                               ---- --------- ------------
MsDtsServer100         SQL Server Integration Services 10.0               SqlServerIntegrationService  Disabled      Stopped
MsDtsServer110         SQL Server Integration Services 11.0               SqlServerIntegrationService      Auto      Running
MSSQLFDLauncher        SQL Full-text Filter Daemon Launcher (MSSQLSERVER)                           9    Manual      Running
MSSQLSERVER            SQL Server (MSSQLSERVER)                                             SqlServer      Auto      Running
MSSQLServerOLAPService SQL Server Analysis Services (MSSQLSERVER)                      AnalysisServer      Auto      Running
ReportServer           SQL Server Reporting Services (MSSQLSERVER)                       ReportServer      Auto      Running
SQLBrowser             SQL Server Browser                                                  SqlBrowser      Auto      Running
SQLSERVERAGENT         SQL Server Agent (MSSQLSERVER)                                        SqlAgent      Auto      Running

SQL Server 2008 R2:

Name                   DisplayName                                                               Type StartMode ServiceState
----                   -----------                                                               ---- --------- ------------
MsDtsServer100         SQL Server Integration Services 10.0               SqlServerIntegrationService      Auto      Running
MSSQLFDLauncher        SQL Full-text Filter Daemon Launcher (MSSQLSERVER)                           9    Manual      Running
MSSQLSERVER            SQL Server (MSSQLSERVER)                                             SqlServer      Auto      Running
MSSQLServerOLAPService SQL Server Analysis Services (MSSQLSERVER)                      AnalysisServer      Auto      Running
ReportServer           SQL Server Reporting Services (MSSQLSERVER)                       ReportServer      Auto      Running
SQLBrowser             SQL Server Browser                                                  SqlBrowser  Disabled      Stopped
SQLSERVERAGENT         SQL Server Agent (MSSQLSERVER)                                        SqlAgent      Auto      Running

不幸的是,我没有可以安全地对其进行测试的SQL Server 2014或更高版本。

我不确定是否要从PowerShell库中从Microsoft的SqlServer PowerShell模块中获取程序集的版本14,还是从SSMS v17中获得它。

实际上我的系统上仍有v10的程序集可用,它们的工作方式与v12程序集一样。

我想知道这是错误还是已知问题。

答案 1 :(得分:0)

这种方法解决了我的问题。

我使用以下命令检查已加载的程序集:

$dlls = [System.AppDomain]::CurrentDomain.GetAssemblies()
$dlls | where {$_.Location -match "SQL"}

我相信,我已经找到了大多数情况下的解决方案(Windows Server 2008-2012R2,SQL Server 2008-2014)。

Add-Type -path "C:\Program Files (x86)\Microsoft SQL Server\$version\SDK\Assemblies\Microsoft.SqlServer.Smo.dll"
Add-Type -path "C:\Program Files (x86)\Microsoft SQL Server\$version\SDK\Assemblies\Microsoft.SqlServer.SqlWmiManagement.dll"

有时路径是不同的。有时正确的dll位于目录中,该目录在安装时指定为INSTALLSHAREDWOWDIR。 也许是就地升级或安装新的管理工作室的结果。

更多最新的服务器(Windows Server 2016,SQL Server 2016/2017)可与[void] [reflection.assembly] :: LoadWithPartialName(“ Microsoft.SqlServer.Smo”),...配合使用。

相关问题