2015-05-18 3 views
0

Я пытаюсь сравнить ACL в папке с набором ссылок ACL, а затем перечислить любые исключения. «Нечеткая» часть уравнения заключается в том, что я хочу иметь возможность игнорировать любой неизвестный SID. Поэтому создание справочной папки с perms, которую я хочу протестировать, не будет работать, чтобы использовать Compare-Object между ним и моей тестовой папкой.ACL "fuzzy" сравнение

Основополагающим сценарием является то, что я очищаю старые пользовательские каталоги, где фактическая учетная запись пользователя была удалена (здесь происходит неразрешенный SID). По умолчанию папки включают perms для администратора и т. П., Которые мне не нужны. Однако есть несколько папок, где другому пользователю предоставлены явные разрешения, и я хочу их захватить. К сожалению, нет никаких ярлыков, которые я могу использовать для проверки: например. -IsInherited или тому подобное, чтобы исключить ACL, мне все равно.

Per ниже, я могу сбросить списки ACL из массива в

$acl = get-acl f:\user_folder 
$access = $acl.Access | ForEach-Object { $_.identityReference.value } 

$access 
BUILTIN\Administrators 
MYDOMAIN\JBLOGGS 
S-1-5-21-4444444444-9999999-1111111111-74390 
MYDOMAIN\Domain_Group ###Yes, the group has an underscore in the name 

я могу создать другой массив пользователей, которые я хочу, чтобы игнорировать, включая частичную строку, чтобы соответствовать любой нерешенный SID.

$defaults = @("BUILTIN\Administrators","MYDOMAIN\DomainGroup","S-1-5-21") 

Так как же я сравниваю мой $defaults массив с $access массива и вывода только исключения, как «MYDOMAIN \ JBLOGGS»?

Я пытаюсь использовать foreach, но я в тупике обхватил это исключение. Следующее все еще выводит SID, которого я хочу избежать. Я надеюсь также избежать слишком много вложенных «IFs».

$access | ForEach { If ($defaults -notcontains $_) { Write-Output $_ } } 
MYDOMAIN\JBLOGGS 
S-1-5-21-4444444444-9999999-1111111111-74390 #Do not want! 

Если я поставил подстановочные $_* в -notcontains, я получаю все содержимое $access снова.

ответ

0

Я хотел бы сделать что-то вроде этого:

$defaults = 'BUILTIN\Administrators', 'MYDOMAIN\DomainGroup', 'S-1-5-21*' 

$access | ? { 
    $id = $_.IdentityReference 
    -not ($defaults | ? { $_ -like $id }) 
} | select -Expand value 

$defaults | ? { $_ -like $id } делает подстановочный матч данной идентичности в отношении всех пунктов $defaults. Подстановочный знак * в конце S-1-5-21* позволяет сопоставлять все строки, начинающиеся с S-1-5-21. Отрицание -not инвертирует результат, чтобы передать только те файлы, которые не совпадают в $defaults.

+0

Спасибо, он didn Работаю так, как есть, но вернула меня на правильный путь – Trix

0

дать пользователям вы хотите игнорировать некоторые права на фиктивную папку, получить ACL этой папки, а затем сравнить с ти ACL вашей фактической папки

$genericACL = get-acl c:\temp\dummy 
$folderacl = get-acl f:\user_folder 
$exceptions= $folderacl.Access.identityreference.value |?{ ($_ -notin $genericACL.access.identityreference.value) -and ($_.strartswith('S-1-5-21') -eq $false)) } 
+0

В Powershell нет «-notin». Я попытался переделать это с помощью «-notcontains», но я думаю, что мне придется запускать его через цикл foreach. – Trix

+0

@Trix 'notin' и' in' были введены в powershell V3 –

+0

Спасибо, я забыл заявить, что ему нужно Powershell 2.0 – Trix

0

В конце концов, это было довольно просто, благодаря помощи выше.

Мне удалось опустить этот факт в исходном вопросе, где я должен был работать в Powershell v2.

$defaults = @("BUILTIN\Administrators","MYDOMAIN\DomainGroup") 
$acl = get-acl $folder 
    $access = $acl.Access | ForEach-Object { $_.identityReference.value } 
    # check that no other account still has access to the folder 
    $access | ForEach { 
     If ($defaultACL -notcontains $_ -and $_ -notlike 'S-1-5-21*') { 
      write-output "Extra perms:$user $_" 
}