我有一个 Powershell 脚本,它更改了通常由 TrustedInstaller 拥有的注册表值。基本工作流程是:
尝试打开密钥进行编辑
如果失败,请尝试打开密钥以获得权限
- 如果失败,请尝试打开获取所有权的密钥
- 使用备份 ACL
if ($backupAcl -eq $null) { $backupAcl = $key.GetAccessControl(); }
- 获取 ACL 的工作副本
$acl = $key.GetAccessControl();
- 将所有者设置为
$acl.SetOwner($me);
- 打开权限更改密钥
使用备份 ACL
if ($backupAcl -eq $null) { $backupAcl = $key.GetAccessControl(); }
- 获取 ACL 的工作副本
$acl = $key.GetAccessControl();
- 应用权限
$acl.AddAccessRule($rule); $acl.SetAccessControl($acl);
- 打开密钥进行编辑
更改我需要更改的值
$key.SetValue(...)
恢复之前对权限所做的任何更改。
我用来恢复权限的代码如下:
$key = [Microsoft.Win32.Registry]::ClassesRoot.OpenSubKey($subKeyName, $regOpenMode, $regTakeOwnChangePerms);
Write-Host "Setting permissions to:"
Format-List -InputObject $aclBackup;
$key.SetAccessControl($aclBackup);
Write-Host "Permissions set to:"
Format-List -InputObject $key.GetAccessControl();
$key.Close();
...但是,它实际上从未将 ACL 设置回原来的状态。
除此之外,脚本工作正常——ACL 设置为更改值所需的值(所以我知道我可以更改 ACL)并且值本身已更改(所以我知道我已经更改了 ACL) .
但回归永远不会发生。不会引发任何异常——它永远不会发生。
为什么不?以及如何将 ACL 恢复到脚本启动时的状态?