Nézzük meg most azt, hogy a rendszerfolyamatokkal kapcsolatosan milyen cmdletek állnak rendelkezésünkre:
[76] PS C:\> Get-Command -noun service
CommandType Name Definition
----------- ---- ----------
Cmdlet Get-Service Get-Service [[-Name] <Strin...
Cmdlet New-Service New-Service [-Name] <String...
Cmdlet Restart-Service Restart-Service [-Name] <St...
Cmdlet Resume-Service Resume-Service [-Name] <Str...
Cmdlet Set-Service Set-Service [-Name] <String...
Cmdlet Start-Service Start-Service [-Name] <Stri...
Cmdlet Stop-Service Stop-Service [-Name] <Strin...
Cmdlet Suspend-Service Suspend-Service [-Name] <St...
Például nézzük, hogy hogyan tudnánk leállítani a gépünkön az összes leállítható szolgáltatást! Először is kérnünk kell egy listát a szolgáltatásokról, és ki kell válogatnunk közülük azokat, amelyek leállíthatók, vagyis a CanStop tulajdonságuk „igaz” értéket ad vissza:
[4] PS C:\> get-service | where-object {$_.CanStop}
Status Name DisplayName
------ ---- -----------
Running ADWS Active Directory Web Services
Running Appinfo Application Information
Running BFE Base Filtering Engine
Running CertPropSvc Certificate Propagation
...
A kiírt táblázatban nem szerepel a CanStop érték, így ha nem vagyunk biztosak a dolgunkban, érdemes lehet egy olyan listát kérni, amelyben saját szemünkkel is meggyőződhetünk a helyes eredményről:
[6] PS C:\> get-service | where-object {$_.CanStop} | format-table name, cansto
p -autosize
Name CanStop
---- -------
ADWS True
Appinfo True
BFE True
CertPropSvc True
...
Ezután már csak végig kell lépkednünk a gyűjtemény valamennyi elemén, és mindegyikre meghívni a Stop-Service cmdletet:
PS C:\> get-service | where-object {$_.CanStop} | Stop-Service
Vigyázat! A szolgáltatások leállítása után valószínűleg újra kell indítanunk a számítógépet, mert olyannyira leállítottunk mindent, hogy mi sem igazán fogunk tudni dolgozni.
Érdekes módon, a Get-Service támogatja a távoli gépek rendszerszolgáltatásainak lekérdezését a Computername paraméter megadásával, de a Start-Service és Stop‑Service nem. Természetesen ezt is megtehetjük, ha használjuk a PowerShell vagy a WMI távoli futtatási lehetőségeit, használatukkal lekérdezhetők és felügyelhetők a távoli gépeken futó folyamatok és szolgáltatások is.
[11] PS C:\> Invoke-Command -ComputerName member -ScriptBlock {start-service au
diosrv}
A fenti példában az Invoke-Command cmdletet alkalmaztam. Nézzünk egy WMI-s megoldást is:
[13] PS C:\> Get-WmiObject -ComputerName member -Class win32_service -Filter "n
ame = 'audiosrv'" | Invoke-WmiMethod -Name StopService
__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ReturnValue : 0
Ha már get-service , akkor nézzük meg, hogy az előbb látott hasznos CanStop tulajdonság mellett, vajon van-e StartupType, vagy valami hasonló tulajdonsága a szolgáltatás-objektumoknak? Nézzük meg a tulajdonság jellegű tagjellemzőket:
[15] PS C:\> get-service audiosrv | get-member -MemberType properties
TypeName: System.ServiceProcess.ServiceController
Name MemberType Definition
---- ---------- ----------
Name AliasProperty Name = ServiceName
RequiredServices AliasProperty RequiredServices = ServicesDependedOn
CanPauseAndContinue Property System.Boolean CanPauseAndContinue {get;}
CanShutdown Property System.Boolean CanShutdown {get;}
CanStop Property System.Boolean CanStop {get;}
Container Property System.ComponentModel.IContainer Containe...
DependentServices Property System.ServiceProcess.ServiceController[]...
DisplayName Property System.String DisplayName {get;set;}
MachineName Property System.String MachineName {get;set;}
ServiceHandle Property System.Runtime.InteropServices.SafeHandle...
ServiceName Property System.String ServiceName {get;set;}
ServicesDependedOn Property System.ServiceProcess.ServiceController[]...
ServiceType Property System.ServiceProcess.ServiceType Service...
Site Property System.ComponentModel.ISite Site {get;set;}
Status Property System.ServiceProcess.ServiceControllerSt...
Engem igazából az indulási állapot érdekelne (Automatic, Manual, Disabled). Nézzük meg, hogy pl. a sokat sejtető ServiceType vajon ezt rejti-e?
[18] PS C:\> get-service audiosrv | Format-Table -Property Name, Status, Servic
eType -auto
Name Status ServiceType
---- ------ -----------
audiosrv Stopped Win32ShareProcess
Sajnos nem. Hát ez bosszantó! Annál is inkább, mert a set-service cmdlet vidáman tartalmaz erre a tulajdonságra vonatkozó beállítási lehetőséget:
[19] PS C:\> get-help Set-Service
NAME
Set-Service
SYNOPSIS
Starts, stops, and suspends a service, and changes its properties.
SYNTAX
Set-Service [-Name] <string> [-Description <string>] [-DisplayName <string
>] [-PassThru] [-StartupType {Automatic | Manual | Disabled}] [-Status <st
ring>] [-ComputerName <string[]>] [-Confirm] [-WhatIf] [<CommonParameters>
]
Set-Service [-Description <string>] [-DisplayName <string>] [-InputObject
<ServiceController>] [-PassThru] [-StartupType {Automatic | Manual | Disab
led}] [-Status <string>] [-ComputerName <string[]>] [-Confirm] [-WhatIf] [
<CommonParameters>]
...
Na de WMI-ből a StartupType adathoz is hozzáférhetünk, ugyan ott StartMode-nak hívják:
PS I:\> $service=[WMI]
"Win32_Service.Name=""Alerter"""
PS I:\> $service.StartMode
Disabled
Hogyan lehetne azt elérni, hogy ne kelljen két menetben kiszedni egy szolgáltatás adatait (egy get-service PowerShell cmdlet és egy WMI lekérdezés), hanem valahogy ezeket egyben látni? Szerencsére a PowerShell annyira rugalmas, hogy még ezt is meg lehet tenni az 1.9.2 Osztályok (típusok) testre szabása fejezetben látott módon, types.ps1xml fájl létrehozásával.
Létrehoztam egy soost.service.ps1xml fájlt ugyanazon elérési úton, mint ahol az eredeti types.ps1xml is van.
<Types>
<Type>
<Name>System.ServiceProcess.ServiceController</Name>
<Members>
<ScriptProperty>
<Name>StartupType</Name>
<GetScriptBlock>
([Wmi] "Win32_Service.Name=""$($this.Name)""").StartMode
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
A szerkezet majdnem magáért beszél. Egyrészt a "GetScriptBlock" szorul magyarázatra. Általában egy tulajdonságot kiolvashatunk, esetleg értéket is adhatunk neki. Én itt ebben a fájlban csak kiolvasási viselkedését definiáltam, az értékadásit nem. (Az egyébként a SetScriptBlock lenne.) Másrészt itt nem $_ változóval hivatkozunk magunkra, hanem a $this változóval.
Most már csak be kell etetni a rendszerbe az én típusmódosításomat és már nézhetjük is az eredményt:
PS C:\> Update-TypeData soost.service.ps1xml
PS C:\> (Get-Service alerter).StartupType
Disabled