Rendszerszolgáltatások

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

Szolgáltatások Startup tulajdonsága

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



Word To HTML Converter