いくつかのマシンをWindows 10にアップグレードしたときに奇妙な問題に遭遇し、RuntimeBrokerの不正なアクセス許可が問題を引き起こしました。私はa solution onlineが(レジストリの最初のDCOM構成で)変更のアクセス許可を変更することをお勧めし、私は小さな.NETアプリケーションを記述してプロセスを自動化しようとしています。プログラムで管理者にレジストリキーの所有権を与える方法を教えてください。
現在、関連するレジストリキーの所有者はNT SERVICE\TrustedInstaller
で、COMPUTER\Administrators
に変更しようとしています。私は、 "requireAdministrator"に設定されたrequestedExecutionLevelを持つシンプルなWPFアプリケーションを持っていますが、私はまだ問題に走っています。ここでは、問題を説明するためのコードの抜粋です:
using System.Security.AccessControl;
using System.Security.Principal;
using Microsoft.Win32;
namespace PermissionFixer
{
public class Fixer
{
public void Fix()
{
var subKey = Registry.ClassesRoot.OpenSubKey(@"AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}", true);
if (subKey != null)
{
var admins = new NTAccount("Administrators");
var ac = subKey.GetAccessControl();
ac.SetOwner(admins);
ac.AddAccessRule(new RegistryAccessRule(admins, RegistryRights.FullControl, AccessControlType.Allow));
subKey.SetAccessControl(ac);
}
}
}
}
トラブルはそれも言うSecurityException
押す前にOpenSubKey()
への呼び出しを乗り越えるないということである「要求されたレジストリアクセスは許可されていませんが。」管理者はまだアクセス権がありません(TrustedInstallerに属していることを覚えておいてください)が、これはちょっとした鶏と卵の問題になります。奇妙なことは、私がregedit
を手で使用した場合、私はです。は、所有者をAdministratorsに変更することを許可されています。私はregeditのインスタンスが管理者として実行されていると確信しています。
.NETでこれを動作させるにはどうすればよいですか?
ネイティブコードでは、キーを開くときに要求するアクセス許可を慎重に選択することでこれを行います。また、オーナーを設定するために2回、次に権限を変更するためにもう一度開く必要があります。私はあなたが.NETクラスを使ってこのようにできるかどうかはわかりません。簡単な回避策として、バックアップと復元の特権を有効にしてみてください。 –
ここで私の無知を許してください...あなたがネイティブコードを言うとき、私はそれがC++を意味すると仮定し、これは私がこれを達成するために呼び出すことができるP/invokeメソッドがあるかどうか疑問に思うでしょうか? – SoaperGEM
もちろん、P/Invokeを使っても可能です。 .NETクラスを使用することができれば、はるかに簡単になり、バックアップ/復元権限を簡単に使用できます。 (P/Invokeルートに行きたい場合は、RegCreateKeyExとSetSecurityInfoを参照してください) –