2017-07-17 1 views
2

エラーはありません。例外はありません。レジストリがそのまま残っていることを除いて、すべてがOKであるようです。C#:Windowsレジストリの変更を見ることができません

class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       Edit(); 
      } 
      catch (Exception) 
      { 
       Restore(); // not included in the sample for simplicity 
      } 
     } 

     public static void Edit() 
     { 
      Microsoft.Win32.RegistryKey Login; 
      Login = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(ConfigurationManager.AppSettings["Login"].ToString()); 
      Login.SetValue("ServerName", ConfigurationManager.AppSettings["ServerName"].ToString()); 
      Login.SetValue("ImageServerName", ConfigurationManager.AppSettings["ImageServerName"].ToString()); 
      Login.Close(); 

      Microsoft.Win32.RegistryKey Login2; 
      Login2 = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(ConfigurationManager.AppSettings["Wow6432NodeLogin"].ToString()); 
      Login2.SetValue("ServerName", ConfigurationManager.AppSettings["Wow6432NodeServerName"].ToString()); 
      Login2.SetValue("ImageServerName", ConfigurationManager.AppSettings["Wow6432NodeImageServerName"].ToString()); 
      Login2.Close(); 
     } 
} 

どこかにエラーがあると思います。しかし、例外はスローされません。キャッチブロックは決してヒットしません。

私は管理者として実行しています。私は管理者特権なしで実行しましたが、 "アクセスが拒否されました"と表示されるはずです。変更を適用するためにラップトップを再起動しましたが、まだ成功しませんでした。

私は最近追加された値を読み取るためにこのコードを使用し、私はキーを見ることができます。しかし、何らかの形で変更が適用されていません。

 Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(ConfigurationManager.AppSettings["Login"].ToString()); 
     Object o = key.GetValue("ServerName"); 
     Console.WriteLine(o.ToString()); 

私はSO、任意のCPUのために構築し、純4.5.2を使用しています:

Windows 7を私は変更か何かをコミットする必要がありますか?

+0

おそらくエラーが発生しています。エラーの内容を確認できるようにコードを編集する必要があります。 – SLaks

+0

これは私の考えですが、コンソールにエラーは表示されません。キャッチブロックは決してヒットしません。 –

+0

あなたはどのように知っていますか?あなたのコードは、 'catch'ブロックがヒットするかどうかを知る方法を提供しません。 – SLaks

答えて

2

@PieterWitvoetのコメントで示唆されているように、OpenBaseKey()を代わりに使用するとよいでしょう。これは、ここで説明したようにはWOW64レジストリのリダイレクトを避けるためです:https://msdn.microsoft.com/en-us/library/windows/desktop/aa384182.aspx

なお、ページの端にある小さな印刷:

を値を検査し、regeditによるこの例を実行しているの影響を調べるために次のキーのうちのどれか。アプリケーションでは、ハードコーディングされたレジストリパスでWow6432Nodeを使用しないでください。

ので、ここであなたが代わりにやって何ができるかの例がある:あなたが反対をお勧めしWow6432Nodeと特異的に扱うあなたのコードの第二の部分を捨てることができる方法

static void Edit() 
{ 
    using (var root = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) 
    using (RegistryKey key = root.CreateSubKey("SOFTWARE\\Homebrew-Testing")) 
    { 
     key.SetValue("ServerName", "ServerName-Value"); 
     key.SetValue("ImageServerName", "ImageServerName-Value"); 
    } 
} 

お知らせ上にリンクされた記事。

RegistryViewのドキュメントでは、32ビットオペレーティングシステムで64ビットビューを要求すると、返されるキーは32ビットビューになります。

こちらがお役に立てば幸いです。運が良かった。

関連する問題