Jak sprawdzić identyfikator GUID konta użytkownika, jeżeli posiadam tylko login oraz nazwę 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 sprawdzić identyfikator GUID konta użytkownika, jeżeli posiadam tylko login oraz nazwę domeny?
Cześć, Skrypciarze! Jak zdobyć identyfikator GUID dla konta użytkownika, o którym jedyne co wiem, to jego login oraz domena?
-- IU
Cześć, IU. Najlepsze w skrypciarzu piszącym te artykuły jest.... tak z głowy nie wymyślę, chociaż chciałem zacząć pompatycznie i inteligentnie. No, ale widocznie za dużo rzeczy robię wyśmienicie i dlatego mam takie problemy z wymienieniem akurat tej jednej, najlepszej. (Mam przy tym nadzieję, że może skrypciarska Pani Redaktor będzie chciała zamieścić tu krótką listę zalet autora...) Może rzeczywiście nie jestem dobry w wymienianiu listy własnych zalet, ale na pewno lubię przechodzić od razu do sedna sprawy. Drogi IU, sednem tym jest fakt, że mamy tu do czynienia z małym problemem tłumaczeniowym, ponieważ nazwa domeny zapisana jest w konwencji Windows NT (na przykład: fabrikam\kenmyer), a my potrzebujemy przetłumaczyć ją na identyfikator GUID użytkownika (na przykład: {97614339-087d-4f26-9fc5-86e8e7425ce7}). Teraz decydujące pytanie: co należy zrobić, jeżeli chcemy przetłumaczyć A na B? Właśnie! Użyć słownika tudzież tłumacza!
Tylko, że to nie takie proste – nie da się po prostu przetłumaczyć nazwy domeny systemu Windows NT 4. Czy da się? Spójrzcie poniżej:
Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_GUID = 7
strUserName = "fabrikam\kenmyer"
Set objTranslator = CreateObject("NameTranslate")
objTranslator.Init ADS_NAME_INITTYPE_GC, ""
objTranslator.Set ADS_NAME_TYPE_NT4, strUserName
strUserGUID = objTranslator.Get(ADS_NAME_TYPE_GUID)
Wscript.Echo strUserGUID
Musimy przyznać, że powyższy skrypt dal nam sporo uciechy, mogliśmy bowiem użyć w końcu funkcji IADsNameTranslate (j.ang.), interfejsu ADSI wbudowanego w system operacyjny. Jak sama nazwa wskazuje, interfejs IADsNameTranslate jest w stanie przetłumaczyć wiele nazw w usłudze Active Directory. Wystarczy podać funkcji IADsNameTranslate jakąś nazwę wyróżniającą i otrzymamy jej wartość display name, jeżeli zaś podamy funkcji IADsNameTranslate nazwę kanoniczną, to możemy otrzymać jej wartość jako nazwę UPN. W końcu, jeżeli podać naszej funkcji IADsNameTranslate nazwę domeny systemu Windows NT, to możemy otrzymać poszukiwany przez nas identyfikator GUID.
Mamy przynajmniej taką nadzieję.
Nasz skrypt zaczyna się od zdefiniowania trzech stałych:
- ADS_NAME_INITTYPE_GC (o wartości 3) instruuje skrypt o tym, że chcemy sprawdzić informacje kontaktując się z serwerem katalogu globalnego.
- ADS_NAME_TYPE_NT4 (również o wartości 3) określa nazwę domeny NT 4.
- ADS_NAME_TYPE_GUID (o wartości 7) określa identyfikator GUID w usłudze Active Directory.
Po zdefiniowaniu tych stałych przypisujemy nazwę użytkownika do zmiennej strUserName, zwracając szczególna uwagę na to, by podać ją w konwencji domain\user name:
strUserName = "fabrikam\kenmyer"
Tworzymy następnie wystąpienie obiektu NameTranslate , identyfikatora ProgID dla interfejsu IADsNameTranslate. Przywołujemy potem metodę Init, która łączy nas z usługą Active Directory; w tym przypadku łączy nas ona z serwerem katalogu globalnego, ponieważ podaliśmy stałą ADS_NAME_INITTYPE_GC jako parametr metody. (Zwróćcie uwagę, ze drugim parametrem był tu pusty ciąg znaków – dzięki niemu możemy określić nazwę komputera lub domeny. Nie potrzebujemy tego robić, jeżeli łączymy się serwerem katalogu globalnego, ale musimy, jeżeli pusty ciąg znaków będzie u nas parametrem opcjonalnym, w przeciwnym bowiem razie nasz skrypt nie będzie działał).
To, co nazywamy metodą Init, wygląda w następujący sposób:
objTranslator.Init ADS_NAME_INITTYPE_GC, ""
W taki zaś sposób wygląda u nas metoda Set:
objTranslator.Set ADS_NAME_TYPE_NT4, strUserName
Jak sami widzicie, Set ma u nas dwa parametry: nazwę usługi Active Directory, którą trzeba przetłumaczyć (zawarta w stałej ADS_NAME_TYPE_NT4) oraz samą nazwę (zawarta w zmiennej strUserName). Po wywołaniu metody Set, przywołujemy metodę Get. Co chcemy otrzymać? Prosta sprawa: chcemy otrzymać identyfikator GUID użytkownika, coś, co wskazujemy przez podanie stałej ADS_NAME_TYPE_GUID. Obiekt NameTranslate pobierze identyfikator GUID i przechowa go w zmiennej o nazwie strUserGUID:
strUserGUID = objTranslator.Get(ADS_NAME_TYPE_GUID)
Czy zatem nasz skrypt zadziała? Oczywiście, że tak. Oto, co widzimy, jeżeli wywołamy echo wartości strUserGUID:
{97614339-087d-4f26-9fc5-86e8e7425ce7}
Super, co nie?
Oto lista innych formatów nazw, z którymi można również pracować:
Stała | Wartość | Opis |
ADS_NAME_TYPE_1779 | 1 | Format Name, jak w RFC 1779. Na przykład: „CN=Jeff Smith,CN=users,DC=Fabrikam,DC=com”. |
ADS_NAME_TYPE_CANONICAL | 2 | Format nazwy kanonicznej, na przyklad: „Fabrikam.com/Users/Jeff Smith”. |
ADS_NAME_TYPE_NT4 | 3 | Format nazwy konta dla systemu Windows NT 4.0, na przykład: „Fabrikam\JeffSmith”. |
ADS_NAME_TYPE_DISPLAY | 4 | Format Dispaly name, na przykład: „Jeff Smith”. |
ADS_NAME_TYPE_DOMAIN_SIMPLE | 5 | Prosty format nazwy domeny, na przykład: „JeffSmith@Fabrikam.com”. |
ADS_NAME_TYPE_ENTERPRISE_SIMPLE | 6 | Prosty format nazwy przedsiębiorstwa, na przykład: „JeffSmith@Fabrikam.com”. |
ADS_NAME_TYPE_GUID | 7 | Format identyfikatora GIUD, na przykład: „{95ee9fff-3436-11d1-b2b0-d15ae3ac8436}”. |
ADS_NAME_TYPE_USER_PRINCIPAL_NAME | 9 | Format głównej nazwy użytkownika, na przykład: „JeffSmith@Fabrikam.com”. |
ADS_NAME_TYPE_CANONICAL_EX | 10 | Rozszerzony format nazwy kanonicznej, na przykład: „Fabrikam.com/Users Jeff Smith”. |
ADS_NAME_TYPE_SERVICE_PRINCIPAL_NAME | 11 | Format głównej nazwy usługi, na przykład: „www/www.fabrikam.com@fabrikam.com”. |
Spróbujcie użyć któregoś z powyższych i zobaczcie, co się stanie. Nie omówiliśmy tu za wnikliwie interfejsu IADsNameTranslate, ale nic tak naprawdę bardziej wnikliwego nie trzeba o nim wiedzieć więcej. Omawiane tu podejście jest o wiele szybsze i mniej skomplikowane niż skrypt poszukiwania w usłudze Active Directory, co może również być alternatywą dla wyszukiwania użytkowników i uzyskiwania ich identyfikatorów GUID.
Mamy nadzieję, IU, że pomogliśmy Ci w Twoim problemie tłumaczeniowym, szczególnie teraz bowiem, po pobycie we Włoszech, stałem się specem od wszelkich problemów i porad tłumaczeniowych. Oczywiście głównym specem od problemów tłumaczeniowych przy zamawianiu pizzy lub spaghetti, lub kawy o 158266368263 uroczych nazwach, w zależności od minimalnych zmian zawartości...
Do początku strony |