2015-12-09 2 views
3

Я новичок в PS-скриптах. Просто начал писать сценарий, чтобы узнать, правильно ли разрешена папка для пользователя. Имя папки и имя учетной записи AD совпадают. Скажите, есть ли имя папки XX11223, тогда пользователь XX11223 должен иметь доступ к этой конкретной папке. Папки, которые не были правильно разрешены, должны быть напечатаны в файл. Кто-то PLS помочь в этом.Проверьте, предоставляется ли папке доступ

$Paths = Get-Content "Path.txt" 

#To get the subfolders for which the permissions has to be checked 

$Folder = foreach ($Path in $Paths) { 
    $Path = $Path | Select-Object -Unique 
    Write-Host $Path -ForegroundColor Green 
    Get-ChildItem $Path | Where-Object { $_.Attributes -eq 'Directory' } | Select-Object FullName 
} 

#To get the ACLs for the list of folders from above 

$ACLS = Get-Content $Folder 

$Out = foreach ($ACL in $ACLS) { 
    Write-Host $ACL -ForegroundColor Cyan 
    Get-Acl $ACL | Select-Object AccesstoString 
} 

Я застрял здесь и не имею ни малейшего понятия, как действовать дальше. :(

+0

Достаточно ли проверить, что пользователь X имеет доступ к dir X, или вам нужно проверить, что пользователь Y также не имеет доступа? – vonPryz

+0

Пользователям нужен доступ только для чтения или полный доступ? – sodawillow

+0

@vonPryz Достаточно проверить, имеет ли пользователь X разрешение на папку X –

ответ

4

Это все зависит от того, что представляет собой «правильные разрешения», но если вы ожидаете, что пользователь должен иметь FullControl предоставлен в его папке, вы можете сделать следующее:

Получить ACL каждой папки:

$FolderAcl = Get-Acl $path 

Построить NTAccount объект, представляющий соответствующую папку

$Account = New-Object System.Security.Principal.NTAccount "DOMAIN\user" 

А затем захватить все явный доступ к г ULE записи из ACL, предоставляющего FullControl на счет в вопросе:

$FullControl = $FolderAcl.GetAccessRules($true,$false,[System.Security.Principal.NTAccount]) | Where-Object { 
    $_.FileSystemRights -eq "FullControl" -and 
    $_.AccessControlType -eq "Allow" -and 
    $_.IdentityReference -eq $Account 
} 

Если $FullControl содержит $null (то есть. не было найдено правил доступа) печатать в файл.

if(-not $FullControl){ 
    $path |Out-File C:\wrongPermissions.txt 
} 

Если вы хотите найти ACE с Modify прав, в том числе тех, где Modify включен в других прав (таких как FullControl), вы можете выполнить побитовое И операцию против стоимости Modify, как и :

$ModifyValue = [System.Security.AccessControl.FileSystemRights]::Modify -as [int] 
$ACEswithModify = $FolderAcl.Access |?{ ($_.FileSystemRights -band $ModifyValue) -eq $ModifyValue } 
0

Вот моя попытка это:

$Paths = Get-Content "Path.txt" 

#To get the subfolders for which the permissions has to be checked 

$Folder = foreach ($Path in $Paths) { 
    $Path = $Path | Select-Object -Unique 
    Write-Host $Path -ForegroundColor Green 
    Get-ChildItem $Path | Where-Object { $_.Attributes -eq 'Directory' } | Select-Object FullName 
} 

#To get the ACLs for the list of folders from above 

$ACLS = Get-Content $Folder 

$Out = foreach ($ACL in $ACLS) { 
    $accessOK = $false 
    Write-Host $ACL -ForegroundColor Cyan 
    $folderName = (Get-Item $ACL).Name 
    (Get-Acl $ACL).Access | % { 
     if($_.IdentityReference.ToString().Split("\")[1] -match $folderName) { 
      if($_.AccessControlType.ToString() -match "Allow") { 
       $accessOK = $true 
      } 
     } 
    } 
    if(!$accessOK) { $ACL } 
} 

$Out должен содержать только пути, в которых пользователь, указанный после папки, не имеет доступа.

Комментарии: Ваше имя может вводить в заблуждение. Я бы не назвал $ACL переменной, содержащей строку, которая на самом деле является полным путем :). Вот почему я не модифицировал остальную часть кода. Я постараюсь показать вам, что я имею в виду в переписывании:

$rootList = Get-Content "Path.txt" 

$pathList = foreach ($root in $rootList) { 
    $path = $root | Select-Object -Unique 
    Write-Host $path -ForegroundColor Green 
    #with powershell 3 
    Get-ChildItem $path -Directory | Select-Object FullName 
} 

$Out = foreach ($path in $pathList) { 
    $accessOK = $false 
    Write-Host $path -ForegroundColor Cyan 
    $folderName = (Get-Item $ACL).Name 
    (Get-Acl $path).Access | % { 
     if($_.IdentityReference.ToString().Split("\")[1] -match $folderName) { 
      if($_.AccessControlType.ToString() -match "Allow") { 
       $accessOK = $true 
      } 
     } 
    } 
    if(!$accessOK) { $path } 
} 
0

Спасибо @Sodawillow и @Mathias.

Я попытался объединить оба ваших кода и написать новый, чтобы получить желаемый результат. Пользователь должен иметь «Изменить» доступ к папке. Но все пути записываются в файл. Пожалуйста, проверьте приведенный ниже код и сообщите.

$rootList = Get-Content "Path.txt" 

$pathList = foreach ($root in $rootList) { 
$path = $root | Select-Object -Unique 
Write-Host $path -ForegroundColor Green 
Get-ChildItem $path -Directory | Select-Object FullName} 

foreach ($path in $pathList) { 
$path1 = $path | Select-Object -Unique 
$folderName = (Get-Item $path1).Name 
$FolderAcl = (Get-Acl $path1).Access 

$Permission = $FolderAcl | Where-Object { 
$_.FileSystemRights -like "*Modify*" -and 
$_.IdentityReference -like "*$folderName*" 
} 
if(-not $Permission){ 
$path1 >> wrongPermissions.txt} 

} 
+0

. Пожалуйста, ознакомьтесь с обновлением моего ответа, я думаю, он содержит бит, который вам нужен –

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