Scripting Games: moje notatki – 4

Przyszła pora, by podsumować czwartą już konkurencję tegorocznych Scripting Games. Tym razem temat silnie związany z Active Directory – jedną z technologii, którą poza PowerShellem darzę silnym (i chyba odwzajemnionym) uczuciem. Puszczam oczko Były pomysły wyśmienite, były marne, było też kilka rzeczy, które – choć z pozoru wyglądały dobrze, to jednak wynik dawały błędny. Na początek – kilka spraw z AD związanych właśnie.

Rozumieć ADSI

Nie da się ukryć, że właściwy wynik najprościej było uzyskać przy pomocy narzędzi, które nie wymagały zagłębiania się w ADSI. Wielu uczestników jednak postanowiło zmierzyć się z “gołym” PowerShellem. I niestety, nie uniknęli dwóch błędów wynikających z tego jak Active Directory działa. Po pierwsze: zablokowane konta. Kilka osób korzystało przy ustaleniu, czy konto jest zablokowane, z atrybutu userAccountControl – to, niestety, nie działa… Zablokowane konto można sprawdzić na kilka sposób, ale choć dokumentacja wskazuje, że ten atrybut tę informację też powinien nam zwrócić, to w istocie tak się nie dzieje. Kolejny problem dotyczył daty ostatniego logowania. Atrybut lastLogon, który informację o ostatnim logowaniu przechowuje, nie jest replikowany między kontrolerami. Jeśli więc poprzestaniemy na tym polu i “przetłumaczymy” wartość tego pola na DateTime, to może się okazać, że nasz użytkownik zmieniał hasło wczoraj, a logował się po raz ostatni na początku 17-tego wieku…

Sprawa osobna, bardziej kosmetyczna – tworzenie obiektów. Po pierwsze – warto korzystać z akceleratorów (ADSI/ ADSISearcher). Po drugie – odpowiednich konstruktorów, czy to przy pomocy cmdletu New-Object, czy też – jeśli korzystamy już z PowerShella v3 – wykorzystanie nowej składni tworzenia obiektów przy pomocy tablicy skrótów:

(New-Object ADSISearcher -ArgumentList @(            
    [ADSI]''            
    '(&(objectClass=user)(objectCategory=person))'            
    , @(             
        'name'            
        'pwdLastSet'            
        'lastLogon'            
        'userAccountControl'            
        'lockoutTime'            
    )            
) -Property @{            
    PageSize = 1000            
}).FindAll()            
            
([ADSISearcher]@{            
    Filter = '(&(objectClass=user)(objectCategory=person))'            
    PageSize = 1000            
    SearchRoot = [ADSI]''            
}).FindAll()

Rozumieć Active Directory module

Korzystający z modułu Active Directory też nie uniknęli potknięć, choć tu o nie było trudniej. Przede wszystkim widać było, że nie wszyscy znają możliwości tego modułu: zamiast skorzystać z właściwości PasswordLastSet – “tłumaczyli” pwdLastSet. Zamiast skorzystać z właściwości LockedOut – wyliczali na różne sposoby, czy konto jest zablokowane. Było też kilka skryptów, które mieszały ADSI z poleceniami z tego modułu. Troszkę to dla mnie niezrozumiałe. Jeśli i tak zamierzam korzystać z modułu (czyt. mój skrypt bez tego modułu nie zadziała), to po co męczyć się z ADSI? I wreszcie grzech niewybaczalny: wielu uczestników, szczególnie początkujących, pobierało wszystkie właściwości wszystkich kont w AD. Zważywszy, że wykorzystywanych było ledwie kilka właściwości, z niewielu kont, wydaje się to dalece nieoptymalne…

Rozumieć Get-Random

Jeden z elementów całego zadania to wybranie losowej grupy użytkowników do raportu. Naturalnym wyborem wydawało się skorzystanie z polecenia Get-Random. Widać jednak było, że wielu uczestników nie skorzystało z okazji by poznać dokładnie ten cmdlet… Sortowanie obiektów w oparciu o wartość Get-Random było chyba najgorszym przypadkiem niezrozumienia tego, co polecenie oferuje. Drugi w kolejności był “grzech” polegający na dodawaniu do wszystkich obiektów z AD właściwości liczbowej, w oparciu o którą później “losowano” finalny zestaw. Wreszcie – kolejność. Jeśli wybrać z całej domeny mamy ledwie 20 użytkowników, to nie ma powodu by przed losowanie przetwarzać wszystkich (np. przy pomocy Select-Object). Podobnie, nie ma sensu by tworzyć zmienną zawierającą wszystkich użytkowników, o wiele wydajniej jest zrobić to dopiero wtedy, gdy pozostaną już tylko “wybrańcy”. I to wszystko na dziś. Do przeczytania po zamknięciu zadania 5-tego! Uśmiech

~ - autor: Bartek Bielawski w dniu Maj 25, 2013.

Jedna odpowiedź to “Scripting Games: moje notatki – 4”

  1. […] some mistakes that I would like to highlight. As always – you can read about those both in Polish and in English. […]

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

 
%d blogerów lubi to: