Search code examples
powershellservicecredentials

Switch service running state using powershell (using UAC prompts)



$serviceName = "wsearch"
$isRunning = Get-Service | Where-Object {$_.Status -eq "Running" -and $_.Name -eq $serviceName}
$isStopped = Get-Service | Where-Object {$_.Status -eq "Stopped" -and $_.Name -eq $serviceName}

if ($isStopped) {
   Start-Service -InputObject $isStopped
   Start-Sleep -s 10
}

if ($isRunning) {
   Stop-Service -InputObject $isRunning
   Start-Sleep -s 10
}

I want to run this script, but I don't want to set Administrator execution policy (which is set to max restrictive), while regular user policy is lax.

I want to run the script as a regular user and trigger the UAC prompt for each command (akin to -Verb RunAs), however, Start-Service does not accept this parameter.

I guess I can run a Start-Process "sc" but that defeats the purpose of powershell.

The ultimate goal of the script is to swtich the state of a service based on the current running state.


Solution

  • There is no way to run one-off commands elevated (as admin) in a non-elevated powershell session. This would be similar to 'sudo' in Linux which just doesn't exist in the Windows world. Instead you could use something like the following to start a powershell session as administrator and run the commands there. You are not limited to calling 'sc'

    Start-Process -Verb RunAs -FilePath 'powershell' -Arguments '-Command <your commands>' 
    

    To run a powershell script with elevated privileges you could substitute -Command for -File (but -Command <path to file> will also work)

    Start-Process -Verb RunAs -FilePath 'powershell' -Arguments '-File <path to script>'