我必须更改数百个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服务帐户?
答案 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”),...配合使用。