Table of Contents
Do you know what the service logon accounts are? The services are background processes that keep running without any user interface in the Windows operating system. These services are often set up to run under a particular user account, which we call a service logon account or a service account. This service account determines the security context in which service(s) run.
Note that providing sufficient permissions can change this service to any other account (must exist in Control Panel -> User Accounts on your machine). We can do it using the GUI of the Service console, but this tutorial is focused on how to do it using PowerShell. So, let’s dive into the possible ways of doing it.
You must run PowerShell as an administrator to use the following solutions.
Using Set-Service
Cmdlet [PowerShell 6.0+]
Use Set-Service
Cmdlet to change the service logon account using PowerShell. You can only get the advantage of this cmdlet to change the logon service account if you are using PowerShell version 6 or higher because we use the -Credential
parameter that was introduced in PowerShell 6.0.
1 2 3 |
Set-Service -Name "XboxGipSvc" -Credential (Get-Credential) |
1 2 3 4 5 6 |
PowerShell credential request Enter your credentials. User: DESKTOP-THAT\Tahir Password for user DESKTOP-THAT\Tahir: **** |
The Set-Service
cmdlet is used to start, stop, & suspend the service and modifies its properties. The -Name
parameter was used to specify the service name for which we wanted to change the service logon account. Wildcard characters are prohibited here, but you can use the pipeline to send the service name to the Set-Service
cmdlet. In the above example, the "XboxGipSvc"
is the service name; don’t forget to replace it with your service name.
The -Credential
parameter was used to specify the account used by a service as a Service Logon Account. These account credentials were retrieved using the Get-Credential
cmdlet (don’t forget to enclose it within ()
). The credentials are stored in a PSCredential object, and the password is stored as a SecureString.
In the above code, the Set-Service
cmdlet asked for the User
for which we have to enter as Domain\User
and a Password
. Here, Domain
is the PC name that you can find in Device Specifications
under This PC -> Properties
, and User
is the user account name. You will see a string of *
if you would have set the password for the given user; otherwise, hit Enter to continue.
If you use a PowerShell version of less than 6.0, you can use any of the following solutions.
Using Get-WmiObject
Cmdlet
To change service logon account using PowerShell:
- Store user name, password (if any) and service name in separate variables.
- Use the
Get-WmiObject
cmdlet to get a WMI object for the specified service. - Use the
StopService()
method to stop service to avoid inconvenience and store the returned value in a variable. - Use conditionals (
if-else
statements) with the-eq
operator to check if theReturnValue
property of the variable created in the previous step equals"0"
or"5"
. Otherwise, move to theelse
block. - Use the
Start-Sleep
cmdlet to wait for15
seconds to let the service stop completely. - Use the
Change()
method to change the logon service account and store the returned value in a variable. - Use the
if
statement with the-eq
operator to check if theReturnValue
property of the variable created in the previous step equals"0"
. Otherwise, move to theelse
block. - Print the customised messages using the
Write-Host
cmdlet in allif-else
blocks.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$username="DESKTOP-THAT\Tahir" $password="1234" $serviceName="XboxGipSvc" $serviceObj = Get-WmiObject -Class Win32_Service -Filter "name='$serviceName'" $stopServiceStatus = $serviceObj.StopService() if ($stopServiceStatus.ReturnValue -eq "0") { Write-host "The '$serviceName' service Stopped." -f Green } elseif($stopServiceStatus.ReturnValue -eq "5"){ Write-host "The '$serviceName' service is already stopped. Error code: $($stopServiceStatus.ReturnValue)" -f Yellow } else { Write-host "Failed to Stop the '$serviceName' service. Error code: $($stopServiceStatus.ReturnValue)" -f Red } Start-Sleep -Seconds 15 $changeLogonAccountStatus = $serviceObj.Change($null,$null,$null, $null,$null,$null, $username,$password,$null, $null,$null) if ($changeLogonAccountStatus.ReturnValue -eq "0") { Write-host "The logon account changed successfully for the '$serviceName' service." -f Green }else { Write-host "Failed to change the logon account for the '$serviceName' service. Error code: $($changeLogonAccountStatus.ReturnValue)" -f Red } |
1 2 3 4 |
The 'XboxGipSvc' service Stopped. The logon account changed successfully for the 'XboxGipSvc' service. |
First, we defined the $username
, $password
, and $serviceName
variables containing the username, password (if any; otherwise, it would be an empty string as ""
), and the service name. Then, we used the Get-WmiObject
cmdlet to get the Windows Management Instrumentation (WMI) object for the given service and stored this object in the $serviceObj
variable.
In the above example, the WMI object ($serviceObj
) denoted the Windows service that would have its logon account changed. In the above script, we used the -Class
parameter to specify the class, -Win32_Service
.
Then, we used the StopService()
method of the $serviceObj
object to stop the service. However, the if-else
block will be executed based on the returned value of StopService()
, which we stored in the $stopServiceStatus
variable. If it stopped successfully, then the value of the ReturnValue
property would be "0"
, and the if
block would be executed to display a message in green colour.
If the service is stopped, the value of the ReturnValue
property would be "5"
, causing the elseif
block’s execution; otherwise, the else
block would be executed. Inside the conditionals, we used the Write-Host
cmdlet with the format operator (-f
) to print messages in green, yellow, and red colour based on if they are success, warning, and error.
After that, we used the Start-Sleep
cmdlet to wait for 15
seconds to let the service end completely. Then, we used the Change() method of $serviceObj
object to change the service logon account and stored the returned value in a variable named $changeLogonAccountStatus
. The Change()
method took 11
arguments. All the arguments were $null
excluding arguments seven and eight, which were the $username
and $password
.
Next, we used the if
statement with the -eq
operator to check if the ReturnValue
property of the $changeLogonAccountStatus
equals "0"
. If it is, then we used Write-Host
to display a message in green stating the service logon account has been changed; otherwise, the else
block was executed, showing an error message in red.
Using the sc.exe
Command
Use the sc.exe
command to change the service logon account using PowerShell.
1 2 3 4 5 6 7 |
$serviceName = "XboxGipSvc" $username = "DESKTOP-THAT\Tahir" $password = "1234" $arguments = "config $serviceName obj= <code>"$username</code>" password= <code>"$password</code>"" Start-Process -FilePath "sc.exe" -ArgumentList $arguments -Wait -NoNewWindow |
1 2 3 |
[SC] ChangeServiceConfig SUCCESS |
First, we defined three variables to hold the username, password, and service name; it is the same as we did in the previous example. Then, we prepared a string having command line arguments that we wanted to pass to the sc.exe
command-line tool. We stored this string in the $arguments
variable.
The $arguments
was constructed using the values of $username
, $password
, and $serviceName
variables. Note that we used the backtick to escape double quotes before and after the $username
and $password
to pass them to sc.exe
as literal values.
Then, we used the Start-Process
cmdlet to start a new process running the sc.exe
command-line tool with the given $arguments
using the -ArgumentList
parameter. Next, the -FilePath
parameter specified the path to the sc.exe
executable, while the -Wait
parameter ensured the script waited for the sc.exe
command to finish (complete) before continuing.
Finally, the -NoNewWindow
parameter checked that sc.exe
is run in the same PowerShell console window. Overall, the code modifies the service logon account for the "XboxGipSvc"
service; don’t forget to replace this service name if you adopt this solution.
That’s all about PowerShell change service logon account.