Скопировать объект в новый объект с измененным значением

Мне нужно получить объект ACL и заменить Access.IdentityReference.Value, а остальную часть объекта оставить нетронутой, чтобы я мог применить Set-Acl к другой системе.

$acl = Get-Acl -Path "C:\Temp"
$h = New-Object -TypeName PSObject
ForEach-Object -InputObject $acl -Process {
    if ($_.Access.IdentityReference.Value -contains "BUILTIN\Users") {
        "found"
        $h += @($_.Access.IdentityReference.Value.Replace("BUILTIN\Users", "new\name"))
    } else {
        $h += @($_)
    }
}
$h.Access

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


Изменить: когда я пробую этот код:

$acl = Get-Acl -Path 'C:\Temp'

$ace = $acl.Access | Where-Object { $_.IdentityReference -eq 'BUILTIN\Users' }
$newAce = New-Object System.Security.AccessControl.FileSystemAccessRule (
    'new\name',
    $ace.FileSystemRights,
    $ace.InheritanceFlags,
    $ace.PropagationFlags,
    $ace.AccessControlType
)
$acl.RemoveAccessRule($ace)
$acl.AddAccessRule($newAce)

Set-Acl -Path 'C:\Temp' -AclObject $acl

Я получаю следующую ошибку:

Exception calling "AddAccessRule" with "1" argument(s): "Some or all identity
references could not be translated."
At line:12 char:1
+ $acl.AddAccessRule($newAce)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
     + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
     + FullyQualifiedErrorId : IdentityNotMappedException

Edit2: новый скрипт, но еще не совсем готовый:

$Ssid = "S-1-5-21-2214593661-3374179426-1523454523-1133"
$Tsid = "S-1-5-21-2227185791-3254421074-497073356-1005"
$Spath = "\\clw01\dept\CLW_Site"
$Tpath = "\\clw03\dept\CLW_Site"

$acl = Get-Acl -Path $Spath

$ace = $acl.Access | Where-Object { $_.IdentityReference -eq $Ssid }
$newAce = New-Object System.Security.AccessControl.FileSystemAccessRule (
    $Tsid,
    $ace.FileSystemRights,
    $ace.InheritanceFlags,
    $ace.PropagationFlags,
    $ace.AccessControlType
)
$acl.RemoveAccessRule($ace)
$acl.AddAccessRule($newAce)

Set-Acl -Path $Tpath -AclObject $acl

Я получаю следующую ошибку:

Exception calling "AddAccessRule" with "1" argument(s): "The trust relationship
between the primary domain and the trusted domain failed."
At line:9 char:1
+ $acl.AddAccessRule($newAce)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SystemException

person David C    schedule 18.12.2016    source источник
comment
Действительно ли new\name можно разрешить на компьютере? Является ли new другим хостом? Доверенный домен? Внешний или в том же лесу?   -  person Ansgar Wiechers    schedule 19.12.2016
comment
нет, это невозможно разрешить на компьютере, на котором он работает, но это будет на локальном компьютере, на котором есть локальная группа. В основном у нас есть server1 (старый сервер), server2 (новый сервер) и AdmWs1 (рабочая станция, на которой запущен скрипт). На сервере 1 есть много папок с разрешениями для локальных групп, мне нужно скопировать папки и локальные группы на сервер 2, а затем скопировать списки управления доступом.   -  person David C    schedule 19.12.2016
comment
Он должен быть разрешен на компьютере, на котором вы запускаете код, иначе он не будет работать. Если вы хотите изменить локальную группу на удаленном хосте, вы можете запустить код удаленно, например. через Invoke-Command.   -  person Ansgar Wiechers    schedule 19.12.2016
comment
Или ссылаться на локальную группу по SID?   -  person David C    schedule 19.12.2016
comment
Вы можете попробовать, но я не уверен, что это сработает.   -  person Ansgar Wiechers    schedule 20.12.2016
comment
Я попробовал команду вызова и команду get-acl | set-acl, и он по-прежнему переводит sid с server1 на server2. У меня была надежда на это, потому что он переводит sid на экран.   -  person David C    schedule 20.12.2016
comment
См. решение Дейва Вятта здесь: powershell.org/forums /тема/   -  person JohnLBevan    schedule 20.08.2019


Ответы (1)


Вы не можете заменить ссылку на удостоверение в существующей ACE, вам нужно заменить всю ACE на новую.

$acl = Get-Acl -Path 'C:\Temp'

$ace = $acl.Access | Where-Object { $_.IdentityReference -eq 'BUILTIN\Users' }
$newAce = New-Object System.Security.AccessControl.FileSystemAccessRule (
    'new\name',
    $ace.FileSystemRights,
    $ace.InheritanceFlags,
    $ace.PropagationFlags,
    $ace.AccessControlType
)
$acl.RemoveAccessRule($ace)
$acl.AddAccessRule($newAce)

Set-Acl -Path 'C:\Temp' -AclObject $acl
person Ansgar Wiechers    schedule 18.12.2016