von postNils Kaczenski post29. März 2005, 15:51 Uhr post http://faq-o-matic.net/?p=586
post Kategorie: AD: Erweiterte Abfragen, Active Directory, Scripting

Im Laufe der Zeit sammeln sich leider durch Rechnertausch, Defekte usw. immer mehr Computerkonten an, zu denen die Rechner gar nicht mehr existieren. Um diese in größerer Stückzahl zu löschen, bietet sich eine Abfrage des Active Directory an. Je nach Betriebssystem der Domänencontroller können dabei unterschiedliche Wege gegangen werden.

Bei einem AD im Modus "Windows 2003 pur" oder höher kann das Kommandozeilen-Tool "dsquery" verwendet werden:

dsquery computer -stalepwd 50 

Das findet alle Computer, deren Kennwort seit 50 Tagen nicht geändert wurde (weniger ist nicht so sinnvoll, denn schon allein das Intervall zur automatischen Änderung liegt standardmäßig bei 30 Tagen).

Die Ausgabe des Kommandos dann auch direkt in das Kommando "dsrm" umgeleitet werden, um die Rechner direkt zu löschen:

dsquery computer -stalepwd 50|dsrm -noprompt -c

Erläuterung: Ohne "-noprompt" würde dsrm zur Bestätigung auffordern und dann, weil ja gleich der nächste Name per Pipe übergeben wird, fehlschlagen. Mit "-c" wird die Fehlertoleranz eingeschaltet, die alle Ergebnisse anzeigt und nach Fehlern fortfährt. Sonst macht das keinen Spaß, denn es kann vorkommen, dass ein Computer Unterobjekte hat (z.B. ehemals freigegebene Drucker oder Router-Informationen), und dann kann dsrm ihn nicht einfach löschen.

Wenn zunächst eine Liste aller Computer erzeugt werden soll, um die Löschkandidaten herauszufinden, eignet sich eine Abfrage mit AdFind. Folgende Befehlszeile (eine zusammenhängende Zeile!) schreibt alle Computer mit ihrem letzten Anmeldedatum (lastLogonTimestamp) und der letzten Kennwortänderung in eine Datei. Diese kann dann z.B. mit Excel ausgewertet werden:

  AdFind -tdcs -csv -default -f "(objectClass=computer)" 

name pwdLastSet lastLogonTimestamp>Inaktive_Computer.txt

Auch dies funktioniert nur mit dem Native Mode von Windows 2003 oder neuer, weil nur dort das nützliche Attribut "lastLogonTimestamp" gepflegt wird. Bei einem älteren Verzeichnis kannst du mit einem VBS-Skript suchen:

http://www.rlmueller.net/Last%20Logon.htm

Achtung: In dem Skript musst du diese Zeile:

  strFilter = "(&(objectCategory=person)(objectClass=user))" 

durch diese ersetzen:

  strFilter = "(&(objectCategory=computer)(objectClass=user))" 

Das gibt dir auf der Kommandozeile (ausführen mit "cscript Skriptname.vbs", nicht per Doppelklick!) Namen und letztes Anmeldedatum aller Computer aus. Aber Vorsicht: Dieses Skript fragt alle Domänencontroller nach dem letzten Anmeldedatum – in großen Umgebungen wird es also sehr lange brauchen und viel Last erzeugen!

Verwandte Beiträge:

  1. Wie bekomme ich heraus, wann ein User sich zuletzt ans AD angemeldet hat?
    Es gibt für diesen Zweck im AD ein Attribut namens "lastLogon", in dem die Zeit des letzten erfolgreichen Anmeldevorgangs gespeichert...
  2. Active-Directory-Massenoperationen mit AdMod und AdFind
    Windows Server 2003 enthält die so genannten "ds*-Tools": Eine Sammlung von Kommandozeilenprogrammen, die Massenoperationen an Active Directory zulassen. Zu diesen...
  3. Wie bekomme ich heraus, wann ein Benutzerkonto angelegt wurde?
    Das Erstellungsdatum eines Benutzerobjekts kann aus dem Active Directory abgefragt werden. Das Attribut, in dem das Datum gespeichert wird, nennt...
  4. Wie kann ich abfragen, welche Rechner welches Service Pack haben?
    csvde-Methode  von Nils Kaczenski Im AD wird eine Angabe über das Service Pack in den Computereigenschaften gespeichert. Um eine Abfrage...
  5. Wie frage ich gezielt Benutzerobjekte ab?
    Der LDAP-Standard sieht unglücklicherweise vor, dass die Objektklasse "user" nicht nur Benutzerobjekte umfasst (wie man annehmen könnte). Setzt man also...