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. 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!
[…] some mistakes that I would like to highlight. As always – you can read about those both in Polish and in English. […]
Event 4: My notes… | PowerShell.org said this on 28 Maj, 2013 @ 3:32 pm |