Trzeba było znaleźć wszystkich użytkowników, którzy nie logowali się od dłuższego czasu i przenieść ich do innego OU.
Problemy jakie się pojawiły to wartość atrybutu LastLogonTimeStamp, która jest specyficzna (liczba milisekund od epoki) i przenoszenie obiektów w AD. O ile pierwsze było proste do wygooglania o tyle z drugim strasznie ludzie kombinują, piszą miliony linii kodu i generalnie żadne z tych rozwiązań mi się nie podobało. Chwila samodzielnego kombinowania, trochę rzeźby i olśnienie w postaci, że PowerShell to przecież… shell i że działają w nim komendy commandlinowe takie jak np. dsmove
Poniżej skrypt, który znajduje wszystkich w danym OU , którzy nie logowali się od 14 miesięcy i przenosi ich od OU inactive. Minimalne wymagania: domena w trybie “Windows Server 2003”
# script finds all users in specified OU who haven’t logged for last n months # and moves theirs accounts to another OU # Author Kuba Siatkowski http://interkreacja.pl/$howoldallowed = 14; #maximum time since last logon (months) $dom ="LDAP://OU=sourceou,DC=yourdomain,DC=com,DC=pl"; #search path $newparent ="OU=inactive,DC=yourdomain,DC=com,DC=pl"; #destination path for unused accounts #$Root = New-Object DirectoryServices.DirectoryEntry $strROOT $Root = New-Object DirectoryServices.DirectoryEntry $Dom $Searcher = New-Object DirectoryServices.DirectorySearcher $Searcher.SearchRoot = $root $searcher.Filter = “(&(objectClass=User)(!(objectClass=Computer)))“; $users = $searcher.findAll(); $lastallowed = [DateTime]::Now.AddMonths($howoldallowed * (-1)); foreach ($user in $users) { if (!($user.Properties.lastlogontimestamp -eq $Null)){ $lastlogon = [DateTime]::FromFileTime([Int64]::Parse($user.Properties.lastlogontimestamp)); if (($lastlogon -lt $lastallowed)){ write-host $user.Properties.cn “; “ -NoNewLine; write-host $lastlogon “; “ -NoNewLine; write-host $user.Properties.distinguishedname; dsmove $de.distinguishedName -newparent $newparent } } else { write-host $user.Properties.cn “never logged on“; } }
Tomek
Grzesiek
kfaz
kfaz
nExoR
kfaz