Подтвердить что ты не робот

PowerShell для установки прав доступа к папке

Я пытаюсь использовать опции "default" при применении разрешений на доступ к папке; я имею в виду, что используя "Полный контроль, запись, чтение и т.д." в "Свойствах" для папки.

Следующий script работает, чтобы добавить пользователя, но применяется "Специальные разрешения", а не те, у которых есть галочки для тех, которые видны в меню свойств папки:

$Acl = Get-Acl "\\R9N2WRN\Share"

$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule ("user","FullControl","Allow")

$Acl.SetAccessRule($Ar)
Set-Acl "\\R9N2WRN\Share" $Acl

Что я делаю неправильно?

4b9b3361

Ответ 1

Указание наследования в конструкторе FileSystemAccessRule() исправляет это, как показано в модифицированном коде ниже (обратите внимание на два новых параметра constuctor, вставленных между "FullControl" и "Allow").

$Acl = Get-Acl "\\R9N2WRN\Share"

$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("user", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")

$Acl.SetAccessRule($Ar)
Set-Acl "\\R9N2WRN\Share" $Acl

Согласно этой теме

", когда вы создаете FileSystemAccessRule так, как вы, Свойству InheritanceFlags установлено значение None. В графическом интерфейсе этот соответствует ACE с полем Apply To, установленным на" Только эта папка ", и этот тип записи должен просматриваться через Advanced настройки".

Я протестировал модификацию, и она работает, но, конечно, кредит связан с тем, что MVP отправил ответ в этой теме.

Ответ 2

Обращаясь к Gamaliel answer: $ args - это массив аргументов, которые передаются в сценарий во время выполнения - поэтому его нельзя использовать так, как его использует Gamaliel. Это на самом деле работает:

$myPath = 'C:\whatever.file'
# get actual Acl entry
$myAcl = Get-Acl "$myPath"
$myAclEntry = "Domain\User","FullControl","Allow"
$myAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($myAclEntry)
# prepare new Acl
$myAcl.SetAccessRule($myAccessRule)
$myAcl | Set-Acl "$MyPath"
# check if added entry present
Get-Acl "$myPath" | fl

Ответ 3

В случае, если вам приходилось иметь дело со многими подпапками, содержащими подпапки и другие рекурсивные вещи. Небольшое улучшение @Mike L'Angelo:

$mypath = "path_to_folder"
$myacl = Get-Acl $mypath
$myaclentry = "username","FullControl","Allow"
$myaccessrule = New-Object System.Security.AccessControl.FileSystemAccessRule($myaclentry)
$myacl.SetAccessRule($myaccessrule)
Get-ChildItem -Path "$mypath" -Recurse -Force | Set-Acl -AclObject $myacl -Verbose

Многословие необязательно в последней строке

Ответ 4

$path = "C:\DemoFolder"
$acl = Get-Acl $path
$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$Attribs = $username, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
$AccessRule = New-Object System.Security.AcessControl.FileSystemAccessRule($Attribs)
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl $path
Get-ChildItem -Path "$path" -Recourse -Force | Set-Acl -aclObject $acl -Verbose

Ответ 5

Другой пример использования PowerShell для установки разрешений (Файл/Каталог):

Verfiy разрешения

Get-Acl "C:\file.txt" | fl *

применять полные разрешения для всех

$acl = Get-Acl "C:\file.txt"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("everyone","FullControl","Allow")
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "C:\file.txt"

Скриншоты: enter image description here enter image description here

Надеюсь это поможет