2

通常TrustedInstaller が所有するレジストリ値を変更する Powershell スクリプトがあります。基本的なワークフローは次のとおりです。

  1. 編集用のキーを開いてみる

    1. これが失敗した場合は、アクセス許可のキーを開いてみてください

      1. これが失敗した場合は、所有権を取得するためにキーを開いてください
      2. ACL をバックアップします。if ($backupAcl -eq $null) { $backupAcl = $key.GetAccessControl(); }
      3. ACL の作業コピーを取得します。$acl = $key.GetAccessControl();
      4. で所有者を設定します$acl.SetOwner($me);
      5. 権限変更のキーを開く
    2. ACL をバックアップします。if ($backupAcl -eq $null) { $backupAcl = $key.GetAccessControl(); }

    3. ACL の作業コピーを取得します。$acl = $key.GetAccessControl();
    4. で権限を適用します$acl.AddAccessRule($rule); $acl.SetAccessControl($acl);
    5. キーを開いて編集する
  2. 変更する必要がある値を変更する$key.SetValue(...)

  3. 以前に行った権限への変更を元に戻します。

アクセス許可を元に戻すために使用しているコードは次のとおりです。

$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 をスクリプトが開始されたときの状態に戻すにはどうすればよいでしょうか?

4

2 に答える 2

1

わかった。ObjectSecurityこの方法ではオブジェクトを再利用できないようです。そのため、メソッドを使用してバックアップ ACL をGetSecurityDescriptorBinaryForm()シリアライズし、メソッドを使用して再度デシリアライズする必要がありましたSetSecurityDescriptorBinaryForm(...)

ただし、それを行った後、別のエラーが発生しました- The security identifier is not allowed to be the owner of this object

SeRestorePrivilegeシステム特権を要求することでこれを克服する必要がありました。これはEnable-Privelegehttp://social.technet.microsoft.com/Forums/en/winserverpowershell/thread/e718a560-2908-4b91-ad42-d392e7f8f1ad (関数SeTakeOwnershipPrivilegeそもそも所有権を取得するために必要なものをリクエストするためにすでに使用していました)。

この権限を取得したら、キャッシュにある逆シリアル化された ACL で ACL を上書きできました。

したがって、ACL をバックアップするには:

if ($aclBackup -eq $null) { 
    $aclBackup = $key.GetAccessControl().GetSecurityDescriptorBinaryForm(); 
}

そしてそれを復元するには:

if (Enable-Privilege SeRestorePrivilege) {
    $acl = New-Object System.Security.AccessControl.RegistrySecurity;
    $acl.SetSecurityDescriptorBinaryForm($aclBackup, $aclIncludeAll);

    $key = $keyRoot.OpenSubKey($subKeyName, $regOpenMode, $regTakeOwnChangePerms);
    $key.SetAccessControl($acl);
    $key.Close();
}

これが将来他の誰かに役立つことを願っています...

于 2013-02-20T18:09:22.767 に答える
0

Set-ACLメモリ内のオブジェクトに変更を加えるため、コマンドを使用して実際のファイルACLに変更を加える必要があります。

Get ACLを使用すると、レジストリキーからアクセスリストが読み取られます。この行は必要ないと思います。

$key = [Microsoft.Win32.Registry]::ClassesRoot.OpenSubKey($subKeyName, $regOpenMode, $regTakeOwnChangePerms);

試す

$ACLobject = Get-ACL -Path $RegKey
$ACLObject |Set-ACL -Path $newRegKey

その間に、$ACLobjectのプロパティを好きなように操作できます。

于 2013-02-20T16:43:39.323 に答える