This uses a CIMMethod to change the service accounts. The Wmi.ManagedComputer method is also included in the comments below…but I’ve found this to be not reliable at times.
cls
[securestring]$mssqlpwd = ConvertTo-SecureString "yomamma" -AsPlainText -Force
[PSCredential]$mssqlCred = New-Object System.Management.Automation.PSCredential ("$env:userdomain\sqlserver", $mssqlpwd)
[securestring]$agentPwd = ConvertTo-SecureString "wearsarmyboots" -AsPlainText -Force
[PSCredential]$agentCred = New-Object System.Management.Automation.PSCredential ("$env:userdomain\sqlagent", $agentPwd)
Invoke-Command -ComputerName 'ComputerName' -ScriptBlock{
$mssqlCred = $using:mssqlCred
$agentCred = $using:agentCred
try{
$ss = Get-CimInstance Win32_Service -Filter 'Name="sqlserveragent"'
$ss | Invoke-CimMethod -MethodName Change -Arguments @{StartName=$agentCred.UserName;StartPassword=$agentCred.GetNetworkCredential().Password}
$ss = Get-CimInstance Win32_Service -Filter 'Name="mssqlserver"'
$ss | Invoke-CimMethod -MethodName Change -Arguments @{StartName=$mssqlCred.UserName;StartPassword=$mssqlCred.GetNetworkCredential().Password}
<#
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement") | Out-Null
$srv = New-Object Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $env:COMPUTERNAME
$service = $srv.Services | Where-Object{$_.name -eq 'sqlserveragent'}
$service.SetServiceAccount($agentCred.UserName, $agentCred.GetNetworkCredential().Password);
Restart-Service -name sqlserveragent -Force
$service = $srv.Services | Where-Object{$_.name -eq 'mssqlserver'}
$service.SetServiceAccount($mssqlCred.UserName, $mssqlCred.GetNetworkCredential().Password);
Restart-Service -name mssqlserver -Force
#>
}
catch{
throw $_ | fl -Force | Out-String
}
Get-Service mssqlserver | Start-Service
Get-Service sqlserveragent | Start-Service
}