Invoke-Command

Uruchamia polecenia lokalnie lub zdalnie na komputerach.

Invoke-Command to jeden z filarów PowerShell Remoting. Pozwala uruchomić blok poleceń albo cały skrypt — lokalnie, ale przede wszystkim zdalnie na jednym lub kilkuset komputerach naraz. Zamiast logować się po RDP na każdą maszynę, odpalasz jedno polecenie i zbierasz wyniki w swojej konsoli. Działa po WinRM (domyślnie), więc na zdalnych hostach musi być włączona usługa (Enable-PSRemoting). To podstawowe narzędzie każdego, kto administruje więcej niż jednym Windowsem.

Składnia i najważniejsze opcje

Podstawowa forma: Invoke-Command [-ComputerName ] -ScriptBlock { }

  • -ScriptBlock { ... } — kod do wykonania, ujęty w nawiasy klamrowe. Wymagany, jeśli nie podajesz pliku.
  • -ComputerName — lista hostów (oddzielona przecinkami). Bez niej polecenie leci lokalnie.
  • -FilePath — uruchamia skrypt .ps1 z Twojego dysku na zdalnych maszynach (zamiast -ScriptBlock).
  • -Session — używa trwałego połączenia z New-PSSession, gdy chcesz dzielić stan między wieloma wywołaniami.
  • -Credential — konto, na którym wykonać polecenie (np. z Get-Credential).
  • -ArgumentList — przekazuje argumenty do bloku (odbierane przez param() albo $args).
  • -AsJob — uruchamia jako zadanie w tle; wyniki odbierasz przez Receive-Job.
  • -ThrottleLimit — limit jednoczesnych połączeń (domyślnie 32). Przydatne przy setkach hostów.

Przykłady użycia

  • Invoke-Command -ComputerName SRV01 -ScriptBlock { Get-Service Spooler } — sprawdza stan usługi bufora wydruku na zdalnym serwerze.
  • Invoke-Command -ComputerName SRV01, SRV02, SRV03 -ScriptBlock { Restart-Service WinRM } — restartuje usługę na trzech maszynach jednym strzałem.
  • Invoke-Command -ComputerName SRV01 -FilePath C:\skrypty\audit.ps1 — wysyła lokalny skrypt i wykonuje go zdalnie.
  • Invoke-Command -ComputerName WEB01 -ScriptBlock { param($dni) Get-EventLog System -Newest $dni } -ArgumentList 10 — przekazuje argument do bloku i pobiera 10 ostatnich wpisów logu.
  • Invoke-Command -ComputerName (Get-Content hosts.txt) -ScriptBlock { $env:COMPUTERNAME } -AsJob — odpala na liście hostów z pliku w tle.

Częste błędy i pułapki

Najczęstszy zgrzyt to brak skonfigurowanego WinRM — dostajesz błąd „WinRM cannot complete the operation”. Na celu trzeba wcześniej puścić Enable-PSRemoting -Force. Druga klasyka: second hop — zdalna sesja nie przekaże dalej Twoich poświadczeń, więc dostęp do udziału sieciowego z poziomu bloku zwykle pada (rozwiązanie to CredSSP albo delegacja Kerberos).

Pamiętaj, że zmienne lokalne nie wjeżdżają do bloku same z siebie — w PowerShell 3.0+ użyj prefiksu $using: (np. $using:sciezka) albo przekaż je przez -ArgumentList. I nie myl tego z -ComputerName w innych cmdletach: tam często leci protokół RPC/DCOM, a tu twardo WinRM.

Powiązane komendy: Enter-PSSession, New-PSSession, Enable-PSRemoting, Receive-Job, Get-Credential, Invoke-Expression.