Centrum Skryptów - Systemy Operacyjne

Jak określić, które przełączniki zostały użyte podczas uruchamiania pliku wykonywalnego? 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.

Jak określić, które przełączniki zostały użyte podczas uruchamiania pliku wykonywalnego?

Cześć Skrypciarzu! Czy istnieje jakiś sposób na określenie, które argumenty wiersza poleceń (jeśli w ogóle) zostały użyte podczas uruchamiania pliku wykonywalnego?

-- TO

Cześć TO. Nie chcemy wywoływać w skrypciarskim światku skandalu – no dobra, nie chcemy wywoływać kolejnego skandalu – ale musimy posunąć się tu do małego oszustwa. To pytanie dostajemy po raz pierwszy, a żeby na nie odpowiedzieć przytoczymy odpowiedź na inne pytanie, zadane nam kilka miesięcy temu.

No to zaczynamy: jeśli używasz Windows XP albo Windows Server 2003, wówczas bardzo łatwo określić, które argumenty wiersza poleceń zostały użyte podczas uruchamiania pliku wykonywalnego. To dlatego, że w tych dwóch wersjach Windows (ale nie we wcześniejszych) klasa WMI Win32_Process zawiera właściwość o nazwie CommandLine, która dostarcza informacji o kompletnym wierszu poleceń (wraz z przełącznikami) użytym do uruchomienia pliku wykonywalnego.

Wyobraźmy sobie na przykład, że na komputerze uruchomiony jest Netstat.exe, a Ty chcesz się dowiedzieć, które przełączniki zostały użyte do uruchomienia programu. Oto skrypt, dzięki któremu się tego dowiesz:

strComputer = "."



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

Set colItems = objWMIService.ExecQuery _

    ("Select * From Win32_Process Where Name = 'netstat.exe'")



For Each objItem in colItems

    Wscript.Echo objItem.CommandLine

Next

Jak widać, skrypt jest niewielki i stosunkowo prosty: zwracamy kolekcję wszystkich procesów o nazwie Netstat.exe, a następnie dla każdego z nich wywołujemy echo właściwości CommandLine. Załóżmy, że uruchomilibyśmy Netstat.exe przy pomocy tego polecenia: netstat.exe -a 30. W takim wypadku raport skryptu dla właściwości CommandLine wyglądałby tak:

netstat.exe –a 30

Dokładnie to, co chciałeś zobaczyć.

Ciekawą cechą właściwości CommandLine jest to, że często przekazuje Ci ona użyteczne informacje, nawet jeśli nie dotknąłeś wiersza poleceń małym palcem. Powiedzmy, że masz skrypt o nazwie C:\Scripts\Inventory.vbs. Powiedzmy, że klikniesz prawym przyciskiem myszy plik w Moim komputerze i wybierzesz opcję Edycja. Skrypt otworzy się wówczas w Notatniku (zakładając, że Notatnik jest Twoim domyślnym edytorem skryptów). A oto i właściwość CommandLine dla tego wystąpienia Notatnika:

C:\WINDOWS\System32\Notepad.exe C:\scripts\inventory.vbs

Innymi słowy, wiemy nie tylko to, że Notatnik jest otwarty. Wiemy również, jaki plik jest otwarty (inventory.vbs). Ten sposób jest skuteczny dla wielu innych aplikacji, choć nie dla Microsoft Word czy Excel (co ciekawe, zadziała dla PowerPointa). Dla Worda czy Excela otrzymasz CommandLine do uruchomienia programu, jednak bez informacji o tym, jaki dokument jest otwarty. Zamiast tego dostaniesz ogólny ciąg wiersza poleceń, który będzie wyglądał tak:

"C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" /e

To jedna z tajemnic, którymi będziemy musieli się kiedyś zająć.

Przy okazji, jeśli zżera Cię ciekawość, w taki sposób (właściwość CommandLine klasy Win32_Process) odpowiedzieliśmy na pytanie: W jaki sposób określić, jakie skrypty są uruchomione na komputerze?

Aby się tego dowiedzieć, należy sprawdzić właściwość CommandLine pod kątem wszystkich procesów Wscript.exe i Cscript.exe; CommandLine będzie zawierała nazwę skryptu uruchomionego na jednym z tych hostów. Albo, ujmując rzecz programatycznie:

strComputer = "."



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

Set colItems = objWMIService.ExecQuery _

    ("Select * From Win32_Process Where Name = 'wscript.exe' OR Name = ‘cscript.exe’")



For Each objItem in colItems

    Wscript.Echo objItem.CommandLine

Next

 Do początku strony Do początku strony


Centrum Skryptów - Systemy Operacyjne