Centrum Skryptów - Active Directory

Jak usunąć uczestników grupy, których konta znajdują się w określonej jednostce OU?

Udostępnij na: Facebook

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 usunąć uczestników grupy, których konta znajdują się w określonej jednostce OU?

Cześć, Skrypciarze! Mam pewien problem i w sumie nie wiem jak go rozwiązać. Chciałbym usunąć pewne osoby z mojej grupy w usłudze Active Directory, a dokładnie te, których konta znajdują się w pewnej określonej jednostce OU. Jak to zrobić?

-- AD

Cześć, AD! Nie da się ukryć, ale to właśnie Twojemu pytaniu poświęcimy pierwszy artykuł w 2008 roku. Czym zaś charakteryzuje się rok 2008? Jest oczywiście piątym rokiem naszej skrypciarskiej działalności. Pierwszy artykuł pojawił się w sierpniu 2004, tak więc jeśli policzyć lata 2004, 2005, 2006, 2007 i 2008, mamy pięć lat działalności. No dobra, trochę naciągamy, cztery z kawałkiem, ale kalendarzowo nie da się ukryć, że pięć. Nie muszę chyba wspominać, że oprócz nieustannego pasma sukcesów jest to także rekord w księdze Guinnessa, jeżeli wziąć pod uwagę najdłużej ukazujące się regularne artykuły poświęcone skryptom. Jeżeli interesują Was również inne fakty, to proszę bardzo:

  • Nieoficjalnie czytacie właśnie 837. artykuł z serii „Cześć, Skrypciarze!”. W artykułach nie wyprzedzimy pewnie serialu „Moda na sukces”, ale obiecujemy – będziemy równie wytrwali w pomysłach. No i oczywiście uczcimy jakoś 1000. artykuł, żeby było jasne. Mamy nadzieję, że Skrypciarska Pani Redaktor dotrwa do tej rocznicy, bo lata już nie te…
  • Z wspomnianych 837 artykułów, 836 wyszło spod klawisza mojej skromnej osoby, jeden zaś spod klawisza jeszcze skromniejszej Jean Ross. Osobie, która odgadnie, który artykuł jest autorstwa Jean Ross, prześlemy oczywiście skrypciarską koszulkę z jej autografem.
  • Ludzie z TechNetu odradzali nam pisanie artykułów codziennych, ich zdaniem z artykułami miesięcznymi byłoby o wiele mniej pracy. Po napisaniu 837.artykułu potwierdzam – mieli rację. Co za błyskotliwość!
  • Jeżeli porównacie te artykuły z wczesnymi, nie będziecie mogli oprzeć się wrażeniu, ze im dalej od 2008 tym są one mniej… barwne. Zdecydowanie za mało o futbolu, o Pani Redaktor, wtedy jeszcze uczyliśmy się dobrego humoru. Teraz opanowaliśmy już tę umiejętność do perfekcji, więc korzystamy (a Wy z nami).

Dzisiejszy artykuł jest bardzo prosty i to nie tylko dlatego, że już go przecież napisaliśmy. Dlaczego? Ponieważ w trakcie pisania powyższej przezabawnej anegdoty i przytaczania tak cennych faktów, dostaliśmy drugą wiadomość email od AD, w której pisze on, że udało mu się samemu rozwiązać nurtujący go problem. W sumie proponujemy podobny sposób na usunięcie wszystkich uczestników grupy, których konta znajdują się w określonej jednostce OU:

Const ADS_PROPERTY_DELETE = 4Set objGroup = GetObject("LDAP://CN=Finance Users,OU=Finance,DC=fabrikam,DC=com") For Each strUser in objGroup.Member     If InStr(strUser,"OU=Kentucky Office,DC=fabrikam,DC=com") Then         objGroup.PutEx ADS_PROPERTY_DELETE, "member", Array(strUser)         objGroup.SetInfo     End IfNext
Const ADS_PROPERTY_DELETE = 4



Set objGroup = GetObject("LDAP://CN=Finance Users,OU=Finance,DC=fabrikam,DC=com") 



For Each strUser in objGroup.Member 

    If InStr(strUser,"OU=Kentucky Office,DC=fabrikam,DC=com") Then 

        objGroup.PutEx ADS_PROPERTY_DELETE, "member", Array(strUser) 

        objGroup.SetInfo 

    End If

Next
Do wiadomości AD i … innych. Naprawdę doceniamy to, że przysłałeś nam odpowiedź na zadane przez siebie samego pytanie. Miło byłoby, gdyby inni także poszli za Twoim przykładem. Może takie małe postanowienie noworoczne???

Szkoda co prawda, że nie przesłałeś nam całego artykułu, sami musimy więc opatrzyć Twój skrypt komentarzem. Zaczynamy zatem od zdefiniowania stałej ADS_PROPERTY_DELETE i ustawienia jej wartości na 4; za chwilę oczywiście wytłumaczymy, po co nam ona potrzebna. Po zdefiniowaniu stałej używamy poniższego wiersza kodu i łączymy się z naszą grupą docelową; nazwiemy ją tu Finance Users (jest to grupa, znajdująca się w jednostce organizacyjnej Finance OU w domenie fabrikam.com):

Set objGroup = GetObject("LDAP://CN=Finance Users,OU=Finance,DC=fabrikam,DC=com")

Jak zapewne wiecie, każdy obiekt typu grupa posiada atrybut Member. Nie jest to najtrafniejsza nazwa, o wiele jaśniej byłoby, gdyby nazywała się Members, jako że jest atrybutem zawierającym kolekcję wszystkich członków danej grupy. Nazwa nazwą, my możemy przecież przejść przez kolekcję wszystkich uczestników za pomocą pętli For Each, co też niniejszym robimy:

For Each strUser in objGroup.Member

Wewnątrz pętli chcemy oczywiście wykasować wszystkich uczestników grupy, których konto znajduje się w danej jednostce OU. W tym przypadku jest to jednostka organizacyjna Kentucky Office w domenie fabrikam.com. Skąd wiadomo, że dany użytkownik ma swoje konto właśnie w tej jednostce? Dobre pytanie, choć mało skomplikowane – dane takie przechowywane są właśnie w atrybucie Member jako oddzielne nazwy, z których każda wygląda w następujący sposób:

CN=Ken Myer,OU=Kentucky Office,DC=fabrikam,DC=com

Skąd wiemy, ze uczestnik grupy ma swoje konto właśnie w tej jednostce organizacyjnej? Musimy tylko sprawdzić, czy wartość ciągu OU=Kentucky Office,DC=fabrikam,DC=com może zostać wytropiona w jakiejś nazwie. Używamy w tym celu oczywiście funkcji InStr skryptu VBS:

If InStr(strUser,"OU=Kentucky Office,DC=fabrikam,DC=com") Then

Jeżeli InStr zwróci wartość False (0), powracamy do pętli i sprawdzamy kolejnego uczestnika grupy. Jeżeli InStr zwróci nam wartość True (lub, dokładniej, każdą inną wartość niż 0), uruchamiamy następujące dwa wiersze kodu:

objGroup.PutEx ADS_PROPERTY_DELETE, "member", Array(strUser) 

objGroup.SetInfo

W pierwszym wierszu używamy metody PutEx, dzięki której usuwamy wybranego uczestnika z grupy (takiego oczywiście, który znajduje się w jednostce organizacyjnej Kentucky Office). Musimy nadać naszej metodzie następujące parametry:

  • ADS_PROPERTY_DELETE. To stała, którą zdefiniowaliśmy na samym początku skryptu. Właśnie ona instruuje metodę PutEx, aby usunęła daną wartość z jakiegoś konkretnego atrybutu konta grupy.
  • "member". Ten parametr mówi nam, z którego atrybutu chcemy usunąć daną wartość. Jest to oczywiście parametr Member. Nie jest to zatem zbieg okoliczności, że drugi parametr, jaki nadajemy metodzie PutEx to właśnie nazwa atrybutu, z którym chcemy pracować, tj. „member”.
  • Array(strUser). Trzeci parametr określa wartość, jaką chcemy usunąć, ponieważ, jak zapewne pamiętacie, atrybut Member może zawierać i zwykle zawiera wiele wartości. W przypadku grupy usuwamy z niej danego uczestnika, podając jego nazwę wyróżniającą. Nie jest to skomplikowane, bowiem uczestnicy grupy wymienieni są właśnie za pomocą takiej nazwy. Musimy jednak pamiętać, by podać tę wartości w tablicy, nawet jeżeli jest będzie ona zawierać tylko jeden element. Dlaczego? Ponieważ kiedyś ktoś ustalił, że wszystkie wartości nadane metodzie PutEx muszą zawsze zostać podane w tablicy.

W końcu, w drugim wierszu, przywołujemy metodę SetInfo, która oficjalnie usuwa wszystkich wybranych uczestników z danej grupy. Metoda SetInfo jest bardzo ważna i nie można się bez niej obyć. Pominięcie tego fragmentu sprawi, że użytkownik zostanie usunięty z grupy tylko pozornie. Dzieje się tak dlatego, że zmiana zachodzi w lokalnym buforze, czyli „wirtualnej” wersji konta grupy, zapisanej w pamięci komputera. Jednak wywołanie metody PutEx ma wpływ jedynie na wirtualne konto grupy; w celu zmodyfikowania właściwego konta Active Directory należy wywołać metodę SetInfo.

Myślę, ze taka odpowiedź jest zadowalająca, chociaż nie wiem, po co ją napisaliśmy, skoro odpowiedziałeś sobie sam na pytanie, AD! Dzięki temu jednak będziemy mieli więcej czasu na wymyślanie arcyzabawnych anegdot na temat futbolu, Skrypciarskiego Syna oraz Pani Redaktor. Kto wie, może od czasu do czasu pojawi się nawet coś na temat skryptów…

 Do początku strony Do początku strony

Centrum Skryptów - Active Directory