2008-09-08 32 views
0

我已經繼承了一段古老的代碼(我的意思是有很多未經批准的bug修復比WTF-y更糟糕),並且有一個部分給我帶來一些麻煩。以下是如何連接到遠程註冊表,進入添加/刪除程序鍵:遠程連接到註冊表並獲取例外

try 
{ 
    remoteKey = RegistryKey.OpenRemoteBaseKey(
     RegistryHive.LocalMachine, addr.Value).OpenSubKey(
     "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"); 
    return 1; 
} 
catch (IOException e) 
{ 
    IOException myexception = e; 
    //Console.WriteLine("{0}: {1}: {2}", 
    // e.GetType().Name, e.Message, addr.Value); 
    return 2; 
} 
catch (UnauthorizedAccessException e) 
{ 
    UnauthorizedAccessException myexception = e; 
    //Console.WriteLine("{0}: {1}: {2}", 
    // e.GetType().Name, e.Message, addr.Value); 
    return 3; 
} 
catch (System.Security.SecurityException e) 
{ 
    System.Security.SecurityException myexception = e; 
    //Console.WriteLine("{0}: {1}: {2}", 
    // e.GetType().Name, e.Message, addr.Value); 
    return 4; 
} 

現在,我有兩個問題:

  • 我知道爲什麼IOException - 如果它是一個非Windows它會拋出它的機器。 UnauthorizedAccessException和SecurityException之間的區別我不太清楚。任何人有任何想法?

  • 這個完整的代碼是在任何人以爲你可能不會使用你的本地登錄來完成的。無論如何,我無法弄清楚如何進行身份驗證以遠程連接到註冊表,並且此代碼看起來只在一種情況下使用,當它無法從WMI獲取此信息時。

任何一個幫助都會很好。

回答

0

John的指向MSDN的指針回答了UnauthorizedAccessException的用途 - 它僅在您嘗試使用OpenRemoteBaseKey遠程訪問密鑰時纔會顯示。

我們對改變計算機上的安全上下文有點謹慎 - 我找到了一個參考here關於使用WMI(我們已經用於絕大多數繁重的工作)訪問註冊表,所以我可能會嘗試。

1

您可能必須使用模擬來更改調用遠程註冊表方法的線程的憑據。有關MSDN的一些信息,請參閱此處(linky)。基本上,您的線程有一個安全上下文,用於進行託管和非託管調用。

1

根據MSDN,UnauthorizedAccessException是不是由OpenSubKey拋出。所以我認爲這不是必需的。