Zum Inhalt wechseln


Foto

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


  • Bitte melde dich an um zu Antworten
6 Antworten in diesem Thema

#1 blob

blob

    Senior Member

  • 399 Beiträge

 

Geschrieben 25. Mai 2010 - 07:57

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!
What goes around comes around!
+++
"Was sehen Sie auf Ihrem Bildschirm?" - "Ein Teddy den mir mein Freund geschenkt hat!"

#2 Necron

Necron

    Moderator

  • 11.556 Beiträge

 

Geschrieben 25. Mai 2010 - 08:19

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.

Cheers,
Daniel

-Daniel's Tech Blog-


#3 Daim

Daim

    Expert Member

  • 4.542 Beiträge

 

Geschrieben 25. Mai 2010 - 08:23

Servus:

LDAP://Yusufs.Directory.Blog/ - Die letzte Benutzeranmeldung herausfinden

oder mit:

net user <Benutzername> /Domain
Viele Grüße aus Mainz
Yusuf Dikmenoglu
LDAP://Yusufs.Directory.Blog/
Twitter: YusufsDSBlog

#4 P.Foeckeler

P.Foeckeler

    Junior Member

  • 117 Beiträge

 

Geschrieben 25. Mai 2010 - 11:28

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

#5 blob

blob

    Senior Member

  • 399 Beiträge

 

Geschrieben 26. Mai 2010 - 08:43

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
What goes around comes around!
+++
"Was sehen Sie auf Ihrem Bildschirm?" - "Ein Teddy den mir mein Freund geschenkt hat!"

#6 NilsK

NilsK

    Expert Member

  • 12.463 Beiträge

 

Geschrieben 26. Mai 2010 - 09:25

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

Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#7 P.Foeckeler

P.Foeckeler

    Junior Member

  • 117 Beiträge

 

Geschrieben 26. Mai 2010 - 10:31

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