Centrum Skrypciarzy - Active Directory

Jak odróżnić lokalnych użytkowników od użytkowników domeny?

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 odróżnić lokalnych użytkowników od użytkowników domeny?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak odróżnić użytkowników lokalnych od użytkowników domeny podczas używania skryptu do pobrania uczestników lokalnej grupy Administratorów?

-- KS

Cześć Skrypciarze! Odpowiedź

Cześć, KS. Czasem przychodzi taki czas, że nic mi się nie chce. Zazwyczaj dzieje się tak wtedy, gdy mam bardzo dużo rzeczy do zrobienia, a za oknem jest piękna pogoda. Mógłbym tak siedzieć godzinami patrząc w okno i wymyślając różne rzeczy, które mógłbym zrobić będąc gdzie indziej. Zdobędę się jednak specjalnie dla Was na trochę wysiłku i napiszę skrypt, który przekaże listę uczestników lokalnej grupy Administratorów na komputerze o nazwie atl-fs-01. Ten skrypt będzie wyglądał mniej więcej tak:

strComputer = "atl-fs-01"



Set colGroups = GetObject("WinNT://" & strComputer & "/Administrators")



For Each objUser In colGroups.Members

    Wscript.Echo objUser.Name

Next

Po uruchomieniu skryptu otrzymamy informację podobną do poniższej:

Administrator

Domain Admins

kenmyer

InfoSec Secure Environment

pilarackerman

jonathanhaas

To świetnie, ale jak już wiemy, KS nie zna sposobu na określenie, czy kenmeyer (przykładowo) to użytkownik lokalny czy użytkownik domeny. Zastanówmy się, jakie pytanie możemy zadać, dla którego odpowiedź pozwoli nam odróżnić użytkowników lokalnych od użytkowników domeny. To nie jest łatwe zadanie, ponieważ musimy zastosować dostawcę WinNT w celu uzyskania informacji na temat tych użytkowników. Jak wiemy, dostawca WinNT (w przeciwieństwie do jego odpowiednika usługi Active Directory) może powiedzieć nam jedynie kilka rzeczy na temat danego konta na komputerze lokalnym.

Na szczęście jednak jednym z pytań, na które odpowie nam dostawca WinNT jest: „Jaka jest ścieżka ADsPath dla użytkownika?” Ścieżka ADsPath dla konta użytkownika jest z grubsza odpowiednikiem ścieżki UNC dla pliku. Przykładowo załóżmy, że mamy plik o ścieżce UNC \\atl-fs-01\public\kenmyer\test.doc. Ścieżka UNC mówi nam dokładnie, gdzie możemy znaleźć plik Test.doc: na komputerze o nazwie atl-fs-01, w folderze udostępnionym Public, w folderze KenMeyer.

Podobnie, załóżmy, że mamy następującą ścieżkę ADsPath: WinNT://FABRIKAM/atl-fs-01/Administrator. Ta ścieżka mówi nam, że mamy konto lokalne o nazwie Administrator, znajdujące się na komputerze o nazwie atl-fs-01, będącym uczestnikiem domeny Fabrikam. Innymi słowy, konta lokalne zawsze będą zawierać nazwę komputera jako część ścieżki ADsPath, w przeciwieństwie do kont domeny. Oto, co możemy na przykład uzyskać, kiedy wywołamy echo ścieżki ADsPath dla uczestników grupy Administrators:

WinNT://FABRIKAM/atl-fs-01/Administrator

WinNT://FABRIKAM/Domain Admins

WinNT://FABRIKAM/kenmyerp

WinNT://FABRIKAM/InfoSec Secure Environment

WinNT://FABRIKAM/atl-fs-01/pilarackerman

WinNT://FABRIKAM/jonathanhaas

No i mamy. Jeżeli przyjrzymy się bliżej, zobaczymy, że ciąg /atl-fs-01/ pojawia się w dwóch ścieżkach: Jednej dla Administrator i jednej dla PilarAckerman. Wskutek tego, muszą to być konta lokalne, a pozostałe konta to konta domeny.

Ale przecież nie chcemy się im bliżej przyglądać, nieprawdaż? Chcemy natomiast, aby skrypt powiedział nam, które konta należą do użytkowników lokalnych, a które do użytkowników domeny. Poniższy skrypt powinien to załatwić:

strComputer = "atl-fs-01"

strTestString = "/" & strComputer & "/"



Set colGroups = GetObject("WinNT://" & strComputer & "/Administrators")



For Each objUser In colGroups.Members

    If InStr(objUser.AdsPath, strTestString) Then

        Wscript.Echo "Local user: " & objUser.Name

    Else

        Wscript.Echo "Domain user: " & objUser.Name

    End If

Next

Jak widać, zaczynamy od przypisania nazwy komputera do zmiennej o nazwie strComputer. Następnie dodamy znaki / na początku i na końcu nazwy tego komputera (atl-fs-01) i otrzymamy (/atl-fs-01/). Ta wartość jest przypisana do zmiennej o nazwie strTestString. Dlaczego musimy dodać / na początku i na końcu nazwy? Prawdę mówiąc to coś w rodzaju zabezpieczenia. Mało prawdopodobne jest to, że będziemy mieli domenę o nazwie atl-fs-01999, ale umieszczenie znaków / przed i po nazwie komputera gwarantuje, że przypadkowo zidentyfikujemy konto domeny jako konto lokalne.

Po zdefiniowaniu zmiennych zastosujemy poniższy wiersz kodu w celu połączenia się z lokalnym kontem Administratorów na komputerze atl-fs-01:

Set colGroups = GetObject("WinNT://" & strComputer & "/Administrators")

Teraz chcemy uruchomić pętlę, która przejdzie przez wartość właściwości Members, atrybut wielowartościowy zawierający listę wszystkich uczestników grupy Administratorów. W przypadku każdego użytkownika w grupie używamy poniższego wiersza kodu w celu określenia, czy nasz przykładowy ciąg (/atl-fs-01/) znajduje się gdzieś w ścieżce ADsPath:

If InStr(objUser.AdsPath, strTestString) Then

Jeżeli tak, zakładamy, że jest to użytkownik lokalny i wywołujemy echo tego faktu. Jeżeli nie znajdziemy ciągu, zakładamy, że jest to użytkownik domeny i wywołujemy echo tego faktu. Po wykonaniu wszystkich czynności otrzymamy raport podobny do poniższego:

Local user: Administrator

Domain user: Domain Admins

Domain user: kenmyerp

Domain user: InfoSec Secure Environment

Local user: pilarackerman

Domain user: jonathanhaas

Nie jest to najbardziej imponujący wynik na świecie, ale daje nam to, czego potrzebujemy.

Właśnie.

 Do początku strony Do początku strony

Centrum Skrypciarzy - Active Directory