Centrum Skryptów - Systemy Operacyjne

W jaki sposób zdalnie uruchomić proces interaktywny?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

W jaki sposób zdalnie uruchomić proces interaktywny?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! W jaki sposób można zdalnie uruchomić proces interaktywny?

-- IS

Cześć Skrypciarze! Odpowiedź

Cześć, IS. Niestety, ale odpowiedź krótka brzmi: nie można, a przynajmniej nie w Windows XP ani w Windows Server 2003. W tych wersjach Windows wszelkie procesy uruchomione zdalnie działają w ukrytych oknach – nie mogą być więc interaktywne, bo użytkownik w ogóle ich nie widzi. Procesy takie mogą wykonać swoje zadanie – na przykład otworzyć okno dialogowe. Jednak użytkownik nie będzie mógł na nie zareagować, bo go w ogóle nie zobaczy. Proces będzie więc czekał, milcząc, niczym aktorka w filmie klasy B, stojąca przy oknie i patrząca w morze w oczekiwaniu na zaginionego kochanka.

To prawda: ten fragment był dość poetycki, jak na artykuł o skryptach, prawda? Cześć Skrypciarze! to codzienna dawka skryptów i świetnej literatury w jednym!

Może trudno w to uwierzyć, ale uruchamianie procesów w oknie ukrytym ma swoje plusy: ogranicza zagrożenie ze strony hakerów, otwierających fałszywe okna dialogowe po to, by użytkownicy podawali w nich swoje hasła albo numery kart kredytowych. (A właśnie, skoro już przy tym jesteśmy – jeśli ktoś z Was jeszcze nie przesłał nam swoich haseł albo numeru karty kredytowej, to… a zresztą, nieważne. Prawnicy znowu zaglądają nam przez ramię.)

Innymi słowy, plusem okien ukrytych jest ochrona użytkowników. Minusem natomiast jest to, że o wiele trudniej jest uruchamiać skrypty czy inne procesy, wymagające ludzkiej interakcji.

Chyba jednak wiecie, jak to jest ze skryptami – to, że czegoś nie można zrobić nie znaczy jeszcze, że tego zrobić nie można. Trzeba tylko znaleźć sposób obejścia problemu. Takie właśnie obejście umożliwi nam poniższy skrypt:

Const OverwriteExisting = TRUE



Set objFSO = CreateObject("Scripting.FileSystemObject")



objFSO.CopyFile "C:\Scripts\Interactive.vbs", _

    "\\atl-ws-01\C$\Scripts\", OverWriteExisting



strComputer = "atl-ws-01"



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set objNewJob = objWMIService.Get("Win32_ScheduledJob")



errJobCreated = objNewJob.Create _

    ("wscript.exe c:\scripts\interactive.vbs", "********084500.000000-420", _

        False, 2, , True, JobID)

Procesu uruchomione zdalnie zawsze będą się otwierać w ukrytych oknach. Tego nie przeskoczymy. Proces, z którym użytkownik będzie mógł wejść w interakcję, musi zostać uruchomiony lokalnie. To właśnie robi nasz skrypt. W jego pierwszej części kopiujemy plik C:\Scripts\Interactive.vbs do folderu Scripts, znajdującego się na zdalnym komputerze atl-ws-01. (Zauważmy, że używamy do tego udziału administracyjnego – C$. Gdyby folder C:\Scripts był udostępniony w sieci, moglibyśmy użyć „standardowej” ścieżki UNCm, np \\atl-ws-01\scripts.) Poniżej znajduje się fragment kodu odpowiedzialny za skopiowanie pliku Interactive.vbs; jeśli w folderze Scripts znajduje się już plik o takiej nazwie, zostaje on zastąpiony:

objFSO.CopyFile "C:\Scripts\Interactive.vbs", _

    "\\atl-ws-01\C$\Scripts\", OverWriteExisting

W ten sposób plik Interactive.vbs został skopiowany na zdalny komputer. Jak go teraz uruchomić, a co więcej, jak uruchomić go lokalnie?

Istnieje kilka sposobów, aby to zrobić, ale zdecydowaliśmy się utworzyć zadanie harmonogramu, które uruchomi skrypt na zdalnym komputerze. W tym celu łączymy się z usługą WMI komputera zdalnego, a następnie używamy metody Get, by połączyć się z klasą Win32_ScheduledJob. Służy do tego poniższy fragment kodu:

strComputer = "atl-ws-01"



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set objNewJob = objWMIService.Get("Win32_ScheduledJob")

Na potrzeby naszego skryptu przyjmujemy, że jest wtorek rano, a skrypt chcemy uruchomić o 8:45. Używamy w tym celu poniższego, zakręconego wiersza:

errJobCreated = objNewJob.Create _

    ("wscript.exe c:\scripts\interactive.vbs", "********084500.000000-420", _

        False, 2, , True, JobID)

Nie będziemy w dzisiejszym artykule wyjaśniać znaczenia wszystkich parametrów metody Win32_ScheduledJob Create; jeśli ktoś z Was interesuje się takimi szczegółami, odsyłamy do odpowiedniej części przewodnika Microsoft Windows 2000 Scripting Guide (j.ang.). Pokrótce – skonfigurowaliśmy następujące parametry:

Parametr Opis
"wscript.exe c:\scripts\interactive.vbs" Ścieżka dostępu do skryptu albo pliku wykonywalnego, który chcemy uruchomić. Ma to być proces interaktywny, więc zaznaczyliśmy, że hostem skryptu będzie wscript.exe. Dzięki temu mamy pewność, że elementy interaktywne (np. okna komunikatów utworzone przez Wscript.Echo) rzeczywiście będą interaktywne.
"********084500.000000-420" Godzina (podana w formacie UTC), o której proces ma się uruchomić. Nie będziemy dziś wyjaśniać zawiłości formatu UTC; szczegóły można znaleźć w przewodniku  Scripting Guide (j.ang.). Na razie interesują nas tylko dwie liczby: 0845 (oznaczająca 8:45 w formacie 24-godzinnym) oraz -420 (czyli różnica między lokalną strefą czasową a czasem Greenwich). Wartości te należy zmienić w zależności od tego, o której godzinie chcemy uruchomić skrypt i w której strefie czasowej się znajdujemy.
False Określa, czy zadanie harmonogramu będzie uruchamiać się jednokrotnie, czy cyklicznie. Chcemy uruchomić skrypt tylko raz, więc parametr ma wartość False.
2 Liczba dni działania zadania harmonogramu.
  Puste miejsce, w które możemy wpisać dzień miesiąca, kiedy chcemy uruchomić zadanie. Parametr ten jest używany tylko wtedy, gdy chcemy uruchomić zadanie kilka razy.
True Wskazuje, że zadanie ma być interaktywne i zostanie uruchomione w widocznym oknie. Ustawienie tego parametru na False (wartość domyślna) spowodowałoby uruchomienie skryptu w oknie ukrytym.
JobID Parametr wyjściowy, w którym zapisany jest identyfikator nowego zadania.

Wykonanie skryptu spowoduje, że o 8:45 na zdalnym komputerze atl-ws-01 zostanie uruchomiony plik Interactive.vbs. Co ważniejsze, zostanie on uruchomiony lokalnie i będzie w pełni interaktywny – użytkownik będzie mieć dostęp do okien komunikatów, okien dialogowych i wszystkich innych elementów interaktywnych.

Jak mówiliśmy, nie jest to rozwiązanie, ale raczej obejście problemu i jest nieco kłopotliwe. Ważne jednak, że działa.

Postanowiliśmy już, że w ramach promocji kultury kolejny artykuł napiszemy w całości trzynastozgłoskowcem ze średniówką. Będzie to jeszcze bardziej poetyckie i dżezi.

Tylko musimy znaleźć średniówkę… Chyba gdzieś tutaj leżała…

 Do początku strony Do początku strony

Centrum Skryptów - Systemy Operacyjne