In some of my multi-part blog posts, I've examined some rather complex subjects such as Public Key Infrastructure (PKI) or various Exchange migration scenarios. In this post, I'd like to take a look at managing Windows services on Server 2012 R2. In particular, I noticed that there are (at least) three methods to manage services:
- Services.msc (GUI management console).
- sc.exe commands ("classic" command line).
- *-Service Powershell cmdlets: Get-Service, Set-Service, Stop-Service, Start-Service, etc..
The potential advantages of using Powershell rather than sc interests me in particular. For example, even though there are numerous Powershell cmdlets to manage network interfaces, it is my understanding that many administrators still prefer netsh.
Services.msc
I imagine that most Windows administrators are quite familiar with this interface with its four tabs.
Note: enter "services.msc" in the Start | Search box to open the console.
We can stop and start services (and more) by right-clicking on the service in question, in this case the Application Identity service:
I would wager over 90% of those reading this already know that but I'll compare this to the sc.exe and Powershell options later.
If we open the properties of a service, we have (as I wrote earlier) four tabs.
The general tab shows the names, description, start type and status of the service:
We can change the startup type and service status as needed.
Services "log on" and run under the credentials of an account, sometimes the Local System account or the Network Services account or a custom user account created in Active Directory with access to particular resources.
Under the Recovery tab, we configure behavior in case of failure of a service to start:
I do not believe I have ever needed to adjust the settings here but other admins may have had to.
Lastly, we can see service "dependencies" under the tab with the same name:
Basic service troubleshooting: if a service will not start, verify that the "pre-requisite" services are running first. In Microsoft Exchange, for example, if the Active Directory Topology Service is not running, many other Exchange services will simply refuse to start.
SC
SC is a command-line tool that manages services. If we enter...
sc
at the command prompt, a list of all the different commands will be displayed.
For example, sc query shows the status of a service. I'll use it to take a look at the Windows Remote Management service:
C:\>sc query winrm
SERVICE_NAME: winrm
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0sc
SC is a command-line tool that manages services. If we enter...
sc
at the command prompt, a list of all the different commands will be displayed.
For example, sc query shows the status of a service. I'll use it to take a look at the Windows Remote Management service:
C:\>sc query winrm
SERVICE_NAME: winrm
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0sc
Among other information, we can see that the service is running.
A similar command, "sc qc servicename" displays the configuration of a service. Once again, we'll use the WinRM service as an example:
C:\>sc qc winrm
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: winrm
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Windows\System32\svchost.exe -k NetworkService
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Windows Remote Management (WS-Management)
DEPENDENCIES : RPCSS
: HTTP
SERVICE_START_NAME : NT AUTHORITY\NetworkService
Here (above) we can see that the service is set to start automatically (AUTO_START).
A similar command, "sc qc servicename" displays the configuration of a service. Once again, we'll use the WinRM service as an example:
C:\>sc qc winrm
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: winrm
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Windows\System32\svchost.exe -k NetworkService
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Windows Remote Management (WS-Management)
DEPENDENCIES : RPCSS
: HTTP
SERVICE_START_NAME : NT AUTHORITY\NetworkService
Here (above) we can see that the service is set to start automatically (AUTO_START).
We can stop, start, pause and continue services with these SC commands (plus the name of the service of course):
sc stop
sc start
sc pause
sc continue
sc stop
sc start
sc pause
sc continue
We can configure the startup type as shown below. Note the space between the = sign and the start(up) type. I have edited out some data for readability (snips).
C:\>sc config AppIDSvc start= auto
[SC] ChangeServiceConfig SUCCESS
C:\>sc qc AppIDSvc
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: AppIDSvc
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
[snip]
C:\>sc config AppIDSvc start= demand
[SC] ChangeServiceConfig SUCCESS
C:\>
C:\>sc qc AppIDSvc
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: AppIDSvc
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
[snip]
Now let's look at the equivalent Powershell commands...
Powershell
We can see the various PowerShell cmdlets for managing services with this command:
PS C:\> Get-Command *service* | where { $_.CommandType -eq "Cmdlet" } | select name
Name
----
Get-Service
New-Service
Restart-Service
Resume-Service
Set-Service
Start-Service
Stop-Service
Suspend-Service
Note that "service" is always singular. The command also returns a "New-WebServiceProxy" that I have edited out for clarity.
As with the command "sc query", all services will be displayed if I enter...
Get-Service
It may be more useful to use Get-Service to find the name of the service (if you do not know it already) and then specify it like this (we'll use the WinRM service again).
PS C:\> Get-Service WinRM
Status Name DisplayName
------ ---- -----------
Running WinRM Windows Remote Management (WS-Manag...
Get-Service provides fewer details than SC QUERY but we can obtain more with the format-list cmdlet (fl for short):
PS C:\> Get-Service WinRM | fl
Name : WinRM
DisplayName : Windows Remote Management (WS-Management)
Status : Running
DependentServices : {}
ServicesDependedOn : {RPCSS, HTTP}
CanPauseAndContinue : False
CanShutdown : True
CanStop : True
ServiceType : Win32ShareProcess
This is quite comparable to the SC QUERY output and perhaps more readable.
Stopping and starting a service (or suspending and resuming) with the PowerShell cmdlets is very straight-forward:
PS C:\> Stop-Service WinRM
PS C:\> Get-Service WinRM | fl name,status
Name : WinRM
Status : Stopped
PS C:\> Start-Service WinRM
PS C:\> Get-Service WinRM | fl name,status
Name : WinRM
Status : Running
But what about the startup type of a service? You may have noticed that Get-Service does not display this property. You may recall that SC QUERY did not show this either (see above). We had to use SC QC.
It may seem strange that we can configure the startup type of a service with the Set-Service cmdlet (we'll see that in a moment) but cannot see the current status with Get-Service.
Instead, we have to use the cmdlet Get-Wmiobject win32_service:
PS C:\> Get-Wmiobject win32_service -filter "name = 'WinRM'"
ExitCode : 0
Name : WinRM
ProcessId : 888
StartMode : Auto
State : Running
Status : OK
You are welcome to experiment but I found that the syntax must be exactly as indicated. None of these options will work:
get-wmiobject win32_service WinRM
get-wmiobject win32_service -name WinRM
get-wmiobject win32_service -filter "name=WinRM"
get-wmiobject win32_service -filter "name = WinRM"
This was the most concise variant of the cmdlet that would function:
PS C:\> gwmi win32_service -f "name='WinRM'"
Note that...
- gwmi is the alias of Get-WmiObject
- We use win32_service even with a x64 operating system. win64_service is not a valid wmi class.
- We may place a space before and after the = sign for the filter or simply omit these spaces.
Now we'll change the startup type (simply to illustrate the procedure) and then change it back to the original settings.
PS C:\> Set-Service WinRM -StartupType Manual
PS C:\>
PS C:\> gwmi win32_service -f "name='WinRM'"
ExitCode : 0
Name : WinRM
ProcessId : 888
StartMode : Manual
State : Running
Status : OK
PS C:\> Set-Service WinRM -StartupType Auto
PS C:\>
PS C:\> gwmi win32_service -f "name='WinRM'"
ExitCode : 0
Name : WinRM
ProcessId : 888
StartMode : Auto
State : Running
Status : OK
***
And that will be all for this post on managing services with either the Services management console, the SC commands or the PowerShell cmdlets.
One word of caution!
Many services are essential for the proper functioning of the operating system. Changing the startup type of certain services could prevent the OS from starting correctly (or at all).
Common sense would dictate that we do not experiment with these commands on production computers.
Thank you for reading the article about Windows Server 2012 - Services on the blog NEW TECH If you want to disseminate this article on please list the link as the source, and if this article was helpful please bookmark this page in your web browser by pressing Ctrl + D on your keyboard keys.