Checking and Setting the Start Mode of a Windows Service with PowerShell
Working with Services in PowerShell is probably one of the first tasks you'll undertake as a PowerShell newbie. Recently I needed to disable a few Windows services on a server and I'm a big believer in being able to get back to where you started so the first thing I set out to accomplish was to find out what the start mode was of the services I needed to change.
My demo machine doesn't have those particular services I referenced so the BITS service will be used for the demonstration in this scenario:
1Get-Service -Name BITS
By default only a few properties are displayed, but like most things in PowerShell, there's more
properties available than are returned by default. I'll simply pipe the previous command to the
Select-Object
cmdlet, specify the Properties
parameter and use the wildcard character
(asterisk) to return all properties and their values for the BITS service:
1Get-Service -Name BITS | Select-Object -Property *
As you can see in the previous results, there's still isn't a StartMode parameter. You can certainly
change the StartMode of a service from within PowerShell with the Set-Service
cmdlet, so why can't
you check to see what the StartMode is from within PowerShell?
It can be done in WMI and PowerShell has cmdlets for accessing WMI. It's not really PowerShell's
fault that it doesn't natively display the StartMode property though. You see, PowerShell runs on
the .Net Framework and the Get-Service
cmdlet returns the same properties as the underlying .Net
Framework class which that cmdlet uses:
1Add-Type -AssemblyName 'System.ServiceProcess'
2[System.ServiceProcess.ServiceController]::GetServices() |
3Where-Object Name -eq BITS |
4Select-Object -Property *
The previous results should look familiar (they're the same results as Get-Service
).
We could use Get-CimInstance
or Get-WMIObject
to access WMI, specifically the Win32_Service
class to see the StartMode property and its value for the BITS service:
1Get-WmiObject -Class Win32_Service -Filter "Name = 'BITS'" |
2Select-Object -Property *
As you can see in the previous command, the StartMode for the BITS service is Manual.
I'm now going to change the StartMode for the BITS service to Automatic:
1Set-Service -Name BITS -StartupType Automatic
No error, but did the previous command do anything? You can make the previous command return the
service that was changed by adding the PassThru
parameter:
1Set-Service -Name BITS -StartupType Automatic -PassThru
I'll now double check to make sure the StartMode was indeed changed and this time I'll use the
Get-CimInstance
cmdlet which was introduced in PowerShell version 3 and can also be used to access
WMI:
1Get-CimInstance -ClassName Win32_Service -Filter "Name = 'BITS'" |
2Select-Object -Property Name, StartMode
µ