Я разработал все части моего сценария, который создает имена каталогов, создает каталоги на основе предварительно определенной структуры каталогов, создает группу AD на основе номера проекта, добавляемого к жестко заданному имени, а затем добавляет группу к определенному каталог и устанавливает ACL для этой группы.

Кажется, я не могу обойти ошибку:

New-Object : Cannot find an overload for "FileSystemAccessRule" and the argument count: "4".

Вот сценарий:

    $domain="DOMAIN"
    $tldn="net"

    $pathArr=@()
    $pathArr+=$path1=Read-Host -Prompt "Enter first path"
    $pathArr+=$path2=Read-Host -Prompt "Enter second path"
    [int]$projectNumber=try { Read-Host -Prompt "Enter project number" } catch { Write-Host "Not a numeric value. Please try again."; exit }
    [string]$mainFolder=[string]${projectNumber}+"_"+(Read-Host -Prompt "Please give the main folder name")
    $projectNumberString=[string]$projectNumber
    $projectName=Read-Host -Prompt "Please give the project name"
    $fullProjectName="${projectNumberString}_${projectName}"
    $pathArr+=$path3="$path1\$mainFolder"
    $pathArr+=$path4="$path2\$mainFolder"
    $pathArr+=$path5="$path3\$fullProjectName"
    $pathArr+=$path6="$path4\$fullProjectName"

    # Region: Create organizational units in Active Directory
    # Names
    $ouN1="XYZOU"
    $ouN2="ABCOU"

    # Paths
    $ouP0="DC=$domain,DC=$tldn"
    $ouP1="OU=$ouN1,$ouP0"
    $ouP2="OU=$ouN2,$ouP1"

    Write-Host "Checking for required origanization units..."
    try
    {
        New-ADOrganizationalUnit -Name $ouN1 -Path $ouP1
        New-ADOrganizationalUnit -Name $ouN2 -Path $ouP2

    }
    catch
    {
        Out-Null
    }

    Write-Host "Creating AD Group..."
    [string]$group="BEST_${projectNumberString}"
    $groupdomain="$domain\$group"

    $ADGroupParams= @{
        'Name' = "$group" 
        'SamAccountName' = "$group" 
        'GroupCategory' = "Security"
        'GroupScope' = "Global"
        'DisplayName' = "$group"
        'Path' = "OU=MyBusinessOU,DC=$domain,DC=$tldn"
        'Description' = "Test share"
    }
    $secgroup=New-ADGroup @ADGroupParams

    # Region: Set permissions
    Write-Host "Setting permissions..."

    # get permissions
    $acl = Get-Acl -Path $path6

    # add a new permission
    $InheritanceFlags=[System.Security.AccessControl.InheritanceFlags]”ContainerInherit, ObjectInherit”
    $FileSystemAccessRights=[System.Security.AccessControl.FileSystemRights]"Traverse","Executefile","ListDirectory","ReadData", "ReadAttributes", "ReadExtendedAttributes","CreateFiles","WriteData", 'ContainerInherit, ObjectInherit', "CreateDirectories","AppendData", "WriteAttributes", "WriteExtendedAttributes", "DeleteSubdirectoriesAndFiles", "ReadPermissions"
    $InheritanceFlags=[System.Security.AccessControl.InheritanceFlags]”ContainerInherit, ObjectInherit”
    $PropagationFlags=[System.Security.AccessControl.PropagationFlags]”None”
    $AccessControl=[System.Security.AccessControl.AccessControlType]”Allow”
    $permission = "$groupdomain", "$InheritanceFlags", "$PropagationFlags", "$AccessControl"
    $rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission
    $acl.SetAccessRule($rule)

    # set new permissions
    $acl | Set-Acl -Path $path6

Опять же, я пытаюсь сделать то, что я обычно делал бы вручную в Active Directory в среде Windows

  1. Создать группу объявлений
  2. Добавить группу в общий доступ
  3. Установить разрешения для группы
  4. Этот скрипт не добавляет пользователей в группу

Последний и последний шаг - установка разрешения; к сожалению, когда я запускаю сценарий, меняю синтаксис или метод (следуя примерам из нескольких статей в Интернете) и тратя часы на это сейчас, я просто не делаю успехов. Единственный прогресс состоял в том, что число, которое он не мог перегрузить, уменьшилось с 18 до 4.

Спасибо за вашу помощь заранее!

< Сильный > ИЗМЕНИТЬ

Я исправил скрипт в комментарии, указав, что пропустил аргумент $FileSystemAccessRights.

Переменная $permission была изменена на:

$permission = "$groupdomain", "$FileSystemAccessRights", "$InheritanceFlags", "$PropagationFlags", "$AccessControl"

Я все еще получаю этот вывод:

New-Object : Cannot convert argument "1", with value: "ExecuteFile Executefile ListDirectory ReadData ReadAttributes 
ReadExtendedAttributes CreateFiles WriteData ContainerInherit, ObjectInherit CreateDirectories AppendData WriteAttributes 
WriteExtendedAttributes DeleteSubdirectoriesAndFiles ReadPermissions", for "FileSystemAccessRule" to type 
"System.Security.AccessControl.FileSystemRights": "Cannot convert value "ExecuteFile Executefile ListDirectory ReadData 
ReadAttributes ReadExtendedAttributes CreateFiles WriteData ContainerInherit, ObjectInherit CreateDirectories AppendData 
WriteAttributes WriteExtendedAttributes DeleteSubdirectoriesAndFiles ReadPermissions" to type 
"System.Security.AccessControl.FileSystemRights". Error: "Unable to match the identifier name ExecuteFile Executefile ListDirectory 
ReadData ReadAttributes ReadExtendedAttributes CreateFiles WriteData ContainerInherit, ObjectInherit CreateDirectories AppendData 
WriteAttributes WriteExtendedAttributes DeleteSubdirectoriesAndFiles ReadPermissions to a valid enumerator name.  Specify one of the 
following enumerator names and try again: ListDirectory, ReadData, WriteData, CreateFiles, CreateDirectories, AppendData, 
ReadExtendedAttributes, WriteExtendedAttributes, Traverse, ExecuteFile, DeleteSubdirectoriesAndFiles, ReadAttributes, 
WriteAttributes, Write, Delete, ReadPermissions, Read, ReadAndExecute, Modify, ChangePermissions, TakeOwnership, Synchronize, 
FullControl""

< Сильный > ИЗМЕНИТЬ

Я попытался удалить кавычки из переменных, потому что кажется, что каждая переменная уже имела кавычки, кроме $groupdomain, и затем получил эту ошибку:

New-Object : Cannot convert argument "1", with value: "System.Object[]", for "FileSystemAccessRule" to type 
"System.Security.AccessControl.FileSystemRights": "Cannot convert value 
"ExecuteFile,Executefile,ListDirectory,ReadData,ReadAttributes,ReadExtendedAttributes,CreateFiles,WriteData,ContainerInherit, 
ObjectInherit,CreateDirectories,AppendData,WriteAttributes,WriteExtendedAttributes,DeleteSubdirectoriesAndFiles,ReadPermissions" to 
type "System.Security.AccessControl.FileSystemRights". Error: "Unable to match the identifier name 
ExecuteFile,Executefile,ListDirectory,ReadData,ReadAttributes,ReadExtendedAttributes,CreateFiles,WriteData,ContainerInherit, 
ObjectInherit,CreateDirectories,AppendData,WriteAttributes,WriteExtendedAttributes,DeleteSubdirectoriesAndFiles,ReadPermissions to a 
valid enumerator name.  Specify one of the following enumerator names and try again: ListDirectory, ReadData, WriteData, 
CreateFiles, CreateDirectories, AppendData, ReadExtendedAttributes, WriteExtendedAttributes, Traverse, ExecuteFile, 
DeleteSubdirectoriesAndFiles, ReadAttributes, WriteAttributes, Write, Delete, ReadPermissions, Read, ReadAndExecute, Modify, 
ChangePermissions, TakeOwnership, Synchronize, FullControl""

< Сильный > ИЗМЕНИТЬ

Попробовал то, что предложил Стивен, заключив в кавычки весь New-Object, и затем получил эту ошибку:

Cannot convert argument "rule", with value: "New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList 
WOLF\Elite_1035 Write, Read ContainerInherit, ObjectInherit None Allow", for "SetAccessRule" to type 
"System.Security.AccessControl.FileSystemAccessRule": "Cannot convert the "New-Object -TypeName 
System.Security.AccessControl.FileSystemAccessRule -ArgumentList WOLF\Elite_1035 Write, Read ContainerInherit, ObjectInherit None 
Allow" value of type "System.String" to type "System.Security.AccessControl.FileSystemAccessRule"."

< Сильный > ИЗМЕНИТЬ

Ошибка исчезла, но я до сих пор не вижу ни одной группы, добавленной в свойства безопасности $path6.

Я смог также добавить все разрешения, теоретически, выполнив это:

$FileSystemAccessRights=[System.Security.AccessControl.FileSystemRights]"Traverse,Executefile,ListDirectory,ReadData, ReadAttributes, ReadExtendedAttributes,CreateFiles,WriteData,CreateDirectories,AppendData,WriteAttributes,WriteExtendedAttributes,DeleteSubdirectoriesAndFiles, ReadPermissions"

2
scriptkiddie 28 Май 2017 в 11:23

2 ответа

Лучший ответ

Вы забыли $FileSystemAccessRights в аргументах

$permission =  $groupdomain, $FileSystemAccessRights, $InheritanceFlags, $PropagationFlags, $AccessControl

Редактировать, удалить двойные кавычки.

У вас все еще есть две проблемы:

Сначала создайте объект $ Principal

$principal = New-Object System.Security.Principal.NTAccount($groupdomain)

Затем попробуйте уменьшить значение $ FileSystemAccessRights, поскольку у него есть проблемы, попробуйте что-нибудь простое, например, с правами чтения / записи.

$FileSystemAccessRights=[System.Security.AccessControl.FileSystemRights]"Read, Write"

Обновите создание переменной $ разрешение, чтобы включить принципала:

$permission = $principal, $FileSystemAccessRights, $InheritanceFlags, $PropagationFlags, $AccessControl
2
Micky Balladelli 29 Май 2017 в 03:13

New-Object: Не удалось найти перегрузку для «FileSystemAccessRule» и количество аргументов: «5».

Решение этой ошибки состоит в том, что ваши переменные раскрываются без использования строк ( без кавычек вокруг строки ). Таким образом, любые запятые в строковой переменной анализируются как аргументы.

Powershell может раскрывать переменные в виде строк с помощью предложения @.

Решение:

$permission = @($groupdomain), @($InheritanceFlags), @($PropagationFlags), @($AccessControl)
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission

Однако, что вы сделали в своем примере ...

$ Разрешение = "$ groupdomain", "$ InheritanceFlags", "$ PropagationFlags", "$ AccessControl"

... немного воссоздает колесо и может привести к проблемам, с которыми вы столкнулись. Кроме того, вы передали аргументы без ADuser или SID, что также дало вам эти ошибки.


Надежное решение

Относится также к этому вопросу: ACL PowerShell не применяется
Сначала , такие вещи, как

$InheritanceFlags=[System.Security.AccessControl.InheritanceFlags]”ContainerInherit, ObjectInherit”
    $FileSystemAccessRights=[System.Security.AccessControl.FileSystemRights]"Traverse","Executefile","ListDirectory","ReadData", "ReadAttributes", "ReadExtendedAttributes","CreateFiles","WriteData", 'ContainerInherit, ObjectInherit', "CreateDirectories","AppendData", "WriteAttributes", "WriteExtendedAttributes", "DeleteSubdirectoriesAndFiles", "ReadPermissions"
    $InheritanceFlags=[System.Security.AccessControl.InheritanceFlags]”ContainerInherit, ObjectInherit”
    $PropagationFlags=[System.Security.AccessControl.PropagationFlags]”None”

Являются многословными, и трудно сказать, что вы получаете (строки, объекты, перечисление ...). Поскольку перечисление этих свойств уже задано в объектах EnumerationObjects, вы можете буквально передавать строки в качестве аргументов:

$InheritanceFlags = "ContainerInherit, ObjectInherit"
$FileSystemAccessRights = "Traverse,Executefile,ListDirectory,ReadData, ReadAttributes,ReadExtendedAttributes,CreateFiles,WriteData,CreateDirectories,AppendData,WriteAttributes,WriteExtendedAttributes,DeleteSubdirectoriesAndFiles,ReadPermissions"
.
etc...

Я также столкнулся с неправильным оператором в массиве $FileSystemAccessRights, который вы создали: 'ContainerInherit, ObjectInherit' там быть не должно. Это не допустимая строка перечисления.
См. FileSystemRights-Enumeration

Вот почему вы получили эту ошибку: Unable to match the identifier name для переменной $FileSystemAccessRights.

Второй , класс FileSystemAccessRule нуждается в передаче 3 или 5 аргументов.
См. FileSystemAccessRule-Class

  • IdentityReference (SID или полное имя samaccount из AD)
  • FileSystemRights (перечисления заключаются в строку и разделяются запятой)
  • [необязательно] InheritanceFlags
  • [необязательно] PropagationFlags
  • AccessControlType (String; если «Запретить» или «Разрешить»)

Убедитесь, что вы передаете ему 3 или 5 аргументов, не больше, не меньше.

Третий , установите ACL надежным способом:

 # Region: Set permissions
 Write-Host "Setting permissions..."

    # get permissions
    $acl = Get-Acl -Path $path6

    # add a new permission
    $user = $secgroup
    $InheritanceFlags="ContainerInherit, ObjectInherit"
    $FileSystemAccessRights="Traverse,Executefile,ListDirectory,ReadData, ReadAttributes,ReadExtendedAttributes,CreateFiles,WriteData,CreateDirectories,AppendData,WriteAttributes,WriteExtendedAttributes,DeleteSubdirectoriesAndFiles,ReadPermissions"
    $PropagationFlags="None"
    $AccessControl="Allow"
    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(@($user), @($FileSystemAccessRights), @($InheritanceFlags), @($PropagationFlags), @($AccessControl))
    $acl.SetAccessRule($rule)
    #set new permissions
    path6.SetAccessControl($acl)

Обратите внимание, что я использую функции другим способом, так как OP опубликовал, а OP забыл передать переменную $secgroup в функцию. По моему опыту, это самый надежный способ настройки ACL в powershell.

3
Community 20 Июн 2020 в 09:12