我现在看了几个StackOverflow线程。 This comes closest.
我坚持使用VS2005和.NET 2.0。服务器是Win2008。不是R2。
我正在构建一个C#ASP.NET Web应用程序,它从一个由VB6应用程序修改的数据库中读取信息。数据库配置设置存储在注册表中。
我正在使用Registry.GetValue()函数,它返回一个空值。
如果我以管理员身份运行应用程序池,代码将返回预期值。对于任何其他用户,ToString会抛出System.NullReferenceException。我尝试过以下方法:
附件是相关代码:
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 :(得分: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\
然后所有用户通常都能读取相同的值。