Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Program PowerShell oferuje kilka sposobów uruchamiania poleceń na komputerach zdalnych. W ostatnim rozdziale zapoznałeś się z tym, jak zdalnie wykonywać zapytania w usłudze WMI przy użyciu poleceń cmdlet modelu CIM. Program PowerShell zawiera również kilka poleceń cmdlet, które zawierają wbudowany parametr ComputerName .
Jak pokazano w poniższym przykładzie, można użyć Get-Command z parametrem ParameterName , aby zidentyfikować polecenia cmdlet zawierające 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
Polecenia takie jak Get-Process i Get-HotFix zawierają parametr ComputerName , ale takie podejście nie jest długoterminowym kierunkiem, w którym firma Microsoft zaleca uruchamianie poleceń w systemach zdalnych. Nawet w przypadku znalezienia polecenia z parametrem ComputerName często brakuje parametru Credential , co utrudnia określenie alternatywnych poświadczeń. Uruchomienie programu PowerShell z sesji z podwyższonym poziomem uprawnień nie gwarantuje powodzenia, ponieważ zapora sieciowa może zablokować żądanie między systemem a komputerem zdalnym.
Aby użyć poleceń zdalnych programu PowerShell przedstawionych w tym rozdziale, funkcja zdalnego dostępu programu PowerShell musi być włączona na komputerze zdalnym. Możesz ją włączyć, uruchamiając Enable-PSRemoting polecenie cmdlet .
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.
Komunikacja zdalna jeden do jednego
Jeśli chcesz interakcyjnej sesji zdalnej, komunikacja zdalna typu jeden do jednego jest odpowiednia. Komunikacja zdalna tego typu jest realizowana za pośrednictwem polecenia cmdlet Enter-PSSession.
Zapisz poświadczenia administratora domeny w zmiennej $Cred . Takie podejście umożliwia wprowadzanie poświadczeń raz i ponowne użycie ich na podstawie polecenia, o ile bieżąca sesja programu PowerShell pozostaje aktywna.
$Cred = Get-Credential
Ustanów sesję komunikacji zdalnej jeden do jednego programu PowerShell na kontrolerze domeny o nazwie dc01.
Enter-PSSession -ComputerName dc01 -Credential $Cred
Zwróć uwagę, że monit programu PowerShell jest poprzedzony symbolem [dc01]. Ten prefiks wskazuje, że jesteś w sesji interaktywnej z komputerem zdalnym o nazwie dc01. Wszystkie uruchamiane polecenia są teraz wykonywane na dc01, a nie na komputerze lokalnym.
[dc01]: PS C:\Users\Administrator\Documents>
Pamiętaj, że na komputerze zdalnym można uzyskać dostęp tylko do poleceń i modułów programu PowerShell. Jeśli inne moduły zostały zainstalowane lokalnie, nie są one dostępne w sesji zdalnej.
Po nawiązaniu połączenia za pośrednictwem interakcyjnej jednoosobowej sesji komunikacji zdalnej jest tak, jakbyś siedział bezpośrednio przy komputerze zdalnym.
[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 zakończeniu pracy z komputerem zdalnym uruchom polecenie cmdlet Exit-PSSession, aby zakończyć sesję zdalną.
[dc01]: Exit-PSSession
Komunikacja zdalna "jeden do wielu"
Chociaż czasami konieczne może być interaktywne wykonywanie zadań na komputerze zdalnym, zdalne operacje PowerShell stają się bardziej efektywne, gdy jednocześnie wykonujesz polecenia w wielu systemach zdalnych.
Invoke-Command Użyj polecenia cmdlet, aby uruchamiać polecenia na co najmniej jednym komputerze zdalnym w tym samym czasie.
W poniższym przykładzie wykonasz zapytanie dotyczące trzech serwerów pod kątem stanu usługi Czas systemu Windows. Polecenie Get-Service cmdlet jest umieszczane wewnątrz bloku skryptu Invoke-Command, co oznacza, że jest wykonywane na każdym komputerze zdalnym.
Invoke-Command -ComputerName dc01, sql02, web01 {
Get-Service -Name W32time
} -Credential $Cred
Wyniki są zwracane do sesji lokalnej jako zdeserializowane obiekty.
Status Name DisplayName PSComputerName
------ ---- ----------- --------------
Running W32time Windows Time web01
Start... W32time Windows Time dc01
Running W32time Windows Time sql02
Aby potwierdzić, że zwrócone obiekty są deserializowane, przekaż dane wyjściowe 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;}
Zwróć uwagę, że w przypadku obiektów deserializowanych brakuje większości metod. Brak metod, ponieważ te obiekty nie są aktywne. Są to inertne migawki stanu obiektu podczas wykonywania polecenia względem komputera zdalnego. Na przykład nie można uruchomić ani zatrzymać usługi przy użyciu obiektu deserializowanego, ponieważ nie ma już dostępu do wymaganych metod.
Nie oznacza to jednak, że nie można używać takich metod, jak Stop() z Invoke-Command. Kluczem jest to, że należy wywołać metodę w sesji zdalnej.
Aby to zademonstrować, zatrzymaj usługę czasu systemu Windows na wszystkich trzech serwerach zdalnych, wywołując zdalnie metodę Stop().
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 wspomniano we wcześniejszym rozdziale, jeśli istnieje polecenie cmdlet dostępne do wykonania zadania, zaleca się użycie go zamiast bezpośredniego wywoływania metody. Na przykład użyj polecenia Stop-Service cmdlet zamiast metody Stop(), aby zatrzymać usługę.
W poprzednim przykładzie metoda Stop() jest używana do zaznaczenia punktu. Niektórzy błędnie uważają, że nie można używać metod z komunikacji zdalnej programu PowerShell. Chociaż prawdą jest, że nie można wywołać metod dla zdeserializowanych obiektów zwróconych do sesji lokalnej, można jednak wywołać je w sesji zdalnej.
Sesje programu PowerShell
W ostatnim przykładzie z poprzedniej sekcji uruchomiono dwa polecenia przy użyciu polecenia cmdlet Invoke-Command. Ten scenariusz spowodował ustanowienie dwóch oddzielnych sesji i ich zakończenie. Jeden dla każdego polecenia.
Podobnie jak sesje CIM, trwała sesja programu PowerShell umożliwia uruchamianie wielu poleceń na komputerze zdalnym bez konieczności tworzenia nowej sesji dla każdego polecenia.
Utwórz sesję programu PowerShell dla każdego z trzech komputerów, z którymi pracujesz w tym rozdziale: DC01, SQL02 i WEB01.
$Session = New-PSSession -ComputerName dc01, sql02, web01 -Credential $Cred
Teraz użyj zmiennej $Session , aby uruchomić usługę Czas systemu Windows, wywołując jej metodę, a następnie sprawdź stan usługi.
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 utworzeniu sesji z poświadczeniami alternatywnymi nie trzeba ponownie określać tych poświadczeń dla każdego polecenia.
Pamiętaj, aby usunąć sesje po zakończeniu korzystania z nich.
Get-PSSession | Remove-PSSession
Podsumowanie
W tym rozdziale nauczyłeś się podstaw komunikacji zdalnej programu PowerShell, w tym uruchamiania poleceń w trybie interaktywnym na jednym komputerze zdalnym i wykonywania poleceń w wielu systemach przy użyciu zdalnej komunikacji typu jeden-do-wielu. Przedstawiono również zalety korzystania z trwałych sesji programu PowerShell podczas uruchamiania wielu poleceń na tym samym komputerze zdalnym.
Wykonaj przegląd
- Jak włączyć zdalne uruchamianie programu PowerShell?
- Jakiego polecenia programu PowerShell używasz do uruchamiania sesji interakcyjnej z komputerem zdalnym?
- Jaka jest jedna korzyść z używania sesji komunikacji zdalnej programu PowerShell zamiast określania nazwy komputera przy użyciu każdego polecenia?
- Czy można użyć sesji programu PowerShell w scenariuszu interakcyjnego komunikacji zdalnej jeden do jednego?
- Jaka jest różnica między obiektami zwracanym przez polecenia cmdlet uruchamiane lokalnie i zwracane obiekty, gdy te same polecenia cmdlet są wykonywane na komputerach zdalnych przy użyciu polecenia
Invoke-Command?