none
LastLogon DC übergreifend RRS feed

  • Frage

  • Guten Morgen zusammen,

    ich schlage mich mit folgendem Script schon einige Zeit herum und vieleicht habt Ihr ein Verbesserungsvorschlag für mich:

    # Alle Konten anzeigen die sich vor einer bestimmten Zeit nicht angemeldet haben

    cls

    $domain = [system.directoryservices.activedirectory.domain]::GetCurrentDomain

    $DCs = $domain.FindAllDomainControllers()

     foreach($dc in $dcs)

    Als Zusatzinfo sei noch folgendes gesagt. Ziel ist es, alle Accounts angezeigt zu bekommen, die sich DC übergreifgend vor einem bestimmten Tag nicht angemeldet haben.

    Gruß Karsten

     

    {Search-ADAccount -AccountInactive -DateTime "1/1/2007" | FT Name}

    ()
    Samstag, 26. März 2011 06:18

Antworten

  • Hallo Karten,

    OK ein wenig recherchiert und nun ist es klar. das Attribut lastlogon wir nicht zwischen den Domaincontrollern repliziert. Seit Windows Serrver 2003 gibt es das Attribut lastlogontimestamp welches replizierrt wird. Dies bedeutet aberr dass die foreach schleife ueber alle Domaincontrollerr ueberrfluessig ist. Es reicht also genau einen DC nach den logon Informationen zu befragen.

    Allerdings beinhaltet das Attribut lastlogontimestemp nicht unbedingt den letzten logon. Es weicht ohne spezielle Konfiguration 9-14 Tage vom tatsaehclichen logon Zeitpunkt ab.

    Eine genauere Beschreibung der beiden Attribute findest Du unter:

    http://blogs.technet.com/b/askds/archive/2009/04/15/the-lastlogontimestamp-attribute-what-it-was-designed-for-and-how-it-works.aspx

    Wenn du genauere Logon Zeitpunkte benötigst muss das Eventlog ausgewertet werrden aber aus meiner Sicht ist dies problematisch, da ggf. je nach Anmeldeaufkommen nicht die Verrfuegbarkeit einer bestimmten zeitspanne garantierrt weeerden kann.

    Viele Gruesse

      Thomas


    regards Thomas Paetzold visit my blog on: http://sus42.wordpress.com
    Samstag, 26. März 2011 12:27
  • OK, nun habe ich das Beispielscript etwas angepasst so dass es besser Deinen Anforderungen genuegt. Du musst nur noch im unteren Teil die Tage eintragen die vom aktuellen datum abgezogen werden sollen um sozusagen das letzte Anmeldedatum zu ermitteln gegen das Du die letzte anmeldung überprüfen möchtest.

    Hier nun das fertige Script inkl. der Anpassung:

    Import-Module ActiveDirectory

    function Get-ADUserLastLogon([string]$userName)
    {
     $dcs = Get-ADDomainController -Filter {Name -like "*"}
     $time = 0
     foreach($dc in $dcs)
     {
      $hostname = $dc.HostName
      $user = Get-ADUser $userName | Get-ADObject -Properties lastLogon
      if($user.LastLogon -gt $time)
      {
       $time = $user.LastLogon
      }
     }
     $dt = [DateTime]::FromFileTime($time)
    return $dt
    # Write-Host $username "last logged on at:" $dt
    }

    # datum ermitteln dieser Wert muss angepasst werden
    $date = (get-date).adddays(-5)

    # Alle Active directory Benutzerr auslesen
    $users = get-aduser -filter *
    foreach ($user in $users) {
     $lastlogon = get-aduserlastlogon $user
     if ($lastlogon -lt $date) {
       write-host $user $lastlogon 
     }


    }

     


    regards Thomas Paetzold visit my blog on: http://sus42.wordpress.com
    Samstag, 26. März 2011 11:45

Alle Antworten

  • Hallo dies ist kein Problem unter http://technet.microsoft.com/de-de/library/dd378867(WS.10).aspx findest Du ein entsprechendes Beispielscript, das genau das macht was Du willst.

     

     


    regards Thomas Paetzold visit my blog on: http://sus42.wordpress.com
    Samstag, 26. März 2011 09:54
  • Hallo, leider kann ich dort kein Beispielscript finden. Könntest Du es hier mal posten?

    Gruß und Danke, Karsten

    Samstag, 26. März 2011 10:33
  • Aber natuerlich. Hier kommt es:

     

    Import-Module ActiveDirectory
    
    function Get-ADUserLastLogon([string]$userName)
    {
     $dcs = Get-ADDomainController -Filter {Name -like "*"}
     $time = 0
     foreach($dc in $dcs)
     { 
      $hostname = $dc.HostName
      $user = Get-ADUser $userName | Get-ADObject -Properties lastLogon 
      if($user.LastLogon -gt $time) 
      {
       $time = $user.LastLogon
      }
     }
     $dt = [DateTime]::FromFileTime($time)
     Write-Host $username "last logged on at:" $dt }
    
    Get-ADUserLastLogon -UserName SaraDavis

     

     


    regards Thomas Paetzold visit my blog on: http://sus42.wordpress.com
    Samstag, 26. März 2011 11:08
  • OK, nun habe ich das Beispielscript etwas angepasst so dass es besser Deinen Anforderungen genuegt. Du musst nur noch im unteren Teil die Tage eintragen die vom aktuellen datum abgezogen werden sollen um sozusagen das letzte Anmeldedatum zu ermitteln gegen das Du die letzte anmeldung überprüfen möchtest.

    Hier nun das fertige Script inkl. der Anpassung:

    Import-Module ActiveDirectory

    function Get-ADUserLastLogon([string]$userName)
    {
     $dcs = Get-ADDomainController -Filter {Name -like "*"}
     $time = 0
     foreach($dc in $dcs)
     {
      $hostname = $dc.HostName
      $user = Get-ADUser $userName | Get-ADObject -Properties lastLogon
      if($user.LastLogon -gt $time)
      {
       $time = $user.LastLogon
      }
     }
     $dt = [DateTime]::FromFileTime($time)
    return $dt
    # Write-Host $username "last logged on at:" $dt
    }

    # datum ermitteln dieser Wert muss angepasst werden
    $date = (get-date).adddays(-5)

    # Alle Active directory Benutzerr auslesen
    $users = get-aduser -filter *
    foreach ($user in $users) {
     $lastlogon = get-aduserlastlogon $user
     if ($lastlogon -lt $date) {
       write-host $user $lastlogon 
     }


    }

     


    regards Thomas Paetzold visit my blog on: http://sus42.wordpress.com
    Samstag, 26. März 2011 11:45
  • Hallo,

    vielen Dank.

    Ist das wirklich der Wert LastLogonTimeStamp oder nur der Wert LatLogon?

    Gruß, Karsten

    Samstag, 26. März 2011 11:53
  • Hallo Karten,

    OK ein wenig recherchiert und nun ist es klar. das Attribut lastlogon wir nicht zwischen den Domaincontrollern repliziert. Seit Windows Serrver 2003 gibt es das Attribut lastlogontimestamp welches replizierrt wird. Dies bedeutet aberr dass die foreach schleife ueber alle Domaincontrollerr ueberrfluessig ist. Es reicht also genau einen DC nach den logon Informationen zu befragen.

    Allerdings beinhaltet das Attribut lastlogontimestemp nicht unbedingt den letzten logon. Es weicht ohne spezielle Konfiguration 9-14 Tage vom tatsaehclichen logon Zeitpunkt ab.

    Eine genauere Beschreibung der beiden Attribute findest Du unter:

    http://blogs.technet.com/b/askds/archive/2009/04/15/the-lastlogontimestamp-attribute-what-it-was-designed-for-and-how-it-works.aspx

    Wenn du genauere Logon Zeitpunkte benötigst muss das Eventlog ausgewertet werrden aber aus meiner Sicht ist dies problematisch, da ggf. je nach Anmeldeaufkommen nicht die Verrfuegbarkeit einer bestimmten zeitspanne garantierrt weeerden kann.

    Viele Gruesse

      Thomas


    regards Thomas Paetzold visit my blog on: http://sus42.wordpress.com
    Samstag, 26. März 2011 12:27
  • Hi Thomas,

    Ziel dieses Scriptes ist es, einmal im Monat eine Auswertung zu machen, ob User sich seid 90 Tagen nicht mehr angemeldet haben. Mit Hilfe dieser Information, kann  ich Nachforschen ob diese User vieleicht gar nicht mehr benötigt werden.

    Deshalb habe ich versucht ein Script zu schreiben das in der kompletten Root-Domaine nach Usern sucht, bei denen dies eintrift. Nach dem Atribute LastLogon zu suchen, war relativ einfach. Das Attribute LastLogonTimeStamp abzufragen habe ich leider nicht geschaft.

    Vieleicht hast Du noch ne Idee?

    Gruß und Dank, Karsten

    Samstag, 26. März 2011 12:55
  • So, nun hab eich folgendes Script geschrieben was mit das LastLogonDate (ist LastLogonTimeStamp) ausgibt.

    Get-ADUser

     

     

     

    Wie schaffe ich es nun, dass in der kompletten Gesamtstrukur sucht und nicht nur in einem Baum?

    Gruß und Dank, Karsten

    -Filter * -Properties LastLogonDate | Sort-Object -Property LastLogonDate -descending | FT -Property Name, LastLogonDate -A
    Samstag, 26. März 2011 13:02
  • Hi Karsten,

    das verstehe ich nun nicht. Bei mir funktioniert das Script mit beiden Attributen du musst einfach nur lastlogon in lastlogontimestap austauschen. Allerdings macht die foreach Schleife ueber alle Domaincontrollerr keinen sinn wenn du das Attribut lastlogontimestamp benutzt. Da diese Information auf allen DCs identisch ist, da dieses Attribut zwischen den DCs repliziert wird.

    Grundsetzlich verstehe ich nun aber die Diskussion nicht. Das Script funktioniert doch oder? Es wird der lastlogonzeitpunkt aller DCs fuer einen bestimmten Benutzer errmittelt und davon das aktuellste Datum ermittelt. d.h. die Funktion gibt den letzten logon Zeitpunkt eines Benutzerrs als Wert zurueck. Du musst nun nur noch die Zahl -5 in -90 austauschen und schon funktioniert das Script genau in Deinem Szenario.

    Viele Gruesse

       Thomas


    regards Thomas Paetzold visit my blog on: http://sus42.wordpress.com
    Samstag, 26. März 2011 13:08
  • Hallo Thomas,

    ich nehme alles zurück und behaupte das Gegenteil. Es Funktioniert.

    Vielen Dank für deine Hilfe!

    Gruß, Karsten

    Samstag, 26. März 2011 13:13
  • Hallo Karsten,

    koentest Du dnn diese Fragen noch als beantwortet einstufen? Schon jetzt vielen Dank.

    Viele Gruesse

     

      Thomas


    regards Thomas Paetzold visit my blog on: http://sus42.wordpress.com
    Samstag, 26. März 2011 13:15
  • Im genannten Skript fehlt der Get-AdUser switch -Server $hostname. Anderenfalls wird das LastLogon Value nur vom verbundenen DC verwendet - die anderen DCs aber garnicht abgefragt.

    $user = Get-ADUser $userName -Server $hostname | Get-ADObject -Properties lastLogon

    • Bearbeitet SvenE Freitag, 1. Februar 2013 15:00
    Freitag, 1. Februar 2013 14:59