Centrum Skryptów - Systemy Operacyjne

W jaki sposób mogę pobrać tylko nazwę użytkownika, używając klasy Win32_ComputerSystem? 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ę pobrać tylko nazwę użytkownika, używając klasy Win32_ComputerSystem?

Cześć, Skrypciarzu! Korzystam z klasy Win32_ComputerSystem do pobrania nazwy zalogowanego użytkownika. Otrzymuję ją w formacie: Domena\Nazwa. W jaki sposób mogę pobrać jedynie nazwę użytkownika?

-- Grzegorz

Cześć, Grzegorzu. Nasz umiłowany wydawca właśnie wczoraj przypomniał nam, że zamiast marnować całe dnie na opisywanie jak pobrać z dokumentu Word akapity sformatowane w określonym stylu obiecaliśmy czasem odpowiedzieć na nieco prostsze pytania. Obietnicę rzeczywiście złożyliśmy, ale zaraz znikła ona w mrokach niepamięci. (Na obronę możemy powiedzieć, że strasznie kuszący jest dreszczyk podniecenia towarzyszący pobieraniu sformatowanych akapitów z dokumentów Word.)

Od dzisiaj się to zmieni. Jak zapewne wiecie, można przy pomocy takiego prostego skryptu określić, jaki użytkownik jest obecnie zalogowany na komputerze:

strComputer = "."



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

Set colItems = objWMIService.ExecQuery("Select * From Win32_ComputerSystem")



For Each objItem in colItems

    Wscript.Echo objItem.UserName

Next

Uwaga. Jeden haczyk. Skrypt działa w systemach Windows XP i Windows Server 2003; w Windows 2000 jako wynik zawsze podawane jest zero, chyba że zalogowany użytkownik ma uprawnienia administracyjne. Dlatego też nie jest to satysfakcjonująca odpowiedź na odwieczne pytanie, jak stwierdzić, kto jest zalogowany na danym komputerze? (Chyba że wszyscy użytkownicy są lokalnymi administratorami.) Niestety, tak naprawdę nie na to pytanie satysfakcjonującej odpowiedzi.

Jednak, jak zauważył Grzegorz, wartość właściwości UserName wyświetlana jest tak:

FABRIKAM\kenmyer

Może być, o ile zależy nam na poznaniu zarówno nazwy domeny (FABRIKAM), jak i nazwy użytkownika (kenmyer). Co jednak zrobić, jeśli chodzi nam tylko o nazwę domeny?

To zaskakujące, ale rozwiązanie jest właściwie łatwe. Nazwa domeny i użytkownika we właściwości UserName zawsze rozdzielone będą znakiem \. Jest tak nawet jeśli użytkownik zalogowany jest lokalnie; w takim wypadku będzie to nazwa komputera i użytkownika, rozdzielone znakiem \:

ATL-WS-01\kenmyer

Dlatego też można użyć funkcji Split języka VBScript, by rozdzielić wartość UserName w tablicy; wystarczy polecić funkcji Split, by rozdzieliła nazwę w miejscu znaku \. Otrzymamy w ten sposób tablicę składającą się z dwóch części: nazwy domeny i nazwy użytkownika. Wystarczy teraz wywołać echo drugiej części – czyli nazwy użytkownika – i gotowe.

Pogubiliście się? Spójrzmy na skrypt, a potem dokładniej go omówimy:

strComputer = "."



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

Set colItems = objWMIService.ExecQuery("Select * From Win32_ComputerSystem")



For Each objItem in colItems

    arrName = Split(objItem.UserName, "\")

    Wscript.Echo "Domain: " & arrName(0)

    Wscript.Echo "Name: " & arrName(1)

Next

Najpierw łączymy się z usługą WMI na komputerze lokalnym. (Równie łatwo moglibyśmy połączyć się z usługą WMI na komputerze zdalnym. W tym celu wystarczy zmienić wartość zmiennej strComputer na nazwę komputera zdalnego.) Następnie używamy metody ExecQuery do pobrania wszystkich wystąpień klasy Win32_ComputerSystem (pojawi się tylko jedno takie wystąpienie).

Następnie włączamy pętlę For Each, która przejdzie przez wszystkie wystąpienia klasy Win32_ComputerSystem. W pierwszym skrypcie – tym, który wyświetlał nazwę domeny i nazwę użytkownika – w pętli tej wywoływaliśmy tylko echo wartości UserName. Tym razem zrobimy coś odrobinę innego – użyjemy funkcji Split, by utworzyć z właściwości UserName tablicę. Poniższy wiersz kodu rozdziela wartość UserName w miejscu znaku \, tworząc tablicę o nazwie arrName:

arrName = Split(objItem.UserName, "\")

Funkcja Split rozdzieli ciąg znaków tyle razy, ile trzeba, tzn. w każdym miejscu, gdzie znajdzie poszukiwany znak (w naszym przypadku, znak \). Załóżmy na przykład, że mamy taki ciąg znaków:

element_1\element_2\element_3\element_4

Stosując naszą funkcję Split w stosunku do tego ciągu, uzyskamy tablicę z czterema elementami:

element_1

element_2

element_3

element_4

W przypadku właściwości UserName, wynikiem będzie tablica dwuelementowa, np. taka:

FARBRIKAM

kenmyer

Pierwszy element tablicy (czyli FABRIKAM) jest zawsze elementem 0; drugi element (kenmyer) ma numer 1. W celu zobaczenia nazwy domeny, trzeba wywołać echo elementu 0; w celu zobaczenia nazwy użytkownika wywołamy echo elementu 1. Od tego mamy poniższe wiersze:

Wscript.Echo "Domain: " & arrName(0)

Wscript.Echo "Name: " & arrName(1)

I to nam wystarczy: możemy wywołać echo nazwy domeny, nazwy użytkownika, albo jednego i drugiego. A najlepsze, że wydawca da nam wreszcie spokój z tymi podstawowymi pytaniami.

Na jakiś czas przynajmniej.

 Do początku strony Do początku strony


Centrum Skryptów - Systemy Operacyjne