2009-08-13 15 views
2

Es wird versucht, festzustellen, ob Benutzerordner im Netzwerk vorhanden sind, denen kein Benutzerkonto zugeordnet ist. Alle Ergebnisse geben "Missing" zurück, wenn die Mehrheit "Found" zurückgeben sollte. Irgendwelche Ideen?Powershell - Suchen und Vergleichen von Arrays mit Quest CMDlets

$Dir = "\\ServerName\Share\" 
$FolderList = Get-ChildItem($Dir) | where {$_.psIsContainer -eq $true} 
$UserList = get-qaduser -sizelimit 0 | select LogonName 

foreach ($Folder in $FolderList) 
{ 
if ($UserList -contains $Folder.name) 
{ 
"Found: " + $Folder.name 
} 
Else 
{ 
"Missing: " + $Folder.name 
} 
} 

Antwort

2

Wie wäre es einen etwas anderen Ansatz versucht, die eine Hash-Tabelle verwendet (die außergewöhnlich schnelle Lookups von Schlüsseln bietet):

$users = @{} 
Get-QADUser -sizelimit 0 | Foreach {$users["$($_.LogonName)"] = $true} 
$dir = "\\ServerName\Share\" 
Get-ChildItem $dir | Where {$_.PSIsContainer -and !$users["$($_.Name)"]} 

Wenn der Ordnername nicht genau mit dem Logonname übereinstimmen, dann als EBGreen Noten, Sie muss den Schlüssel ($ users ["$ ($ .LogonName)"]) oder den Ordnernamen anpassen, wenn Sie ihn zum Indizieren der Hashtabelle (! $ users ["$ ($ .Name)"]) verwenden.

+0

Genie! Obwohl ich deinen Code noch nicht vollständig verstanden habe, funktioniert es definitiv! Danke euch beiden für eure Beiträge. Sorry, ich bin ein Stack-Overflow-Noob und kann dich noch nicht abstimmen! –

+1

Im Wesentlichen erstellt $ users = @ {} eine Hashtabelle (oder ein Wörterbuch). Die zweite Zeile füllt dieses Wörterbuch mit allen Benutzeranmeldenamen und dem Wert $ true. Dann scannen wir in der letzten Zeile jeden Ordner und prüfen, ob sich der Name (nicht der vollständige Pfad) in der Hashtabelle befindet. Wenn nicht, dann haben Sie einen verwaisten Ordner. –

+1

Dies ist eine viel bessere Lösung. Aber Ihr vorheriger Code funktioniert nicht, da $ UserList tatsächlich eine Sammlung von PSObjects mit einer Eigenschaft "LogonName" enthält. Ihre "if" -Anweisung versucht also, eine PSObject-Auflistung mit einer Zeichenfolge zu vergleichen und somit keine Übereinstimmung zu erzielen. In jeder OO-Umgebung müssen Sie wissen, welche Art von Objekten Sie vergleichen. Sie können dies beheben, indem Sie nur die Anmeldenamen verwenden: $ UserList = get-qaduser -sizelimit 0 | for-each {$ _. Anmeldename} – JasonMArcher

1

-contains treffen zu, wenn das Element in der Sammlung identisch ist, was Sie testen, so sicher sein, dass der $ Folder.Name ist genau die gleiche wie Logonname. Normalerweise würde es nicht sein. Die meisten Unternehmen hätten den Ordnernamen foo $ für einen Benutzer namens foo.

Verwandte Themen