Gosto muito de trabalhar com Powershell. Não fiz muitas coisas ainda, mas o que eu fiz tem sido bem divertido.

Uso muito para automatizar pequenas tarefas que demoram para executar. Vou mostrar hoje um arquivo .ps1 que você pode criar para solicitar o início ou a parada de um serviço NT. Para ajudar, ele vai usar alguns scripts de elevação (para o Vista) publicados na MSDN Magazine americana ano passado, na edição de Junho. Se você resolver por para rodar o script que está aqui, vai precisar dele. Coloquei a elevação para que o script possa rodar, já que no Windows Vista não dá para parar ou iniciar serviços sem elevar. Ver o status de um serviço é possível, e por isso não solicito elevação nesse caso.

Para iniciar ou parar um serviço, é só chamar o nome do script, seguido do nome do serviço (se estiver parado ele inicia e vice-versa):
Servico.ps1 MSSQLSERVER

Para parar é só chamar com parâmetro off:
Servico.ps1 MSSQLSERVER off

Para iniciar é só chamar com parâmetro on:
Servico.ps1 MSSQLSERVER on

Para saber o status é só chamar com parâmetro query:
Servico.ps1 MSSQLSERVER query

Você vai precisar assinar o script para rodar. Para isso, veja as instruções no próprio Powershell:
get-help about_signing

Se tiverem problema para assinar me digam que posto aqui como fazer.

Vejam o script comentado:

#variáveis

$ligar = $FALSE

$desligar = $FALSE

$query = $FALSE

$Acao = $Args[1]

$servico = $Args[0] #”MSSQLSERVER”

 

#se o parametro não foi passado, exibe o funcionamento:

if ($servico -eq $null)

{

      Write-Host “O serviço não foi especificado.” `

      -ForegroundColor DarkRed

      “Para rodar este script chame o nome do arquivo `

      PS1 (Servico.ps1), mais o nome do serviço `

      (por exemplo, “”MSSQLSERVER””). “

      “”

      “Por exemplo:”

      “Servico.ps1 MSSQLSERVER”    

      “Você també pode especificar se quer iniciar o serviço:”

      “Servico.ps1 MSSQLSERVER on”

      “”

      “Desligar o serviço:”

      “Servico.ps1 MSSQLSERVER off”

      “”

      “Ou somente saber se ele está rodando:”

      “Servico.ps1 MSSQLSERVER query”    

      “”

      return

}

 

#se não há ação verifica se o serviço está ligado,

#se estiver desliga e vice-versa

if ($Acao -eq $null)

{

      #verificando se está ligado

      if ((Get-Service $servico).STATUS -eq “Stopped”)

      {

            $ligar = $TRUE

      }    

      else

      {

            $desligar = $TRUE

      }

}

else

{

      #se for parâmetro de query, anota:

      if (($Acao.ToString().ToUpper() -eq “QUERY”) `

            -or ($Acao.ToString().ToUpper() -eq “Q”))

      {

            $query = $TRUE

      }

      else

      {

            #se for para ligar, anota:

            if (($Acao.ToString().ToUpper() -eq “ON”) `

                  -or ($Args[0] -eq “1”))

            {

                  $ligar = $TRUE

            }

            else

            {

                  $desligar = $TRUE

            }

      }    

}

 

if ($ligar)

{

      #inicia o serviço, se der pau, guarda

      Start-Service $servico -ErrorAction silentlycontinue `

            -ErrorVariable erro

 

      if ($erro -ne $null)

      {

            if ($erro[0].ToString().Contains(“Cannot open “ `

                  +  $servico + ” service on computer”))

            {

                  #se por causa da elevação, então eleva:

                  Write-Host “Não está elevado.” `

                        -ForegroundColor DarkRed

                  elevate powershell -command `

                        “C:\users\giovanni\desktop\teste.ps1” $Args

                  return

            }          

      }    

     

      #msg de ok:

      Write-Host “O serviço $servico foi ligado.” `

            -ForegroundColor Blue

      Read-Host “Clique para continuar”

}

if ($desligar)

{

      #para o serviço, se der pau, guarda

      Stop-Service $servico -Force -ErrorAction `

            silentlycontinue -ErrorVariable erro

     

      if ($erro -ne $null)

      {

            if ($erro[0].ToString().Contains(“Cannot open “ +  `

                  $servico + ” service on computer”))

            {

                  #se por causa da elevação, então eleva:

                  Write-Host “Não está elevado.” `

                        -ForegroundColor DarkRed

                  elevate powershell -command `

                        “C:\users\giovanni\desktop\teste.ps1” $Args

                  return

            }          

      }    

      #msg de ok

      Write-Host “O serviço $servico foi desligado.” `

            -ForegroundColor Blue

      Read-Host “Clique para continuar”

}

#verificando se o serviço está rodando:

if ($query)

{

      if ((Get-Service $servico).STATUS -eq “Stopped”)

      {

            Write-Host “O serviço $servico está desligado.” `

                  -ForegroundColor Blue

      }    

      else

      {

            Write-Host “O serviço $servico está ligado.” `

                  -ForegroundColor Blue        

      }    

}

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.