2016-07-19 27 views
1

いくつかのマシンを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でこれを動作させるにはどうすればよいですか?

+0

ネイティブコードでは、キーを開くときに要求するアクセス許可を慎重に選択することでこれを行います。また、オーナーを設定するために2回、次に権限を変更するためにもう一度開く必要があります。私はあなたが.NETクラスを使ってこのようにできるかどうかはわかりません。簡単な回避策として、バックアップと復元の特権を有効にしてみてください。 –

+0

ここで私の無知を許してください...あなたがネイティブコードを言うとき、私はそれがC++を意味すると仮定し、これは私がこれを達成するために呼び出すことができるP/invokeメソッドがあるかどうか疑問に思うでしょうか? – SoaperGEM

+0

もちろん、P/Invokeを使っても可能です。 .NETクラスを使用することができれば、はるかに簡単になり、バックアップ/復元権限を簡単に使用できます。 (P/Invokeルートに行きたい場合は、RegCreateKeyExとSetSecurityInfoを参照してください) –

答えて

2

私はそれを理解しましたが、幸運なことに.NETクラスで達成することは可能です。ここでは、OpenSubKeyを呼び出すために持っているかである:

var subKey = Registry.ClassesRoot.OpenSubKey(@"AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.TakeOwnership); 

次にあなたがAddAccessRule()への呼び出しをnixのために持っている...あなたが所有権を持ってまで、あなたはそれを変更することはできません。あなたはこれら2つの操作を連続して行う必要があります。そのため、まず所有権を取得し、異なるアクセス権でキーを再度開いてアクセスルールを追加します。

EDIT

は、私はあなたが 最初/呼び出しを起動Pにフックすることで、アプリケーションが実行されているとのトークンを操作しなければならないことを今日発見しました。 another Stack Overflow questionで参照されているTokenManipulatorというクラスが見つかりました。そのクラスをプロジェクトに組み込み、 OpenSubKeyを呼び出す前に、バックアップ、復元、および引き取り権限をトークンに付与します。したがって、あなたのメソッドは次のようなものになります:

try 
{ 
    TokenManipulator.AddPrivilege("SeRestorePrivilege"); 
    TokenManipulator.AddPrivilege("SeBackupPrivilege"); 
    TokenManipulator.AddPrivilege("SeTakeOwnershipPrivilege"); 

    var subKey = Registry.ClassesRoot.OpenSubKey(@"AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.TakeOwnership); 
    // code to change owner... 
} 
finally 
{ 
    TokenManipulator.RemovePrivilege("SeRestorePrivilege"); 
    TokenManipulator.RemovePrivilege("SeBackupPrivilege"); 
    TokenManipulator.RemovePrivilege("SeTakeOwnershipPrivilege"); 
} 
+0

私はあなたが本当に「所有権を取る」特権しか必要ないと推測しているでしょう。しかし、それは他の2つを主張することを傷つけることはありません。 –

関連する問題