Jump to content

Auslesen wann ein PW von einem User abläuft/abgelaufen ist


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo an die Gemeinde,

 

ich stehe gerade aufm Schlauch... ich habe hier ein Tool das mir alle DCs abfragt und mir dann zeigt wann ein User das letzte Mal angemeldet war, das letzte Mal das PAsswort geändert wurde und wann es ablaufen wird.

 

Jetzt will ich mit Boardmitteln gerne einen einzelnen DC abfragen. Aber mit der Console (AD Benutzer und Computer) sehe ich nichts... weiss jemand wie ich an die Info ran komme?

 

Danke im voraus!

Link zu diesem Kommentar

Hi,

 

du musst die acctinfo.dll aus den Account Lockout und Management Tools auf dem entsprechenden Client/Server registrieren. Mittels MMC, auf dem Rechner wo du die dll registriert hast, siehst du dann in den Eigenschaften des Benutzer unter dem Reiter Additional Account Info die nötigen Informationen.

 

Allerdings kannst du damit keinen Report generieren, der dir alle Benutzer des DC's anzeigt.

Link zu diesem Kommentar

Hallo,

 

also: Wann ein Benutzer das letzte Mal sein Passwort verändert hat, steht im Attribut pwdLastSet. Das Format ist leider das ziemlich schlecht lesbare Microsoft Integer8 (100-Nanosekunden-Abschnitte seit 1.1.1600!). Aber hier siehst du, wie man es umrechnen kann:

 

SelfADSI : Microsoft Timestamp / Interval Attribute mit Integer8 Syntax

 

Dann brauchst du noch das maximale Passwort-alter der Domäne, damit du das Ablaufdatum für jeden Benutzer errechnen kannst. Das steht (in der Default Domain Policy - und auch) im Domänenobjekt in der eigenschaft maxPwdAge. Auch dies ist Integer8, negativer Wert der 100 Nanosekunden-Abschnitte....

 

Naja, ein bisschen rumgerechnet, das alles mit einer ADO-Suche auf AD User gekoppelt - und das VB Script hier spuckt Dir Deine Liste bzgl. Passwort-Setzen aus:

 

ldapFilter = "(sAMAccountType=805306368)"     '  <- User-Objekte

Set rootDSE = GetObject("LDAP://rootDSE")
domainDN = rootDSE.Get("defaultNamingContext")

Set objDomain = GetObject("LDAP://" & domainDN)
Set interval = objDomain.maxPwdAge
domainPwAge = LargeIntegerToMinutes(interval)
WScript.Echo "Maximales Passwortalter ist: " & (domainPwAge/1440)  & " Tage"
WScript.Echo

Set ado = CreateObject("ADODB.Connection")
ado.Provider = "ADSDSOObject"
ado.Open "ADSearch" 
Set objectList = ado.Execute("<LDAP://" & domainDN & ">;" & ldapFilter & ";distinguishedName,pwdLastSet;subtree")

While Not objectList.EOF
   pWSetValue = objectList.Fields("pwdLastSet")
   pwLastSet = LargeIntegerToDate(pWSetValue)
   pwNextSet = DateAdd("n", domainPwAge, pwLastSet)

   WScript.Echo objectList.Fields("distinguishedName") & " : " & pwLastSet & " : " & pwNextSet

   objectList.MoveNext
Wend


'____________________ [ LargeIntegerToDate ]
'
'
Function LargeIntegerToDate(value)
'nimmmt einen Microsoft LargeInteger Wert (Integer8) und gibt das entsprechende Datum plus Uhrzeit zurück

   Set sho = CreateObject("Wscript.Shell")
   timeShiftValue = sho.RegRead("HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias")
   If IsArray(timeShiftValue) Then
       timeShift = 0
       For i = 0 To UBound(timeShiftValue)
           timeShift = timeShift + (timeShiftValue(i) * 256^i)
       Next
   Else
       timeShift = timeShiftValue
   End If

   i8High = value.HighPart
   i8Low = value.LowPart
   If (i8Low < 0) Then
       i8High = i8High + 1
   End If

   If (i8High = 0) And (i8Low = 0) Then
       LargeIntegerToDate = #1/1/1601#
   Else
       LargeIntegerToDate = #1/1/1601# + (((i8High * 2^32) + i8Low)/600000000 - timeShift)/1440
   End If
End Function


'_____________________________ [ LargeIntegerToMinutes ]
'
'
Function LargeIntegerToMinutes(value)
'nimmmt einen Microsoft LargeInteger Wert (Integer8) und gibt das entsprechende ...
'... Zeitinterval in Minuten zurück (-1 für "Never")

   If (value.HighPart = -2147483648) And (value.LowPart = 0) then
       LargeIntegerToMinutes = -1
   Else
       i8High = value.HighPart
       i8Low = value.LowPart
       If (i8Low < 0) Then
           i8High = i8High + 1
       End If

       LargeIntegerToMinutes = -(((i8High * 2^32) + i8Low)/600000000)
   End If
End Function

 

Vorsicht, wenn du >1000 Benutzer hast, dann mußt Du eine PagedResults-Suche durchführen. Dann muß nochmal ein bisschen verändert werden, siehe hier:

 

SelfADSI : LDAP Objekte im Verzeichnis suchen mit ADO

 

Gruß,

Philipp

Link zu diesem Kommentar

Danke Danke für die zahlreichen Antworten! :-)

 

Ich habe nun die DLL registriert. Mit dem Befehl W32tm /ntte <integer> kann man den Wert von pwdlastset im cmd Fenster auch umrechnen lassen. Ich habe nämlich versucht einen neuen Wert in pwdlastset einzufügen, damit ich ablaufende Accounts simulieren kann. Leider sagt mir ADSIEDIT dauernd, es wäre ein falscher Wert. Weiss jmd zufällig wie ich das Kennwortalter manipulieren kann? Habe leider keine Testumgebung und die Kennwortrichtlinie will ich nicht anfassen, gibt nur Schläge vom Chef ;-)

 

Greetz

Link zu diesem Kommentar

Hallo, ich auch nochmal,

 

also Du kannst den Wert von pwdLastSet auch garnicht auf einen bestimmten Wert ändern, selbst wenn du den korrekten Integer8-Wert eines bestimmten Datums hast. Nur die Werte 0 und -1 sind erlaubt, ansonsten gibt's ein Fehler DSID-031A0FB6 Invalid Argument...

 

Wenn Du eine W2K8 Umgebung hast, dann setz eine Fine Grained Password Policy und lass für deinen einen Testuser das PAsswort in einem Tag ablaufen....Ansonsten setzt Du Dir tatsächlich lieber mal kurz ein Test-AD auf, in dem du die Domain Paswortrichtlinien setzen kannst.

 

Gruß,

Philipp

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...