Jump to content
Melde dich an, um diesen Inhalt zu abonnieren  
blob

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

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!

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Moin,

 

doch, du hast eine Testumgebung. Du hast aber keine Produktionsumgebung.

 

Manipulationen dieser Art führt man nicht in einem produktiven AD aus! Schnapp dir einen Virtualisierer und baue dir eine Test-VM!

 

Gruß, Nils

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
Melde dich an, um diesen Inhalt zu abonnieren  

×