Damit ich die Lizenzen für ein Tool berechnen konnte, musste ich die aktuellen Computer Objekte aus der AD lesen. Hilfreich ist die „LastLogin“ – Information, so können veraltete und nicht mehr verwendete Objekte gefunden werden.

cls
$xmlFile = "C:\_Daten\xmlFile.xml"
$date = Get-Date –f "yyyy-MM-dd HH:mm:ss"
$xmlobj = [xml] "<?xml version='1.0' encoding='utf-8'?><inhalt stamp='$date' logfile='$LogFile' host='$env:computername' username='$env:username' />"
$ldapSearcher = new-object directoryservices.directorysearcher
$ldapSearcher.filter = "(objectclass=computer)"
$ADObjs = $ldapSearcher.findall()
foreach($AdObj in $AdObjs){
 # Prüfen ob das Basis Element bereits erstellt wurde
 if(!$xmlobj.inhalt.elements){
 $nodeElements = $xmlobj.CreateElement("elements") # <- oberstes Element erstellen
 $xmlobj.inhalt.AppendChild($nodeElements) | Out-Null # <- Element in Knoten ablegen
 }

 $AdObj.Properties | ForEach-Object{

 $Name = $_.cn
 $adspath = $_.adspath
 $lastlogin = [DateTime]::FromFileTime([Int64]::Parse($_.lastlogon))
 $nodeElement = $xmlobj.createElement("element") # <- SubElement erstellen
 $nodeElement.SetAttribute("name",$Name) # <- SubElement mit Wert füllen
 $nodeElement.SetAttribute("adspath",$adspath ) # <- SubElement mit Wert füllen
 $nodeElement.SetAttribute("lastlogin",$lastlogin) # <- SubElement mit Wert füllen
 $nodeElement.SetAttribute("active","1") # <- SubElement mit Wert füllen
 $nodeElements.AppendChild($nodeElement) | Out-Null # <- SubElement in Knoten ablegen
}
$xmlobj.inhalt.AppendChild($nodeElements) | Out-Null # <- SubElement in Element ablegen
 }
$xmlobj.Save($xmlFile)

Für die Weiterverarbeitung habe ich mich für das XML Format entschieden.

Achtung – Die Objekte die von der LDAP Schnittstelle ausgegeben werden, sind nicht immer so eindeutig. Das Datumsformat wird als Zahlenwert ausgegeben. Damit dieser „gelesen“ werden kann, muss er entsprechende formatiert werden. Hier ein kleines Helfer lein:

$lastlogin = [DateTime]::FromFileTime([Int64]::Parse($_.lastlogon))