2009-08-13 2 views
2

Попытка определить, есть ли какие-либо пользовательские папки в сети, у которых нет связанной учетной записи пользователя. Все результаты возвращают «Пропавшие без вести», когда большинство должно вернуть «Найдено». Есть идеи?Powershell - Поиск и сравнение массивов с 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 
} 
} 

ответ

2

Как о попытке немного другой подход, который использует хэш-таблицу (которая предлагает исключительно быстрый поиск ключей):

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

Если имя папки не в точности соответствовать LogonName, то, как отмечает EBGreen, вы необходимо будет скорректировать ключ ($ users ["$ ($ .LogonName)"]) или имя папки, когда вы используете его для индексации хеш-таблицы (! $ users ["$ ($ .Name)"]).

+0

Гений! Хотя я еще не совсем понял ваш код, он определенно работает! Спасибо вам обоим за ваш вклад. Извините, что я переполняю Stack noob и пока не могу вас проголосовать! – 2009-08-14 13:23:12

+1

Essentialy $ users = @ {} создает хэш-таблицу (или словарь). Вторая строка заполняет этот словарь всеми именами входа пользователя и значением $ true. Затем в последней строке мы сканируем каждую папку и проверяем, находится ли это имя (не полный путь) в хеш-таблице. Если это не так, у вас есть потерянная папка. –

+1

Это гораздо лучшее решение. Но ваш предыдущий код не работает, потому что $ UserList фактически содержит коллекцию PSObjects с свойством «LogonName». Поэтому ваш оператор «if» пытается сравнить коллекцию PSObject с String и, таким образом, не делает соответствия. В любой среде OO вы должны знать, какие типы объектов вы сравниваете. Вы можете исправить это, получив вместо этого только имена входа: $ UserList = get-qaduser -sizelimit 0 | for-each {$ _. LogonName} – JasonMArcher

1

-contains будет соответствовать, если элемент в коллекции идентичен тому, что вы тестируете, поэтому будьте уверены, что $ Folder.Name точно так же, как и LogonName. Обычно этого не будет. У большинства компаний имя папки будет foo $ для пользователя с именем foo.

Смежные вопросы