2012-02-17 10 views
1

プログラムでC#を使用してレジストリ値を読み取るときに問題が発生しました。 私は多くのサイトを調べて助けてくれましたが、役に立たないものは見つかりませんでした。 VSを拡張モードで実行するとレジストリにアクセスして読み込めますが、昇格モードを解除してVSを実行すると問題が発生します。 は当初、私は以下のコードプログラムでレジストリにアクセスする際の問題

byte[] val = (byte[])Registry.GetValue("HKEY_LOCAL_MACHINE\\Software\\MyServices\\Identity\\ASPNET_SETREG", "ValueName", 0); 

で開始これは昇格モードで正常に働いたが、非昇格モードで失敗しました。 はこれで問題が解決しない機能

[RegistryPermissionAttribute(SecurityAction.Demand,Unrestricted=true)] 

の上に属性を置きました。次に試しました

[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.LinkDemand, Flags = System.Security.Permissions.SecurityPermissionFlag.AllFlags)] 

まだ動作しませんでした。 は、今私は...以下のコードを試してみました

RegistryKey key = Registry.LocalMachine;    


     RegistrySecurity rs = new RegistrySecurity(); 
     rs = key.GetAccessControl(); 
     string user = "DomainName\\Username"; 
     rs.AddAccessRule(new RegistryAccessRule(user, 
     RegistryRights.ReadKey, 
     InheritanceFlags.None, 
     PropagationFlags.None, 
     AccessControlType.Allow)); 


     key.SetAccessControl(rs);//Exception: "Attempted to perform an unauthorized operation."} 
     //RegistryKey key2 = key.OpenSubKey("Software\\MyServices\\Identity\\ASPNET_SETREG"); 
     //RegistryKey key2 = key.OpenSubKey("Software\\MyServices\\Identity\\ASPNET_SETREG", false); 
     //RegistryKey key2 = key.OpenSubKey("Software\\MyServices\\Identity\\ASPNET_SETREG", RegistryKeyPermissionCheck.ReadSubTree); 
     RegistryKey key2 = key.OpenSubKey("Software\\MyServices\\Identity\\ASPNET_SETREG", RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadPermissions); 

がSetAccessControlをコメントしてOpenSubkeyオプションのいずれかを使用して、私は例外を取得:「要求されたレジストリアクセスは許可されていません。」

私はひどく立ち往生しており、進めません。助けてください

+0

「regedit」を使用して問題のレジストリキーに移動してみてください。キーを右クリックし、_Permissions_オプションを選択します。 – LiquidPony

+0

言いたいことを忘れて、私は早くそれをやってみました! – Murthy

+0

奇妙なことに、Creater Ownerは完全な制御権や読み取り権を持っていませんが、システム、管理者、ユーザーは完全な制御権と読み取り権を持っています。作成者の所有者には特別な権限しかありません。クリックして高度な...権限タブで、私は作成者の所有者の権限がサブキーだけに適用されるのを見るが、他の人はこのキーとサブキーに権限が適用される!これは私を驚かせる! – Murthy

答えて

1
private RegistryKey keyR = Registry.CurrentUser.OpenSubKey("Software\\YourKey",true); 
private RegistryKey keyW = Registry.CurrentUser.CreateSubKey("Software\\YourKey"); 

public string version 
{ 
    get { return keyR.GetValue("VERSION", "", RegistryValueOptions.DoNotExpandEnvironmentNames).ToString(); } 
    set { keyW.SetValue("VERSION", value, RegistryValueKind.String); } 
} 

私はこの方法でWindowsレジストリを使用しています。いいえ問題はありません...

+0

瞬間、OpenSubkey、例外! – Murthy

+0

はこのように 'Registry.CurrentUserを試してください。OpenSubKey( "Software \\ YourKey"、true); ' – Alex

+0

皆さんは少し目標を外しています - 問題は一般的にレジストリにアクセスすることではなく、どちらの方法もうまくいく - 問題はレジストリがファイルシステムだけでなく、他のファイルシステムと同様に、特定の部分へのアクセスを制限します。 – antiduh

1

Windowsレジストリは、基本的に構造化ファイルシステムであり、キーと値に対するアクセス許可を持っています。

...\MyServices\以上のアクセス権が正しく設定されていないため、特権のないプロセスからのアクセス権がありません。

次のいずれかをあなたが誰もによってそれらを読みやすくするためのパーミッションを変更する必要がありますので

  1. これらのキーは、誰でも読めるはずです。または -
  2. これらのキーは正当な理由で制限されているため、すべての人が読むことができないようにする必要があります。その場合、プログラムは常に昇格されている必要があります。