PSExec uruchamiany z powershell działa ale zgłasza błędy.

22-paź-2013

Skrypt w powershell chce wykorzystać polecenie PSExec do podłaczenia się do zdalnego komputera i wykonania na nim polecenia (tutaj nadania uprawnienia Full Control do dysku X: dla użytkownika user001:

.\PsExec.exe \\comp123  cmd.exe /c  'icacls T:\ /grant:r „user003”:(OI)(CI)F’

Polecenie się wykonuje poprawnie, ale zgłasza błędy:

PsExec.exe : At line:1 char:19 + c:\temp\PsExec.exe <<<<  \\comp123  cmd.exe /c  'icacls T:\ /grant:r „user003”:(OI)(CI)F’     + CategoryInfo          : NotSpecified: (:String) [], RemoteException     + FullyQualifiedErrorId : NativeCommandError   PsExec v1.98 – Execute processes remotely Copyright (C) 2001-2010 Mark Russinovich Sysinternals – www.sysinternals.com

processed file: X:\ Successfully processed 1 files; Failed processing 0 files Connecting to comp123…Starting PsExec service on comp123…Connecting with PsExec service on comp123…Starting cmd.exe on comp123… cmd.exe exited on comp123 with error code 0.

Czyli komunikatów o błędach dużo, ale komenda działa poprawnie

Poczytałem i okazało się, że nie tylko ja mam ten problem. Jakimś obejściem jest ukrycie komunikatów o błędzie:

$tmp=$ErrorActionPreference
$ErrorActionPreference = „SilentlyContinue”
.\PsExec.exe \\comp123  cmd.exe /c  'icacls T:\ /grant:r „user003”:(OI)(CI)F’
$ErrorActionPreference=$tmp

Zmienna $ErrorActionPreference mówi jak zachować się w przypadku napotkania błędu. Skrypt może się przerwać, ale może też kontynuować… kontynuacja może być cicha lub z komunikatami n ekranie. Tutaj powiedzieliśmy, że w przypadku fałszywych błędów PSExec należy kontynuować i ukryć błędy. Żeby nie zaburzyć logoki skryptu, która może korzysta gdzieś dalej z tej zmiennej przed modyfikacją, zapamiętujemy aktualną wartość zmiennej, a na końcu przywracamy ją do pierwotnej wartości.

Komentarze:

  1. andrzej napisał,

    PowerShell ma swoje narzędzia do remotingu – na przykład Invoke-Command (które pozwala uruchamiać polecenia na wielu maszynach naraz), *-PSSession, PowerShell workflows.

    PSExec to przestarzałe rozwiązanie dla starego cmd.exe 🙂

  2. Rafał Kraik napisał,

    tak, ale nie na każdym serwerze, do którego chcesz sięgnąć remiting jest włączony. Ten przypadek właśnie taki był. Gdyby nie to na pewno skorzystałbym z remotingu, bo jest boski!

Autor: Rafał Kraik