2012-09-13 67 views
2

我已經看過幾個StackOverflow線程了。 This comes closest.爲什麼我的ASP.NET應用程序需要管理員權限從註冊表讀取?

我被困在使用VS2005和.NET 2.0。服務器是Win2008。不是R2。

我正在構建一個C#ASP.NET Web應用程序,該應用程序從VB6應用程序修改的數據庫中讀取信息。數據庫配置設置存儲在註冊表中。

我使用Registry.GetValue()函數,它返回一個空值。

如果我讓應用程序池以管理員身份運行,代碼將返回期望值。與任何其他用戶一樣,ToString引發System.NullReferenceException。我曾嘗試以下:

  1. 製作的應用程序池的使用和分配完全控制以下用戶不工作:
    1. NT AUTHORITY \ NETWORK SERVICE
    2. NT AUTHORITY \ SYSTEM
    3. NT AUTHORITY \本地服務
    4. 管理員組中的自定義用戶。
  2. 我無法將權限應用於IIS APPPOOL \ DefaultAppPool,因爲用戶似乎不存在。這是一個documented fault of Server 2008
  3. 如果我使AppPool使用管理員帳戶,系統工作。

附上相關代碼:

string root = "HKEY_CURRENT_USER"; 
string keyName = @"Software\Some\Key\Somewhere\"; 
string valueName = "someValue"; 
string fullKey = root + @"\" + keyName; 
object keyValue; 
try 
{ 
    keyValue = Registry.GetValue(fullKey, valueName, "Value not found."); 
    string val = keyValue.ToString(); 
    return val; 
} 
catch (Exception ex) 
{ 
    return ex.GetType().ToString(); 
} 

,除非它以管理員身份運行,上面的代碼運行時keyValue.ToString總是返回一個System.NullReferenceException()。它從不拋出System.Security.SecurityException。

我並不急於讓我的網絡應用程序需要管理員訪問權限。

+0

誰在創建RegKey?打開註冊表並瀏覽到您的註冊碼。右鍵單擊=>准入,然後查找正確的值。 –

+0

密鑰由管理員組擁有。管理員用戶,管理員組和SYSTEM組完全控制。 RESTRICTED組有讀取權限。如果我爲NETWORK SERVICE或任何其他帳戶添加權限,並在該用戶下運行應用程序池,則應用程序仍會失敗。它只適用於管理員。它甚至不能用作LocalSystem(SYSTEM)。 – LenPayne

回答

2

您正在爲當前用戶搜索關鍵字。顯然,數據存在於管理員的密鑰下,而不是其他用戶的密鑰。

對於沒有配置文件的服務帳戶,HKEY_CURRENT_USER會解析爲HKEY_USERS.Default。

所以,使其與服務帳戶時,您需要將值添加到

HKEY_USERS\.Default\Software\Some\Key\Somewhere\ 

,使之成爲Administrators組中的自定義用戶的工作,你需要將它添加到

HKEY_USERS\<sid>\Software\Some\Key\Somewhere\ 

其中是自定義用戶的SID。

這與需要管理員訪問權限無關,只是在錯誤的位置查找!

如果數據不是用戶特定的,嘗試把它:

HKEY_LOCAL_MACHINE\Software\Some\Key\Somewhere\ 

那麼所有的用戶通常能夠讀取相同的值。

+0

謝謝。就是這樣。我的錯。 該應用程序還將設置寫入HKEY_LOCAL_MACHINE,所以我將使用它。 – LenPayne

相關問題