2009-08-13 8 views
2

Essaye de déterminer s'il y a des dossiers d'utilisateurs sur le réseau qui n'ont pas de compte d'utilisateur associé. Tous les résultats retournent "Missing" quand la majorité devrait retourner "Found". Des idées?Powershell - Recherche et comparaison de tableaux avec les CMDlets Quest

$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 
} 
} 

Répondre

2

Que diriez-vous d'essayer une approche légèrement différente qui utilise une table de hachage (qui offre des recherches exceptionnellement rapide de clés):

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

Si le nom du dossier ne correspond pas exactement à LogonName, puis sous forme de notes EBGreen, vous devra ajuster la clé ($ users ["$ ($ .LogonName)"]) ou le nom du dossier lorsque vous l'utiliserez pour indexer la hashtable (! $ users ["$ ($ .Name)"]).

+0

Genius! Bien que je ne comprenne pas encore complètement votre code, ça fonctionne vraiment! Merci à vous deux pour votre contribution. Désolé je suis un Noob Stack Overflow et je ne peux pas vous voter encore! –

+1

Essentiellement, le $ users = @ {} crée une hashtable (ou un dictionnaire). La deuxième ligne remplit ce dictionnaire avec tous les noms d'ouverture de session utilisateur et la valeur $ true. Ensuite, dans la dernière ligne, nous analysons chaque dossier et vérifions si son nom (pas le chemin complet) est dans la hashtable. Si ce n'est pas le cas, vous avez un dossier orphelin. –

+1

C'est une bien meilleure solution. Mais votre code précédent ne fonctionne pas car $ UserList contient en fait une collection de PSObjects avec une propriété "LogonName". Donc, votre instruction "if" essaie de comparer une collection PSObject à une chaîne, et donc de ne pas faire de correspondance. Dans tout environnement OO, vous devez connaître le type d'objets que vous comparez. Vous pouvez résoudre ce problème en obtenant simplement les noms de connexion à la place: $ UserList = get-qaduser -sizelimit 0 | pour chaque {$ _. LogonName} – JasonMArcher

1

-contains correspondra si l'élément de la collection est identique à ce que vous testez alors assurez-vous que le $ Folder.Name est exactement le même que LogonName. Habituellement, ce ne serait pas le cas. La plupart des entreprises auraient le nom de dossier être foo $ pour un utilisateur nommé foo.

Questions connexes