EFT-and-cloud-survey-finding.jpg

Werken met Windows-services in PowerShell

Werken met Windows-services in PowerShell


PowerShell helpt tijd vrij te maken door bepaalde servicebeheertaken over te nemen. Bekijk hier hoe u dergelijke tools kunt maken. 

Het stoppen, starten en opnieuw starten van Windows-services is een veelvoorkomende taak voor veel IT-professionals. We zijn allemaal gewend aan de algemene services MMC snapin waar we naar een service bladeren, met de rechtermuisknop op de service klikken, deze opnieuw starten of erop dubbelklikken en verschillende kenmerken van een service wijzigen. Als we wat tijd besparen, kunnen we zelfs verbinding maken met een externe computer in de services snapin en ze op die manier beheren, maar deze manier van werken met Windows-services wordt al snel lastig.

Het wordt oud en verspilt de kostbare tijd van een IT-professional door rond te klikken in een GUI bij het beheren van veel services! Gelukkig kunnen we met PowerShell tools bouwen om veel van deze servicebeheertaken voor ons uit te voeren .

 

PowerShell geeft ons enkele commands direct uit de doos om met Windows-services te werken.

PS> Get-Command -Noun Service

CommandType Name            Version Source             ----------- ---- ------- ------
Cmdlet      Get-Service     3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      New-Service     3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Restart-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Resume-Service  3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Set-Service     3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Start-Service   3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Stop-Service    3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Suspend-Service 3.1.0.0 Microsoft.PowerShell.Management

Een kijkje nemen met Get-Service

We kunnen deze ingebouwde opdrachten gebruiken om allerlei taken uit te voeren om ons leven in het servicebeheer gemakkelijker te maken. Misschien wil ik bijvoorbeeld op de een of andere manier de servicestatus van veel verschillende computers tegelijk uit Active Directory halen. Om een dergelijk hulpprogramma te maken, kan ik de Active Directory PowerShell-module gebruiken, de computers uit AD halen en die computernamen vervolgens invoeren in de opdracht Get-Service .

Lees: De PowerShell Test-NetConnection-cmdlet on Windows

$computers
= Get-AdComputer -Filter * | Select-Object -ExpandProperty Name
get-service -ComputerName $computers -Name wuauserv | Select-Object MachineName,Name,Status

MachineName Name      Status
----------- ----      ------
DC          wuauserv Running
CLIENT1     wuauserv Running

...

Nu wil ik misschien alle services op al die computers tegelijk opnieuw opstarten. Om dat te doen, kan ik de resultaten die ik zojuist heb gekregen rechtstreeks naar Restart-Service sturen.

Get-Service -ComputerName $computers -Name wuauserv | Restart-Service

We zouden dezelfde aanpak ook kunnen gebruiken voor het starten van diensten of het stoppen van diensten. In plaats van Restart-Service te gebruiken, had ik net zo goed Stop-Service of Start-Service kunnen gebruiken.

Dingen veranderen met Set-Service

Services kunnen ook worden gewijzigd met de opdracht Set-Service . Met de commad Set-Service kan ik dingen doen zoals de weergavenaam, het opstarttype of de beschrijving van een service wijzigen. Nogmaals, met behulp van de services die we eerder met Get-Service hebben verkregen, kan ik die services naar de opdracht Set-Service leiden om enkele verschillende acties uit te voeren.

## Change the display name for all wuauserv services to 'foo'
Get-Service -ComputerName $computers -Name wuauserv | Set-Service -DisplayName 'foo'

## Change the description to 'stuff'
Get-Service -ComputerName $computers -Name wuauserv | Set-Service -Description 'stuff'
'

Service credentials veranderen / service referenties wijzigen

U kunt zien dat zodra u de services kunt opvragen met Get-Service, zowat alles aan die services kan worden gedaan. Niet alles kan echter worden gedaan met de ingebouwde opdrachten. Het is bijvoorbeeld niet mogelijk om de gebruikersnaam en het wachtwoord waaronder een service wordt uitgevoerd, te wijzigen met behulp van een serviceopdracht. In plaats daarvan moeten we onze eigen methode maken met behulp van WMI. Als u service credentials wilt wijzigen, moeten we de service rechtstreeks uit WMI ophalen en er een .NET-methode op aanroepen om het serviceaccount te wijzigen. Hier is een uitstekend voorbeeld van hoe je dat kunt doen.

 

## Gather the username and password
$credential = Get-Credential

## Find the service to change
$params = @{
  'Namespace' = 'root\CIMV2'
  'Class' = 'Win32_Service'
  'Filter' = "DisplayName='App Service'"
}
$service = Get-WmiObject @params

## Make the change using the username and password
$service.Change($null,
  $null,
  $null,
  $null,
  $null,
  $null,
  $credential.UserName,
  $credential.GetNetworkCredential().Password,
  $null,
  $null,
  $null
)

 

Hoewel niet alles mogelijk is met behulp van de ingebouwde service-cmdlets, omdat PowerShell bovenop .NET is gebouwd, is zowat alles mogelijk als u weet waar u moet zoeken!

 


Comments
Comments are disabled in preview mode.