Centrum Skryptów - Systemy operacyjne

W jaki sposób mogę określić konto, na którym uruchomiony jest proces? 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 mogę określić konto, na którym uruchomiony jest proces?

Cześć Skrypciarzu! Mam skrypt, który zwraca informacje o wszystkich procesach uruchomionych na komputerze. Problem polega na tym, że nie potrafię sprawdzić nazw kont użytkowników, na których uruchomione są te procesy. Czy możecie mi pomóc?

-- DL

Cześć DL! Owszem, możemy pomóc. Prawdę mówiąc, samo określenie, na którym koncie uruchomiony jest proces, jest stosunkowo proste, tylko ciężko domyślić się, jak się do tego zabrać. Jak większość ludzi, prawdopodobnie przeskanowałeś właściwości dla klasy Win32_Process w poszukiwaniu właściwości Account (konto), lub UserName (nazwa użytkownika), lub czegoś w tym rodzaju. Najprawdopodobniej nic nie znalazłeś, a to z bardzo prostej przyczyny: klasa Win32_Process nie posiada właściwości, która informowałaby o tym, na jakim koncie uruchomiony jest proces.

Zamiast tego musisz użyć metody GetOwner. Poniżej masz skrypt, który określi, na jakim koncie uruchomiony jest Microsoft Word (Winword.exe):

strComputer = "."

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



Set colProcessList = objWMIService.ExecQuery _

    ("Select * from Win32_Process Where Name = 'Winword.exe'")



For Each objProcess in colProcessList

    objProcess.GetOwner strUserName, strUserDomain 

    Wscript.Echo "Process " & objProcess.Name & " is owned by " _ 

        & strUserDomain & "\" & strUserName & "."

Next

Najbardziej interesuje nas ta linia kodu:

objProcess.GetOwner strNameOfUser, strUserDomain

Wywołujemy tu metodę GetOwner. Metoda ta zwraca dwa "parametry wyjściowe": jeden zwraca nazwę użytkownika odpowiedzialnego za proces, drugi podaje nazwę domeny, do której należy użytkownik. Aby przechwycić te dwa parametry, musimy do metody GetOwner dodać dwie zmienne. W tym przykładowym skrypcie użyliśmy zmiennych o nazwie strUserName oraz strUserDomain. Nazwy są umowne; możesz nadać zmiennym nazwy A, B, X, Y, itd.

Porządek zmiennych nie jest jednak umowny: pierwsza zwrócona wartość będzie zawsze nazwą użytkownika, druga - domeną. A to oznacza, że jeśli chcesz, aby X reprezentowało nazwę użytkownika, a Y domenę, upewnij się, że kod będzie wyglądał tak:

objProcess.GetOwner X, Y

Po wywołaniu GetOwner uzyskujemy echo nazwy procesu i użytkownika. Zauważ, że – dla urozmaicenia – używamy formatu domain\user (domena\użytkownik); tym samym otrzymujemy echo w rodzaju fabrikam\kenmyer.

Przy okazji, oto skrypt, który tworzy listę wszystkich procesów na komputerze wraz z ich właścicielami:

strComputer = "."

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



Set colProcessList = objWMIService.ExecQuery _

    ("Select * from Win32_Process")



For Each objProcess in colProcessList

    objProcess.GetOwner strUserName, strUserDomain

    Wscript.Echo "Process " & objProcess.Name & " is owned by " _ 

        & strUserDomain & "\" & strUserName & "."

Next

Na wypadek, gdybyście się zastanawiali, 3 stycznia 2005 jest w Microsofcie oficjalnie dniem wolnym. Dlaczego więc rubryka Cześć Skrypciarzu! pojawiła się dzisiaj? Cóż, zawdzięczacie to niebywałemu poświęceniu i poczuciu obowiązku Skrypciarzy Microsoftu. Albo też jeden ze Skrypciarzy – którego imię litościwie przemilczmy – nie zauważył, że ma wolne i przyszedł do pracy. Na siódmą rano.

 Do początku strony Do początku strony


Centrum Skryptów - Systemy operacyjne