Sdílet prostřednictvím


Kapitola 8 – Vzdálená správa PowerShellu

PowerShell nabízí několik způsobů spouštění příkazů na vzdálených počítačích. V poslední kapitole jste prozkoumali, jak vzdáleně dotazovat rozhraní WMI pomocí rutin CIM. PowerShell obsahuje také několik rutin, které obsahují integrovaný parametr ComputerName .

Jak je znázorněno v následujícím příkladu, můžete použít Get-Command s parametrem ParameterName k identifikaci rutin, které obsahují parametr ComputerName .

Get-Command -ParameterName ComputerName
CommandType Name              Version Source                         
----------- ----              ------- ------                         
Cmdlet      Add-Computer      3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Clear-EventLog    3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Connect-PSSession 3.0.0.0 Microsoft.PowerShell.Core      
Cmdlet      Enter-PSSession   3.0.0.0 Microsoft.PowerShell.Core      
Cmdlet      Get-EventLog      3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Get-HotFix        3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Get-Process       3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Get-PSSession     3.0.0.0 Microsoft.PowerShell.Core      
Cmdlet      Get-Service       3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Get-WmiObject     3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Invoke-Command    3.0.0.0 Microsoft.PowerShell.Core      
Cmdlet      Invoke-WmiMethod  3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Limit-EventLog    3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      New-EventLog      3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      New-PSSession     3.0.0.0 Microsoft.PowerShell.Core      
Cmdlet      Receive-Job       3.0.0.0 Microsoft.PowerShell.Core      
Cmdlet      Receive-PSSession 3.0.0.0 Microsoft.PowerShell.Core      
Cmdlet      Register-WmiEvent 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Remove-Computer   3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Remove-EventLog   3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Remove-PSSession  3.0.0.0 Microsoft.PowerShell.Core      
Cmdlet      Remove-WmiObject  3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Rename-Computer   3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Restart-Computer  3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Send-MailMessage  3.1.0.0 Microsoft.PowerShell.Utility   
Cmdlet      Set-Service       3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Set-WmiInstance   3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Show-EventLog     3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Stop-Computer     3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Test-Connection   3.1.0.0 Microsoft.PowerShell.Management
Cmdlet      Write-EventLog    3.1.0.0 Microsoft.PowerShell.Management

Příkazy, jako je Get-Process a Get-HotFix, zahrnují parametr ComputerName, avšak tento přístup není dlouhodobým směrem doporučeným Microsoftem pro spouštění příkazů na vzdálených systémech. I když najdete příkaz s parametrem ComputerName , často chybí parametr Credential , což ztěžuje zadání alternativních přihlašovacích údajů. Spuštění PowerShellu z relace s administrátorskými právy nezaručuje úspěch, protože síťový firewall může blokovat požadavek mezi vaším systémem a vzdáleným počítačem.

Pokud chcete použít příkazy vzdálené komunikace PowerShellu, které jsou znázorněny v této kapitole, musí být vzdálená komunikace PowerShellu povolená na vzdáleném počítači. Můžete ho povolit spuštěním rutiny Enable-PSRemoting .

Enable-PSRemoting
WinRM has been updated to receive requests.
WinRM service type changed successfully.
WinRM service started.

WinRM has been updated for remote management.
WinRM firewall exception enabled.

Komunikace 1:1

Pokud chcete interaktivní vzdálenou relaci, vzdálená komunikace 1:1 je to, co chcete. Tento typ vzdálené komunikace se poskytuje prostřednictvím cmdletu Enter-PSSession.

Uložte přihlašovací údaje správce domény do $Cred proměnné. Tento přístup umožňuje zadat přihlašovací údaje jednou a znovu je použít pro jednotlivé příkazy, pokud vaše aktuální relace PowerShellu zůstane aktivní.

$Cred = Get-Credential

Vytvořte relaci vzdálené komunikace PowerShellu 1:1 s řadičem domény dc01.

Enter-PSSession -ComputerName dc01 -Credential $Cred

Všimněte si, že před výzvou PowerShellu je [dc01]. Tato předpona označuje, že jste v interaktivní relaci se vzdáleným počítačem dc01. Všechny příkazy, které teď spustíte na dc01, ne na místním počítači.

[dc01]: PS C:\Users\Administrator\Documents>

Mějte na paměti, že ke vzdáleným počítačům máte přístup jenom k příkazům a modulům PowerShellu. Pokud jste nainstalovali další moduly místně, nejsou ve vzdálené relaci k dispozici.

Když je připojená prostřednictvím relace interaktivní komunikace 1:1, je to jako kdybyste seděli přímo na vzdáleném počítači.

[dc01]: Get-Process | Get-Member
   TypeName: System.Diagnostics.Process

Name                       MemberType     Definition
----                       ----------     ----------
Handles                    AliasProperty  Handles = Handlecount
Name                       AliasProperty  Name = ProcessName
NPM                        AliasProperty  NPM = NonpagedSystemMemorySize64
PM                         AliasProperty  PM = PagedMemorySize64
SI                         AliasProperty  SI = SessionId
VM                         AliasProperty  VM = VirtualMemorySize64
WS                         AliasProperty  WS = WorkingSet64
Disposed                   Event          System.EventHandler Disposed(Sy...
ErrorDataReceived          Event          System.Diagnostics.DataReceived...
Exited                     Event          System.EventHandler Exited(Syst...
OutputDataReceived         Event          System.Diagnostics.DataReceived...
BeginErrorReadLine         Method         void BeginErrorReadLine()
BeginOutputReadLine        Method         void BeginOutputReadLine()
CancelErrorRead            Method         void CancelErrorRead()
CancelOutputRead           Method         void CancelOutputRead()
Close                      Method         void Close()
CloseMainWindow            Method         bool CloseMainWindow()
CreateObjRef               Method         System.Runtime.Remoting.ObjRef ...
Dispose                    Method         void Dispose(), void IDisposabl...
Equals                     Method         bool Equals(System.Object obj)
GetHashCode                Method         int GetHashCode()
GetLifetimeService         Method         System.Object GetLifetimeService()
GetType                    Method         type GetType()
InitializeLifetimeService  Method         System.Object InitializeLifetim...
Kill                       Method         void Kill()
Refresh                    Method         void Refresh()
Start                      Method         bool Start()
ToString                   Method         string ToString()
WaitForExit                Method         bool WaitForExit(int millisecon...
WaitForInputIdle           Method         bool WaitForInputIdle(int milli...
__NounName                 NoteProperty   string __NounName=Process
BasePriority               Property       int BasePriority {get;}
Container                  Property       System.ComponentModel.IContaine...
EnableRaisingEvents        Property       bool EnableRaisingEvents {get;s...
ExitCode                   Property       int ExitCode {get;}
ExitTime                   Property       datetime ExitTime {get;}
Handle                     Property       System.IntPtr Handle {get;}
HandleCount                Property       int HandleCount {get;}
HasExited                  Property       bool HasExited {get;}
Id                         Property       int Id {get;}
MachineName                Property       string MachineName {get;}
MainModule                 Property       System.Diagnostics.ProcessModul...
MainWindowHandle           Property       System.IntPtr MainWindowHandle ...
MainWindowTitle            Property       string MainWindowTitle {get;}
MaxWorkingSet              Property       System.IntPtr MaxWorkingSet {ge...
MinWorkingSet              Property       System.IntPtr MinWorkingSet {ge...
Modules                    Property       System.Diagnostics.ProcessModul...
NonpagedSystemMemorySize   Property       int NonpagedSystemMemorySize {g...
NonpagedSystemMemorySize64 Property       long NonpagedSystemMemorySize64...
PagedMemorySize            Property       int PagedMemorySize {get;}
PagedMemorySize64          Property       long PagedMemorySize64 {get;}
PagedSystemMemorySize      Property       int PagedSystemMemorySize {get;}
PagedSystemMemorySize64    Property       long PagedSystemMemorySize64 {g...
PeakPagedMemorySize        Property       int PeakPagedMemorySize {get;}
PeakPagedMemorySize64      Property       long PeakPagedMemorySize64 {get;}
PeakVirtualMemorySize      Property       int PeakVirtualMemorySize {get;}
PeakVirtualMemorySize64    Property       long PeakVirtualMemorySize64 {g...
PeakWorkingSet             Property       int PeakWorkingSet {get;}
PeakWorkingSet64           Property       long PeakWorkingSet64 {get;}
PriorityBoostEnabled       Property       bool PriorityBoostEnabled {get;...
PriorityClass              Property       System.Diagnostics.ProcessPrior...
PrivateMemorySize          Property       int PrivateMemorySize {get;}
PrivateMemorySize64        Property       long PrivateMemorySize64 {get;}
PrivilegedProcessorTime    Property       timespan PrivilegedProcessorTim...
ProcessName                Property       string ProcessName {get;}
ProcessorAffinity          Property       System.IntPtr ProcessorAffinity...
Responding                 Property       bool Responding {get;}
SafeHandle                 Property       Microsoft.Win32.SafeHandles.Saf...
SessionId                  Property       int SessionId {get;}
Site                       Property       System.ComponentModel.ISite Sit...
StandardError              Property       System.IO.StreamReader Standard...
StandardInput              Property       System.IO.StreamWriter Standard...
StandardOutput             Property       System.IO.StreamReader Standard...
StartInfo                  Property       System.Diagnostics.ProcessStart...
StartTime                  Property       datetime StartTime {get;}
SynchronizingObject        Property       System.ComponentModel.ISynchron...
Threads                    Property       System.Diagnostics.ProcessThrea...
TotalProcessorTime         Property       timespan TotalProcessorTime {get;}
UserProcessorTime          Property       timespan UserProcessorTime {get;}
VirtualMemorySize          Property       int VirtualMemorySize {get;}
VirtualMemorySize64        Property       long VirtualMemorySize64 {get;}
WorkingSet                 Property       int WorkingSet {get;}
WorkingSet64               Property       long WorkingSet64 {get;}
PSConfiguration            PropertySet    PSConfiguration {Name, Id, Prio...
PSResources                PropertySet    PSResources {Name, Id, Handleco...
Company                    ScriptProperty System.Object Company {get=$thi...
CPU                        ScriptProperty System.Object CPU {get=$this.To...
Description                ScriptProperty System.Object Description {get=...
FileVersion                ScriptProperty System.Object FileVersion {get=...
Path                       ScriptProperty System.Object Path {get=$this.M...
Product                    ScriptProperty System.Object Product {get=$thi...
ProductVersion             ScriptProperty System.Object ProductVersion {g...

Po dokončení práce se vzdáleným počítačem spusťte Exit-PSSession příkaz pro ukončení vzdálené relace.

[dc01]:  Exit-PSSession

Vzdálené ovládání 1:N

I když občas potřebujete provádět úlohy interaktivně na vzdáleném počítači, vzdálené komunikace PowerShellu se stává výkonnější, když současně spouštíte příkazy ve více vzdálených systémech. Pomocí rutiny cmdlet můžete současně spouštět příkazy na jednom nebo více vzdálených počítačích.

V následujícím příkladu se dotazujete na tři servery pro stav služby Windows Time. Rutina Get-Service se zařadí do bloku skriptu Invoke-Command, což znamená, že se spustí na každém vzdáleném počítači.

Invoke-Command -ComputerName dc01, sql02, web01 {
    Get-Service -Name W32time
} -Credential $Cred

Výsledky jsou vráceny do vaší místní relace jako deserializované objekty.

Status   Name        DisplayName       PSComputerName
------   ----        -----------       --------------
Running  W32time     Windows Time      web01
Start... W32time     Windows Time      dc01
Running  W32time     Windows Time      sql02

Chcete-li potvrdit, že vrácené objekty jsou deserializovány, předejte výstup do Get-Member.

Invoke-Command -ComputerName dc01, sql02, web01 {
    Get-Service -Name W32time
} -Credential $Cred | Get-Member
   TypeName: Deserialized.System.ServiceProcess.ServiceController

Name                MemberType   Definition
----                ----------   ----------
GetType             Method       type GetType()
ToString            Method       string ToString(), string ToString(strin...
Name                NoteProperty string Name=W32time
PSComputerName      NoteProperty string PSComputerName=dc01
PSShowComputerName  NoteProperty bool PSShowComputerName=True
RequiredServices    NoteProperty Deserialized.System.ServiceProcess.Servi...
RunspaceId          NoteProperty guid RunspaceId=5ed06925-8037-43ef-9072-...
CanPauseAndContinue Property     System.Boolean {get;set;}
CanShutdown         Property     System.Boolean {get;set;}
CanStop             Property     System.Boolean {get;set;}
Container           Property      {get;set;}
DependentServices   Property     Deserialized.System.ServiceProcess.Servi...
DisplayName         Property     System.String {get;set;}
MachineName         Property     System.String {get;set;}
ServiceHandle       Property     System.String {get;set;}
ServiceName         Property     System.String {get;set;}
ServicesDependedOn  Property     Deserialized.System.ServiceProcess.Servi...
ServiceType         Property     System.String {get;set;}
Site                Property      {get;set;}
StartType           Property     System.String {get;set;}
Status              Property     System.String {get;set;}

Všimněte si, že většina metod chybí u deserializovaných objektů. Metody chybí, protože tyto objekty nejsou aktivní. Při spuštění příkazu na vzdáleném počítači se jedná o inertní snímky stavu objektu. Nemůžete například spustit nebo zastavit službu pomocí deserializovaného objektu, protože už nemá přístup k požadovaným metodám.

To ale neznamená, že nemůžete používat metody jako Stop() u Invoke-Command. Klíčem je, že musíte volat metodu v rámci vzdálené relace.

Chcete-li předvést, zastavte službu Windows Time na všech třech vzdálených serverech voláním Stop() metody vzdáleně.

Invoke-Command -ComputerName dc01, sql02, web01 {
    (Get-Service -Name W32time).Stop()
} -Credential $Cred

Invoke-Command -ComputerName dc01, sql02, web01 {
    Get-Service -Name W32time
} -Credential $Cred
Status   Name        DisplayName       PSComputerName
------   ----        -----------       --------------
Stopped  W32time     Windows Time      web01
Stopped  W32time     Windows Time      dc01
Stopped  W32time     Windows Time      sql02

Jak je uvedeno v předchozí kapitole, pokud je k dispozici rutina pro provedení úkolu, je vhodnější ji použít místo přímého volání metody. Například pomocí rutiny Stop-Service místo Stop() metody zastavte službu.

V předchozím příkladu Stop() se metoda používá k vytvoření bodu. Někteří lidé se omylem domnívají, že nemůžete používat metody se vzdálené komunikace PowerShellu. I když je pravda, že nemůžete volat metody pro deserializované objekty vrácené do místní relace, můžete je však vyvolat v rámci vzdálené relace.

Sezení PowerShellu

V posledním příkladu z předchozí části jste pomocí rutiny Invoke-Command spustili dva příkazy. Tento scénář způsobil vytvoření dvou samostatných relací, které byly poté zrušeny. Jeden pro každý příkaz.

Podobně jako relace CIM, trvalá relace PowerShellu umožňuje spouštět více příkazů na vzdáleném počítači bez nutnosti vytvářet novou relaci pro každý příkaz.

Vytvořte relaci PowerShellu pro každý ze tří počítačů, se kterými pracujete v této kapitole, DC01, SQL02 a WEB01.

$Session = New-PSSession -ComputerName dc01, sql02, web01 -Credential $Cred

Teď pomocí $Session proměnné spusťte službu Windows Time voláním její metody a pak ověřte stav služby.

Invoke-Command -Session $Session {(Get-Service -Name W32time).Start()}
Invoke-Command -Session $Session {Get-Service -Name W32time}
Status   Name        DisplayName       PSComputerName
------   ----        -----------       --------------
Running  W32time     Windows Time      web01
Start... W32time     Windows Time      dc01
Running  W32time     Windows Time      sql02

Po vytvoření relace s alternativními přihlašovacími údaji nemusíte tyto přihlašovací údaje pro každý příkaz zadávat znovu.

Po dokončení používání relací nezapomeňte relace odebrat.

Get-PSSession | Remove-PSSession

Shrnutí

V této kapitole jste se seznámili se základy vzdálené správy PowerShellu, včetně interaktivního spouštění příkazů na jednom vzdáleném počítači a spouštění příkazů napříč několika systémy pomocí vzdálené správy typu jedna ku mnoha. Prozkoumali jste také výhody používání trvalých relací PowerShellu při spouštění více příkazů na stejném vzdáleném počítači.

Přezkoumání

  1. Jak povolíte vzdálenou správu PowerShellu?
  2. Jaký příkaz PowerShellu používáte ke spuštění interaktivní relace se vzdáleným počítačem?
  3. Jakou výhodu je použití relace vzdálené komunikace PowerShellu místo zadávání názvu počítače pomocí každého příkazu?
  4. Můžete použít relaci PowerShellu ve scénáři interaktivní vzdálené správy 1:1?
  5. Jaký je rozdíl mezi objekty vrácenými rutinami místně a objekty vrácené při spuštění stejných rutin na vzdálených počítačích pomocí Invoke-Command?

Odkazy