Jak odróżnić lokalnych użytkowników od użytkowników domeny?
Skrypciarze odpowiadają na Wasze pytania
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! 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ść, 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 |