Powershell Set-Acl - ошибка New-Object: не удается найти перегрузку для «FileSystemAccessRule» и счетчика аргументов: «1» - PullRequest
1 голос
/ 16 марта 2020

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

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

$psarray = @(
    ('xppusers', 'D:\XPP\xz\bin', 'Read'),
    ('xppusers', 'D:\XPP\xz\sys\config', 'Read'),
    ('xppusers', 'D:\XPP\sd_liz', 'Read'),
    ('xppusers', 'D:\XPP\xz\help', 'Read')
)


foreach($item in $psarray)
{
    $permission = "'" + $item[0] + "', '" + $item[2] + "', 'ContainerInherit, ObjectInherit', 'None', 'Allow'"
    $rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission
    $acl.SetAccessRule($rule)
    $acl | Set-Acl -Path $item[1]
}

И полная ошибка:

New-Object : Cannot find an overload for "FileSystemAccessRule" and the argument count: "1".
At C:\GPO-Installers\permissions-array.ps1:20 char:13
+     $rule = New-Object -TypeName System.Security.AccessControl.FileSy ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

Если я создаю разрешение $ вручную, оно работает нормально.

Например:

$permission = 'xppusers', 'read', 'ContainerInherit, ObjectInherit', 'None', 'Allow'

Не конечно, если я ошибся и был бы очень признателен за помощь.

Спасибо.

РЕДАКТИРОВАТЬ:

Благодаря @ mklement0 я поиграл с этим и получил это работает. На каком-то этапе, когда давление снижается, я go вернусь и пойму это правильно, а не просто скопирую / вставлю свой путь через эту проблему.

Я получил эту работу, создав необходимые переменные внутри foreach l oop, а затем использовать их в New-Object.

foreach($item in $UserGroupPermissionArray)
    {     
        $UserGroup = $item[0]
        $Path = $item[1]
        $acl = Get-Acl -Path $Path
        $FileSystemRights = $item[2]
        $InheritanceFlag = "ContainerInherit"
        $PropagationFlag = "None"
        $AccessControlType = "Allow"
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule ($UserGroup, $FileSystemRights, $InheritanceFlag, $PropagationFlag, $AccessControlType)
        $acl.SetAccessRule($rule)
        $acl | Set-Acl -Path $Path
    }

1 Ответ

1 голос
/ 16 марта 2020

Вы по ошибке передаете одну строку в конструктор System.Security.AccessControl.FileSystemAccessRule (через New-Object -ArgumentList); ошибка подразумевает, что не существует конструктора (перегрузки), который принимает одиночный аргумент типа [string]. [1]

Вместо необходимо передать аргументы конструктора по отдельности , что в контексте New-Object означает как массив (-Args является псевдонимом для -ArgumentList, и вы даже можете опустить -Args):

$rule = New-Object System.Security.AccessControl.FileSystemAccessRule `
          -Args ($item + 'ContainerInherit, ObjectInherit', 'None', 'Allow')

Поскольку $item - это массив, содержащий первые 2 аргумента конструктора, вы можете просто использовать конкатенацию массива (+) для добавления [2] инвариантные аргументы.


[1] Сообщение об ошибке может быть ситуативно вводящим в заблуждение, поскольку в нем явно не указано, что оно не только количество аргументов, которые имеют значение, а также тип данных аргумента . Например, вы бы увидели то же сообщение, если бы были конструктором с одним аргументом, но его тип аргумента был чем-то другим , чем [string].

[2] Технически создается массив new , представляющий собой конкатенацию элементов из входных массивов.

...