You can also use the built-in command sc.exe to grant permissions to users or groups to be able to stop and start a specific service. The general steps are as follows:
- Get the user or group SID.
- Get the current permissions that are set on the service.
- Append the new permissions to the existing ones and apply them.
Below is a batch file that automates these tasks. Just make sure you replace the values in the following variable to match your environment:
Set "$ServiceName=TestService"
Set "$UserName=TestUser"
Set "$UserDomain=MyDomain"
Echo Off & Cls
SetLocal EnableExtensions EnableDelayedExpansion
Set "$ServiceName=TestService"
Set "$UserName=TestUser"
Set "$UserDomain=MyDomain"
Set "$ExitCode=-1"
Call :GetUserSID "!$UserDomain!" "!$UserName!" && (
Call :ServiceGetPermissions "!$ServiceName!" && (
Set "$ServicePermissions=!$ServicePermissions:)S:(=)@:(!"
For /f "Tokens=1 Delims=@" %%x In ("!$ServicePermissions!") Do Set "$ServicePermissions=%%x"
Set "$ServicePermissions=!$ServicePermissions!(A;;RPWPCR;;;!$UserSID!)"
Call :ServiceSetPermissions "!$ServiceName!" "!$ServicePermissions!" && Set "$ExitCode=0" || Set "$ExitCode=3"
) || (
Set "$ExitCode=2"
)
) || (
Set "$ExitCode=1"
)
Exit /b !$ExitCode!
:GetUserSID <UserDomain> <UserAccount>
:-------------------------------------
Set "#GetUserSID=-1"
Set "#UserDomain=%~1"
Set "#UserAccount=%~2"
Set "$UserSID="
For /f "Skip=1 Tokens=1" %%x In ('2^>Nul wmic.exe UserAccount Where ^(Name^="!#UserAccount!" And Domain^="!#UserDomain!"^) Get SID') Do (
If Not Defined $UserSID Set "$UserSID=%%x"
If /I Not "!$UserSID:~0,6!"=="S-1-5-" Set "$UserSID="
)
If Defined $UserSID Set "#GetUserSID=0" Else Set #GetUserSID=2"
Exit /b !#GetUserSID!
:ServiceGetPermissions <ServiceName>
:-----------------------------------
Set "#ServiceGetPermissions=-1"
Set "#ServiceName=%~1"
Set "$ServicePermissions="
For /f "Skip=1 Tokens=1" %%x In ('2^>Nul sc.exe sdshow "!#ServiceName!"') Do Set "$ServicePermissions=%%x"
If Defined $ServicePermissions Set "#ServiceGetPermissions=0" Else Set "#ServiceGetPermissions=3"
Exit /b !#ServiceGetPermissions!
:ServiceSetPermissions <ServiceName> <ServicePermissions>
:--------------------------------------------------------
Set "#ServiceSetPermissions=-1"
Set "#ServiceName=%~1"
Set "#ServicePermissions=%~2"
>Nul 2>&1 sc.exe sdset "!#ServiceName!" "!#ServicePermissions!" && Set "#ServiceSetPermissions=0" || Set "#ServiceSetPermissions=5"
Exit /b !#ServiceSetPermissions!