c# - 为什么我的 ASP.NET 应用程序需要管理员权限才能从注册表中读取数据?

标签 c# asp.net registry administrator

我现在已经查看了几个 StackOverflow 线程。 This comes closest.

我一直在使用 VS2005 和 .NET 2.0。服务器是Win2008。不是 R2。

我正在构建一个 C# ASP.NET Web 应用程序,该应用程序从由 VB6 应用程序修改的数据库中读取信息。数据库配置设置存储在注册表中。

我正在使用Registry.GetValue()函数,它返回一个空值。

如果我让应用程序池以管理员身份运行,代码将返回预期值。对于任何其他用户,ToString 都会引发 System.NullReferenceException。我尝试过以下方法:

  1. 使用 AppPool 并将完全控制权分配给以下用户不起作用:
    1. NT 机构\网络服务
    2. NT 权威\系统
    3. 北领地当局\本地服务
    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。

我并不急于让我的网络应用程序需要管理员访问权限。

最佳答案

您正在该键下搜索当前用户。显然,数据存在于管理员的 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/

相关文章:

c# - 在 Gridview 中获取 TemplateFields 的值

c# - 使用 TryParse 设置对象属性值

asp.net - 将字符串传递到MVC4中的局部 View

c# - Automapper (5.1.1) ForAllMembers - 获取当前属性的名称

c# - 是什么导致 WPF 打印机输出被栅格化?

javascript - 显示模态对话框;在 IE 中打开一个新窗口

c# - EFCore - 如何将多个导航属性设置为同一类型?

icons - 如何重置 Windows XP 中的默认 .EXE 图标

registry - 从 wso2 注册表获取已部署的服务端点 url

excel - 如何通过注册表启用 Excel 自动化插件?