PsExec.exe i zdalne wykonywanie poleceń w Windows


 

Wielu z Was pewnie zgodzi się ze stwierdzeniem, że Administratorzy Systemów nie należą do najbardziej ruchliwych pracowników w firmie. O ile Administrator Sieci zawsze znajdzie potrzebę fizycznego podejścia do urządzenia (w celu przepięcia kabla w panelu czy fizycznego restartu switch’a), o tyle my, „systemowcy” prawie wszystko możemy zrobić zdalnie :)

Jednym z narzędzi, które nas w tym wspomaga jest PSEXEC.exe,  który jest częścią kultowego już pakietu programów „PSTOOLS” autorstwa  genialnego Marka Russinovich’a.

( http://download.sysinternals.com/files/PSTools.zip )

PsExec.exe jest programem, uruchamianym w wierszu poleceń w Windowsie. O tym, jak podejrzeć wszystkie możliwe przełączniki nie będę wspominał w tak zacnym gronie czytelników. Dla osób, które jeszcze tego programu nie poznały, podzielę się kilkoma przykładami zastosowań.  ( Być może, niektóre osoby znające PsExec’a nie wiedzą o nowinkach, jakie Mark Russinovitch wprowadził na przestrzeni kilku ostatnich lat.)

Zacznijmy od podstaw. Oto polecenie, które sprawi, że konsola CMD na naszym komputerze będzie przyjmowała polecenia, które wykonają się na zdalnym komputerze(„wyjście” z konsoli na zdalnym komputerze odbywa się za pomocą zwykłego „exit” ):

psexec.exe \\zdalny_komputer cmd

Aby połączyć się z kilkoma komputerami po kolei, możemy podać ich nazwy oddzielone przecinkami. Gdy na jednym z podanych komputerów skończymy wpisywać polecenia, używamy komendy „exit”, aby przejść do następnego komputera:

psexec.exe \\zdalny_komputer1,zdalny_komputer2 cmd

Jeśli mamy dużo komputerów warto zapisać je w pliku tekstowym (wystarczą same nazwy lub adresy IP w oddzielnych wierszach) i uruchomić PsExec’a w ten sposób:

psexec.exe @twoja_lista.txt cmd

Należy jednak zaznaczyć, że w tym wypadku psexec.exe uruchomi wiersz poleceń na pierwszym zdalnym komputerze i dopiero po jego zamknięciu, uruchomi CMD na następnym.
Dla uniknięcia problemów z uprawnieniami można skorzystać z przełączników -u -p i podać login i hasło (..ale uwaga! Hasło będzie niezaszyfrowane, więc warto robić to w „bezpiecznej” sieci.):

psexec.exe -u Twoj_login -p Twoje_haslo @twoja_lista.txt cmd

Możemy też uruchomić na zdalnym komputerze jakąś inną komendę, o ile ten komputer ją zna.
Pierwszy przykład pokaże nam ustawienia IP, a drugi uruchomi serwis automatycznych aktualizacji.

psexec.exe \\zdalny_komputer  ipconfig

psexec.exe \\zdalny_komputer net start „Windows Update”

A co jeśli komputer zdalny nie zna danego polecenia albo chcemy na nim uruchomić nasz skrypt? Tu zaczyna się cała zabawa:) Oto polecenie, które skopiuje jakiś plik na zdalny komputer i uruchomi go, a po uruchomieniu skasuje:

psexec.exe \\zdalny_komputer  -c  c:\moje_programy\moj_hiper_skrypt.bat

Jeśli chcemy dany skrypt skopiować na serwery na stałe, powinniśmy skorzystać z innej metody np. opisanej przeze mnie pętli w CMD, która odczyta nazwy maszyn z pliku tekstowego i wykona kopiowanie (musicie delikatnie przerobić moją pętlę wstawiając komendę COPY po słowie DO, ale z tym na pewno sobie poradzicie :)).

W niektórych przypadkach zdecydowanie nie będziemy chcieli kopiować skryptów na serwery. Za pomocą PsExec’a można odwołać się do skryptu w danej ścieżce UNC. (Mapowanie ścieżki nie zadziała, gdyż PsExec nie loguje się interaktywnie na maszynach, które obsługuje.)

Psexec.exe \\zdalny_komputer \\nazwa_serwera\jakis_share\moj_hiper_skrypt.bat

Przykłady zastosowań PsExec’a można mnożyć w nieskończoność.  Redakcja SPECE.IT robi to bardzo często. Ot, choćby w tym artykule Darek Góra szukając Mac adresu podgląda wynik ipconfig na zdalnym komputerze.

Zachęcam Was do dzielenia się swoimi doświadczeniami z PsExec lub innymi narzędziami do pracy zdalnej. Tym, którzy PsExec’a dopiero poznają, życzę sukcesów i zdrowych pleców, gdyż teraz będziecie spędzać więcej czasu przy biurku :)

Na naszym Blogu znajdziecie również informacje o innych programach z pakietu PSTOOLS.


Podobne Tematy:

  • Dariusz Góra

    Admini sieciowi nie muszą restartować switchy – one zawsze działają

  • Łukasz Skalikow

    Jeden z naszych czytelników, któremu „zła firma;)” blokuje komentarze, podesłał mi słuszną uwagę: Polecenie Psexec.exe \\zdalny_komputer -c c:\moje_programy\moj_hiper_skrypt.bat skopiuje i URUCHOMI dany program. Wydawało mi się, że to wynika z tekstu, ale delikatnie poprawiłem go, aby nie było watpliwości:)
    Wielkie dzięki za czytanie naszych wpisów i sugestie!

  • m4ko

    Dlaczego podczas próby użycia psexec’a wyrzuca mi błąd odmowa dostępu?

    • Należy mieć prawa administratora na zdalnym komputerze lub użyć poświadczeń konta, które ma (-u użytkownik -p hasło). Ewentualnie, należy sprawdzić dostęp do zdalnej maszyny (firewall itd.. )

  • keypax

    Po uruchomieniu komendy psexec.exe -u XXX -p XXX \\zdalny_komputer cmd owszem otwiera się okno konsoli, ale jak je zakończyć?, natomiast po zwykłym zamknięciu okna usługa PSEXESVC na zdalnym komputerze nadal wisi jako uruchomiona, nie zakańcza się automatycznie. Podobno jest to usługa tymczasowa i powinna działać tylko na czas połączenia.

    Jakieś porady w tej sprawie, był bym wdzięczny.

    Pozdrawiam.

    • Dariusz Góra

      Czasem zdarza się, że ten proces nie kończy się wraz z zamknięciem połączenia, sprawdź czy wersje psexec i psexesvc na obu komputerach są takie same, bo to może być prawdopodobna przyczyna tego problemu.

      Aby zamknąć zdalne cmd użyj komendy exit.
      Jeżeli zawiesi się psexesvc to wykonaj na zdalnym kompie sc delete psexesvc.

      Testowałem to przed chwilą u siebie i na początku proces wisiał jak w Twoim przypadku. Po jego wyłączeniu powyższą komendą zachowywał się tak jak należy, czyli znikał wraz z zamknięciem uruchomionego zdalnie cmd. Jeżeli to nie konflikt wersji to może po prostu jest to bug psexec’a, bo widziałem sporo komentarzy na ten temat.

  • keypax

    Komenda exit działa, konsola się zamyka ale usługa psexesvc nadal wisi jako uruchomiona, natomiast sc delete psexesvc daje błąd „Określona usługa została oznaczona do usunięcia” dzieje się tak i pewnie prawidłowo, ponieważ wcześniej już wydałem tą komendę. Problem jest w tym, że ona cały czas wisi.
    Kolejny problem, jeśli już by sc delete zadziałało to, że trzeba ją wykonać na zdalnym hoście, po prostu logując się na pulpit.

    Widać, że jest to jednak bug psexec’a, tak jak pisałeś wyżej.

    Dzięki za sprawdzenie problemu

    • Keypax, powinieneś ubić proces – na przykład poleceniem pskill \\komputer_zdalny psexesvc
      Polecenie sc delete kasuje usługę :)

  • Anonim

    Witam. Niestety ja dostaję komunikat:
    Couldn’t access 192.168.1.113:
    Nie można odnaleźć ścieżki sieciowej.

    Make sure that the default admin$ share is enabled on ADRES_IP

    czy ktoś może mi powiedzieć co jest nie tak?
    z góry dzięki za pomoc.
    pozdrawiam

    • Łukasz Skalikow

      Hej, po pierwsze, jak sam komunikat podpowiada, host, z którym się, łączysz musi być windowsem i musi mieć domyślny administartorski udział sieciowy o nazwie admin$, który prowadzi do C:\Windows (tu własnie psexec na chwilę wkopiowuje plik psexecsvc.exe).

      A więc? Jaki masz windows i czy jest na nim udział administartorski?

      Zbieram tego typu przypadki w osobny artykuł. Stay tuned :)

      • scribe_pl

        „Make sure that the default admin$ share is enabled on…”

        udział administratorski? myślałem że dla maszyn pracujących w domenie są one domyślniej włączone

        DC WIN200R2 klient WIN7PRO i przy

        C:tool>psexec.exe -u nazwadomenyadministrator -p HASLO \klient00 cmd

        otrzymuje to co powyżej

  • Blade1984

    Witam

    Mam problem. Mianowicie jeżeli wykonuje np. Ipconfig to działa ale jeżeli chce otworzyć katalog sieciowy na zdalnym komputerze psexec się zawiesza. Uprawnienia są itd

    • Łukasz Skalikow

      @Blade1984:
      Dzieje się tak zawsze na każdej maszynie? Jak to robisz? najpierw psexec \\komputer cmd, a potem cd \\serwer\udział ? < - tak nie ma prawa działać. Próbowałeś mapować zdalny udział? psexec \\komputer /user:domena\użytkownik hasło -e net use x: \\serwer\udział?

      • Blade1984

        Po prostu odpalam dzięki psexec cmd zdalnego komputera a później daje polecenie start \\xxx i powinno na zdalnym kompie odpalić katalog z serwera. Pozdrawiam

        • Łukasz Skalikow

          Najpierw podmapuj udział, wg mojego wcześniejszego komentarza. Potem możesz korzystać z „CD” do nawigowania. Polecenie „start” dla samego przejścia do ścieżki sprawia, że psexec gubi wątek. Używaj go tylko do uruchamiania programów.

  • Darek

    Dzień dobry, a na co powinienem zwrócić uwagę jeśli mimo wszystko psexec zwraca mi
    PsExec v2.0 – Execute processes remotely
    Copyright (C) 2001-2013 Mark Russinovich
    Sysinternals – http://www.sysinternals.com

    Password:
    Couldn’t access vmwareknet:
    Odmowa dostepu.
    ?
    Na obu komputerach jest konto administrator z ustawionym hasłem, na obu jest wyłączony firewall, nie ma antywirusa (są to „puste” windows xp sp3 w wirtualnych maszynach), komputery się pingują, są oczywiście widoczne w zarządzaniu komputerem zasoby ADMIN$.

    • Łukasz Skalikow

      Zablokuj na chwilę usługę IPSEC i zerknij, czy pomogło.

      Czy na te zdalne maszyny można wchodzić po ścieżce UNC np. po wspomnianym udziale \\komputer\admin$?

      • Darek

        No więc tak – wpisywanie z cmd przykładowo polecenia:
        net use x: \\vmwareknet\admin$ /user:administrator
        powoduje:
        Hasło dla \\vmwareknet\admin$ jest nieprawidłowe.

        Wprowadź hasło dla „administrator” w celu połączenia z „vmwareknet”:
        Wystąpił błąd systemu 5.

        Odmowa dostępu.

        Hasło wprowadzam prawidłowe, bo sam je na drugiej maszynie ustawiam.

        Jest tam też udostępniony zwykły folder.
        net use x: \\vmwareknet\udo /user:administrator
        Polecenie zostało wykonane pomyślnie.

        W udziałach na tamtym komputerze pojawia się połączenie użytkownika administrator.
        Po wyłączeniu usługi IPSEC sytuacja bez zmian dokładnie wszystko jak wyżej, zatrzymałem usługę najpierw na zdalnym komputerze potem na lokalnym.

        • Łukasz Skalikow

          Nie zapominaj o fladze -e
          psexec \\komputer /user:użytkownik hasło -e net use x: \\serwer\udział

          Czy jak zalogujesz się na zdalnej maszynie przez np Remote Desktop i w wierszu poleceń spóbujesz tego mapowania to, masz identyczny błąd? Może wcale nie chodzić o psexeca, tylko uprawnienia do udziału i NTFS.

  • gajowy

    Również mam problem z mapowaniem dysku na zdalnej maszynie za pomocą psexec. Próbowałem na 2 sposoby: psexec \\zdalny cmd i potem net use z: \\serwer\zasoby lub psexec \\zdalny -c „mój skrypt.bat”. W obu wypadkach mam komunikat o pomyślnym wykonaniu (error code 0) i nawet przez cmd mam zdalny dostęp do dysku z: (włącznie z tworzeniem i usuwaniem folderów). Natomiast użytkownik zdalnej maszyny nie widzi zamapowanego dysku (ani w oknie Mój komputer, ani z poziomu konsoli – net use zwraca „Na liście nie ma żadnych plików”). Domyślam się, że dzieje się tak ponieważ dysk jest mapowany w kontekście użytkownika SYSTEM. W jaki sposób zrobić to w kontekście konkretnego użytkownika zdalnej maszyny?

    • Łukasz Skalikow

      psexec \\serwer_zdalny -u domena\użytkownik -e net use J: \\serwer\udział.

      Podanie użytkownika oraz flagi -e jest tu kluczowe.
      Flaga -e loguje naprawdę użytkownika i wykonuje zmianę w jego profilu.

      • gajowy

        Dzięki za szybką odpowiedź. Jednak dalej mam z tym problem.
        W przypadku zwykłego użytkownika mam „Odmowa dostępu”, co wydaje się dość oczywiste. Po dodaniu użytkownika do grupy Administratorzy jest: „Wystąpił błąd systemu 67 net exited on serwer_zdalny with error code 2”

        • Łukasz Skalikow

          Błąd 67 to przeważnie „The network name cannot be found”. Czy zatem serwer, na którym wykonujesz NET USE rozpoznaje tego drugiego po nazwie? Z IP zamiast nazwy jest tak samo?

          Czy użytkownik może wykonywać inne polecenia psexeciem (choćby ipconfig) ?

  • gajowy

    Errata
    Oczywiście „Na liście nie ma żadnych wpisów”

    PS. Myśleliście o forum przy Waszym blogu?

    • Łukasz Skalikow

      Myśleliśmy, ale obawiamy się, że byłoby to smutne i puste miejsce: podobnie jak profil Google+ ;).
      No, ale jesteśmy młodym Blogiem – własnie skończyliśmy roczek. Jeśli trend się utrzyma, to niedługo zbudujemy sobie zacne grono czytelników i posiadanie forum będzie miało sens :)

      PS. Dzięki za czytanie i komentowanie naszych wpisów.

  • Anonim

    W jaki sposób uruchomić zdalnie program na komputerze, na którym jest już zalogowany użytkownik, tak aby instancja programu wyświetliła się u tego właśnie użytkownika na ekranie ? Załóżmy, że chciałbym zdalnie uruchomić program kalkulator, który jest na każdym komputerze (C:\Windows\System32\calc.exe)

    • Łukasz Skalikow

      psexec \\komputerzdalny -d -i calc.exe. Jeśli na maszynie zalogowanych jest więcej osób, możesz podać nr sesji (np 2): \\komputerzdalny -d -i 2 calc.exe

  • Marcin

    Witam. Mam taki problem: Uruchamiam polecenie zdalnie z podaniem -u i -p. jeżeli robię to z konta domenowego tego użytkownika, który jest podany w poleceniu (administratora), wszystko działa ok. Jeżeli przeloguję się na innego użytkownika bez praw administracyjnych, to mimo podania w skrypcie konta administratora, nie mogę dostać się do zdalnej maszyny – pojawia się komunikat odmowa dostępu.
    Dodatkowo dziwną sprawą jest fakt, że kiedyś to działało, ale przypuszczalnie jakiś lokalny administrator coś zmienił na komputerze do którego się łączę (tylko nie przyznaje się :(). Co może stanowić różnicę w dostępie dla administratora i innego użytkownika z poświadczeniami administratora?

    • Wiesiek

      Może dostęp do udziału Admin$ ?

      • Marcin

        Czy to ma znaczenie „na użytkownika”?
        Zauważyłem właśnie inną właściwość tej sytuacji. Jeżeli w skrypcie odwołam się do komputera po nazwie, to działa dla wszystkich zalogowanych użytkowników, jeżeli po ip, tylko dla administratora…

  • Bartosz Wierciński

    Mam w danym katalogu plik który chcę uruchomić za pomocą psexec
    Wykonuje polecenie psexec \\nazwa_serwera c:\katalog\uruchom.bat
    Zwraca mi błąd „Nie można odnaleźć określonego pliku”
    Plik istnieje ale się nie uruchamia

  • Dudus

    Witam, ja mam taki probelm na jednym komputerze WIn 7 Pro z którego łącze się z innymi, że psexec działa ale tylko jak łącze się ze zdalnymi komputerami przez ich adres IP. Jeżeli podaje nazwę dostaje komunikat Could not start Psexesvc service on nazwakomputera. Zdalne wywołanie procedury zostało anulowane. Jak łącze się z innych komputerów to mogę łączyć się po nazwie i przez IP.

  • R

    Przed wszystkim tutorial ma sporo błędów w składni np. \zdalny_komputer1,\zdalny_komputer2 a powinno być \zdalny_komputer1,zdalny_komputer2.

    Kolejny błąd to brak -i przełącznika w przykładzie:
    psexec.exe \zdalny_komputer cmd

    -i oznacza interakcję z pulpitem(wyświetlenie) i dzięki temu dopiero wyświetli się CMD.

    • Hej, dzięki za sugestie, lubimy aktywnych czytelników :)

      Co do listy kompów masz rację powinno być \zdalny_komputer1,zdalny_komputer2.

      Co do drugiej uwagi, to nie używamy flagi -i bo nie chcemy aby na zdalnym kompie uruchomiło sie okienko, tylko chcemy, aby nasza konsola połączyłą, i to co wpisujemy w konsoli na naszym komputerze wykonywało się na tym drugim :) Na tym polega różnica.

  • Paweł

    Mam pytanie, w przydku kopiowania wyskakuje mi komunikat ze nie można skopiować ponieważ plik istnieje, jaką komendą można nadpisać plik?

    • Jakie dokładnie polecenie wykonujesz i jaka jest treść komunikatu? Plik .exe jest chwilowo kopiowany na udział admin$. Skasuj go stamtąd ręcznie jeśli z jakichś powodów nie znika. Jeśli jest w użyciu zabij proices psexec.exe (np przy pomocy taskkill albo pskill).

      • Paweł

        Dokładnie takie coś: psexec.exe \zdalny_komputer -c c:moje_programymoj_hiper_skrypt.bat tylko że kopiuje plik .exe a nie .bat. Czy po dodaniu za parametrem -c parametru -f wymusze jego skopiowanie?

        • Byćmoże „wisi” ten wykonywany skrypt. Zabij proces np za pomocą pskill.exe. Jeśli ciągle widzisz „file exists” to poszukaj tego pliku na udziale \serweradmin$. Skasuj go ręcznie.

  • T.

    Dlaczego ponizsza komenda nie skutkuje aktualizacja pliku na c:tempserver1.txt
    shell(„psexec \server1 uptime >>c:tempserver1.txt

    • Czy na maszyie „server1” wogóle działa polecenie uptime? To nie jest natywne polecenie w windows.