设置 Acl。无法翻译部分或所有标识引用。 XML.config
Set-Acl. Some or all identity references could not be translated. XML.config
我的 PowerShell 脚本需要一些帮助来更改 Set-Acl
的 NTFS 权限。我已经知道了。
只要我在列表中只有一个 id,它就会工作。一旦我有超过 1 个 ID,我总是会收到此错误:
Some or all identity references could not be translated.
XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<Pfade>
<pfad id="1">
<name>d:\Freigabe</name>
<gruppe>Admin</gruppe>
<rechte>FullControl</rechte>
<aktion>allow</aktion>
<rechtsetzen>Add</rechtsetzen>
</pfad>
<pfad id="2">
<name>d:\Freigabe</name>
<gruppe>Jeder</gruppe>
<rechte>Modify</rechte>
<aktion>deny</aktion>
<rechtsetzen>Add</rechtsetzen>
</pfad>
<pfad id="3">
<name>d:\Freigabe\Ordner</name>
<gruppe>SYSTEM</gruppe>
<rechte>FullControl</rechte>
<aktion>allow</aktion>
<rechtsetzen>Add</rechtsetzen>
</pfad>
<pfad id="4">
<name>d:\Freigabe\Ordner</name>
<gruppe>Admin</gruppe>
<rechte>Modify</rechte>
<aktion>allow</aktion>
<rechtsetzen>Delete</rechtsetzen>
</pfad>
<pfad id="5">
<name>d:\Freigabe\TEst</name>
<gruppe>Jeder</gruppe>
<rechte>Modify</rechte>
<aktion>allow</aktion>
<rechtsetzen>Delete</rechtsetzen>
</pfad>
<pfad id="6">
<name>d:\Freigabe\TEst</name>
<gruppe>Admin</gruppe>
<rechte>FullControl</rechte>
<aktion>allow</aktion>
<rechtsetzen>Add</rechtsetzen>
</pfad>
</Pfade>
PowerShell:
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
$scriptpath = $MyInvocation.MyCommand.Path
$dir = Split-Path $scriptpath
cd $dir
$doc = [XML](Get-Content -Path struktur.xml)
[array]$arrayid = $doc.Pfade.pfad.id
for ($i=0; $i -lt $arrayid.count; $i++) {
New-Variable -Name "arrayid$i" -Value $arrayid[$i]
}
$path = $doc.Pfade.pfad
$pathname = $doc.Pfade.pfad.name
$pathgruppe = $doc.Pfade.pfad.gruppe
$pathrecht = $doc.Pfade.pfad.rechte
$pathaktion = $doc.Pfade.pfad.aktion
$pathrechts = $doc.Pfade.pfad.rechtsetzen
foreach ($i in $arrayid) {
$FolderName = $pathname
$acl = Get-Acl $FolderName
$acl.SetAccessRuleProtection($True, $False) #?
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($pathgruppe, $pathrecht, "ContainerInherit, ObjectInherit", "None", $pathaktion)
$pathgruppe
switch ($pathrechts) {
Add {$acl.AddAccessRule($rule)}
Delete {$acl.RemoveAccessRuleAll($rule)}
}
Set-Acl $FolderName $acl
}
Get-Acl $FolderName | select Path, Owner, Group, AccessToString | Format-List
cd $dir
Remove-Variable array*
错误信息:
使用 1 个参数调用 "AddAccessRule" 时出现异常:“部分或全部
无法翻译身份参考。”
在 D:*********.ps1:32 Zeichen:13
+ 添加 {$acl.AddAccessRule($rule)}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId:IdentityNotMappedException
使用 1 个参数调用 "RemoveAccessRuleAll" 的异常:“一些或
无法翻译所有身份参考。”
在 D:*********.ps1:33 Zeichen:16
+ 删除 {$acl.RemoveAccessRuleAll($rule)}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId:IdentityNotMappedException
设置 Acl:AclObject
在 D:*********.ps1:35 Zeichen:1
+ 设置 Acl $FolderName $acl
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo:InvalidArgument:(System.Object[]:Object[]) [Set-Acl], ArgumentException
+ FullyQualifiedErrorId : SetAcl_AclObject,Microsoft.PowerShell.Commands.SetAclCommand
有人可以帮忙吗?
您的 $path*
变量包含数组,其中包含您 XML 中各个节点的所有值,但 FileSystemAccessRule
构造函数期望每个规则都有一个标识引用。
将 $doc.Pfade.pfad
管道化到 ForEach-Object
循环中,并将剩余的 $path*
变量赋值放入循环中:
$doc.Pfade.pfad | ForEach-Object {
$pathgruppe = $_.gruppe
$pathrecht = $_.rechte
$pathaktion = $_.aktion
$pathrechts = $_.rechtsetzen
$FolderName = $_.name
...
Set-Acl $FolderName $acl
}
此外,您的 for
循环和 $arrayid*
变量毫无意义。删除它们。
我的 PowerShell 脚本需要一些帮助来更改 Set-Acl
的 NTFS 权限。我已经知道了。
只要我在列表中只有一个 id,它就会工作。一旦我有超过 1 个 ID,我总是会收到此错误:
Some or all identity references could not be translated.
XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<Pfade>
<pfad id="1">
<name>d:\Freigabe</name>
<gruppe>Admin</gruppe>
<rechte>FullControl</rechte>
<aktion>allow</aktion>
<rechtsetzen>Add</rechtsetzen>
</pfad>
<pfad id="2">
<name>d:\Freigabe</name>
<gruppe>Jeder</gruppe>
<rechte>Modify</rechte>
<aktion>deny</aktion>
<rechtsetzen>Add</rechtsetzen>
</pfad>
<pfad id="3">
<name>d:\Freigabe\Ordner</name>
<gruppe>SYSTEM</gruppe>
<rechte>FullControl</rechte>
<aktion>allow</aktion>
<rechtsetzen>Add</rechtsetzen>
</pfad>
<pfad id="4">
<name>d:\Freigabe\Ordner</name>
<gruppe>Admin</gruppe>
<rechte>Modify</rechte>
<aktion>allow</aktion>
<rechtsetzen>Delete</rechtsetzen>
</pfad>
<pfad id="5">
<name>d:\Freigabe\TEst</name>
<gruppe>Jeder</gruppe>
<rechte>Modify</rechte>
<aktion>allow</aktion>
<rechtsetzen>Delete</rechtsetzen>
</pfad>
<pfad id="6">
<name>d:\Freigabe\TEst</name>
<gruppe>Admin</gruppe>
<rechte>FullControl</rechte>
<aktion>allow</aktion>
<rechtsetzen>Add</rechtsetzen>
</pfad>
</Pfade>
PowerShell:
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
$scriptpath = $MyInvocation.MyCommand.Path
$dir = Split-Path $scriptpath
cd $dir
$doc = [XML](Get-Content -Path struktur.xml)
[array]$arrayid = $doc.Pfade.pfad.id
for ($i=0; $i -lt $arrayid.count; $i++) {
New-Variable -Name "arrayid$i" -Value $arrayid[$i]
}
$path = $doc.Pfade.pfad
$pathname = $doc.Pfade.pfad.name
$pathgruppe = $doc.Pfade.pfad.gruppe
$pathrecht = $doc.Pfade.pfad.rechte
$pathaktion = $doc.Pfade.pfad.aktion
$pathrechts = $doc.Pfade.pfad.rechtsetzen
foreach ($i in $arrayid) {
$FolderName = $pathname
$acl = Get-Acl $FolderName
$acl.SetAccessRuleProtection($True, $False) #?
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($pathgruppe, $pathrecht, "ContainerInherit, ObjectInherit", "None", $pathaktion)
$pathgruppe
switch ($pathrechts) {
Add {$acl.AddAccessRule($rule)}
Delete {$acl.RemoveAccessRuleAll($rule)}
}
Set-Acl $FolderName $acl
}
Get-Acl $FolderName | select Path, Owner, Group, AccessToString | Format-List
cd $dir
Remove-Variable array*
错误信息:
使用 1 个参数调用 "AddAccessRule" 时出现异常:“部分或全部 无法翻译身份参考。” 在 D:*********.ps1:32 Zeichen:13 + 添加 {$acl.AddAccessRule($rule)} + ~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId:IdentityNotMappedException 使用 1 个参数调用 "RemoveAccessRuleAll" 的异常:“一些或 无法翻译所有身份参考。” 在 D:*********.ps1:33 Zeichen:16 + 删除 {$acl.RemoveAccessRuleAll($rule)} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId:IdentityNotMappedException 设置 Acl:AclObject 在 D:*********.ps1:35 Zeichen:1 + 设置 Acl $FolderName $acl + ~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidArgument:(System.Object[]:Object[]) [Set-Acl], ArgumentException + FullyQualifiedErrorId : SetAcl_AclObject,Microsoft.PowerShell.Commands.SetAclCommand
有人可以帮忙吗?
您的 $path*
变量包含数组,其中包含您 XML 中各个节点的所有值,但 FileSystemAccessRule
构造函数期望每个规则都有一个标识引用。
将 $doc.Pfade.pfad
管道化到 ForEach-Object
循环中,并将剩余的 $path*
变量赋值放入循环中:
$doc.Pfade.pfad | ForEach-Object {
$pathgruppe = $_.gruppe
$pathrecht = $_.rechte
$pathaktion = $_.aktion
$pathrechts = $_.rechtsetzen
$FolderName = $_.name
...
Set-Acl $FolderName $acl
}
此外,您的 for
循环和 $arrayid*
变量毫无意义。删除它们。