我现在已经查看了几个 StackOverflow 线程。 This comes closest.
我一直在使用 VS2005 和 .NET 2.0。服务器是Win2008。不是 R2。
我正在构建一个 C# ASP.NET Web 应用程序,该应用程序从由 VB6 应用程序修改的数据库中读取信息。数据库配置设置存储在注册表中。
我正在使用Registry.GetValue()函数,它返回一个空值。
如果我让应用程序池以管理员身份运行,代码将返回预期值。对于任何其他用户,ToString 都会引发 System.NullReferenceException。我尝试过以下方法:
- 使用 AppPool 并将完全控制权分配给以下用户不起作用:
- NT 机构\网络服务
- NT 权威\系统
- 北领地当局\本地服务
- 管理员组中的自定义用户。
- 我无法向 IIS APPPOOL\DefaultAppPool 应用权限,因为该用户似乎不存在。这是documented fault of Server 2008 .
- 如果我让 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。
我并不急于让我的网络应用程序需要管理员访问权限。
最佳答案
您正在该键下搜索当前用户。显然,数据存在于管理员的 key 下,但不存在于其他用户的 key 下。
对于没有配置文件的服务帐户,HKEY_CURRENT_USER 解析为 HKEY_USERS.Default。
因此,要使其与服务帐户一起使用,您需要将值添加到
HKEY_USERS\.Default\Software\Some\Key\Somewhere\
要使其适用于管理员组中的自定义用户,您需要将其添加到
HKEY_USERS\<sid>\Software\Some\Key\Somewhere\
其中是自定义用户的 SID。
这与需要管理员访问权限无关,您只是找错了地方!
如果数据不是特定于用户的,请尝试将其放入:
HKEY_LOCAL_MACHINE\Software\Some\Key\Somewhere\
然后所有用户通常都能够读取相同的值。
关于c# - 为什么我的 ASP.NET 应用程序需要管理员权限才能从注册表中读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12407811/