Windows - Jelszó lejárati idők listázása a tartományban

forráskód letöltése
Windows NT-től kezdve fennáll a lehetőség, hogy a felhasználói jelszavaknak lejárati dátumot állítsunk be. A rendszer biztonságának szempontjából fontos, hogy ne használja senki hosszú időn keresztül ugyanazt a jelszót. Valami viszont hiányzik ebből a rendszerből: a lejárati idők gyors és egyszerű ellenőrzése. Hiánypótlásul az alábbiakban bemutatunk egy szkriptet, ami kilistázza a tartományban található felhasználói fiókokat, a hozzá tartozó jelszó utolsó módosításának és lejáratának dátumát, a hátralévő napok számát, illetve figyelmeztet, ha van lejárt jelszó.
Cikkünkhöz mellékeltük az alábbiakban tárgyalásra kerülő szkriptet "PasswordExpires.vbs" néven. Futtatása a "Start.bat" fájllal ajánlott, rendszergazdai jogosultsággal.
Azért fontos, hogy időnként megváltozzanak a jelszavak, mert ha valamelyik esetleg idegen kézbe kerül csak a lejárat vagy a következő módosítás időpontjáig ad lehetőséget a visszaélésekre. Active Directory tartományokban alapértelmezésben a maximális időtartam 42 nap. Rendszerint a felhasználók csak az utolsó pillanatban vagy azután hajtják végre az ekkor már megkövetelt cserét. Ezt a tényt és a rendszer biztonságát figyelembe véve lehet, hogy jobb csökkenteni a 42 napos határidőt. Amit a csoportházirend Számítógép konfigurációja > Windows beállításai > Biztonsági beállítások > Fiókházirend > Jelszóházirend > Jelszó maximális élettartama (Computer Configuration > Windows Settings > Security Settings > Account Policies > Password Policy > Maximum password age) házirend ponttal lehet megtenni.
Ha lejár a jelszó a felhasználó automatikusan értesítést kap és az operációs rendszer gondoskodik róla, hogy a "Jelszóházirend" ("Password Policy") beállításainak megfelelően hajtódjon végre a csere.
A szolgáltatás viszont nem teszi lehetővé a hátralévő idők ellenőrzését. Sőt azt is előfordulhat, hogy már rég lejárt a jelszó, de a tulajdonosa nem jelentkezett be vagy már nincs is a cégnél. Ez mindenképpen csökkenti a rendszer egészének biztonságát és lehetőséget ad az illetéktelen visszaélésekre. Hogy lehetne megvalósítani az ellenőrzést? Például a rendszergazdák és programozók eszközével: az LDAP protokollt használó szkriptekkel. Az alábbiakban bemutatunk egy lehetséges megoldást.
Szkriptünk első sorában utasítjuk a WSH (Windows Scripting Host) motort, hogy hagyja figyelmen kívül a futtatás során keletkező hibákat. Így ha nem lesz sikeres egy adat lekérdezése, nem szakad meg a futtatás, hanem tovább ugrik a következőre.
On Error Resume Next
A "Domain" változó értéke legyen a tartomány neve, LDAP szintaxis szerint.
Domain = "DC=world,DC=net"
Létrehozunk egy további változót, amely a felhasználói fiókok címtárbeli tárolási helyét tartalmazza, kiegészítve a "Domain" változó tartalmával. Példánkban feltételezzük, hogy a felhasználók a "Users" tárolóban találhatók.
LDAP = "LDAP://CN=Users," & Domain
Leendő listánk első elemeként megjelenítünk egy fejlécet.
Wscript.Echo "Jelszó lejárati idők"
Wscript.Echo "--------------------------"
A következő konstansokra azért van szükség, hogy az Active Directory által visszaadott lejárati időt át tudjuk konvertálni napokba.
Const ONE_HUNDRED_NANOSECOND = .000000100
Const SECONDS_IN_DAY = 86400
Kérdezzük le a tartományban található jelszavak maximális élettartamát. A szükséges információt a "maxPwdAge" tulajdonság tárolja.
Set objDomain = GetObject("LDAP://" & Domain)
Set objMaxPwdAge = objDomain.Get("maxPwdAge")
Némi matematikai számítások után a 64 bites integerben kapott időt átalakítjuk napokká és megjelenítjük a fejlécben.
  dblMaxPwdNano = Abs(objMaxPwdAge.HighPart * 2^32 + objMaxPwdAge.LowPart)
  dblMaxPwdSecs = dblMaxPwdNano * ONE_HUNDRED_NANOSECOND
  dblMaxPwdDays = Int(dblMaxPwdSecs / SECONDS_IN_DAY)
  WScript.Echo "Jelszavak megengedett maximális élettartama a tartományban: " & dblMaxPwdDays & " nap"
Meg kell tudnunk, hogy az "LDAP" változó által leírt címtári helyen melyek a felhasználói fiókok és közben lezárjuk a lista fejlécét.
Set objConf = GetObject(LDAP)
Wscript.Echo 
Wscript.Echo "-------------------------------------------------------------------"
Wscript.Echo 
Lekérjük a tárolóban található összes objektumot. A felhasználói fiókok osztály-tulajdonsága "user".
For Each child in objConf 
 if child.class = "user" then
Most következik a lista törzse. Írjuk ki a felhasználói fiók nevét ("Child.Name"), majd a "PasswordLastChanged" tulajdonságban szereplő dátumot, ami az utolsó jelszómódosítást tartalmazza.
   Set objUser = GetObject("LDAP://" & child.name & ",CN=users," & Domain)
   dtmValue = objUser.PasswordLastChanged
   Wscript.Echo Child.Name 
   WScript.Echo "   Utolsó módosítás dátuma: " & DateValue(dtmValue) & "  " & TimeValue(dtmValue)
A fenti adatokból és az aktuális dátumból ("Now") már könnyen kiszámolhatjuk, hogy mikor jár le a jelszó.
     WScript.Echo "   A jelszó lejáratának dátuma: " & DateValue(dtmValue + dblMaxPwdDays) & " (Még " & Int((dtmValue + dblMaxPwdDays) - Now) & " nap)."
Illetve azt is, ha már lejárt.
     If Int((dtmValue + dblMaxPwdDays) - Now) <= 0 Then
      WScript.Echo "!!! A jelszó lejárt !!!"
     End If
Zárjuk a listát, a ciklust és szabadítsuk fel az objektumváltozó által lefoglalt memóriát.
Wscript.Echo
 end if
Next
   Wscript.Echo Text
Set objConf = Nothing
Wscript.Echo "-------------------------------------------------------------------"
A szkriptet a várhatóan sok megjelenő adat miatt célszerű parancssorban a következő utasítással futtatni:
cscript szkriptnév.kiterjesztés
például:
cscript PasswordExpires.vbs
Megjegyzés: a szkript nem veszi figyelembe, ha egy felhasználói fióknál (pl. rendszergazda) be van állítva, hogy a jelszó soha nem jár le. Ez esetben hagyjuk figyelmen kívül a figyelmeztetést, de ajánlott, hogy ne legyenek ilyen fiókok.