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 }