2

我现在查看了几个 StackOverflow 线程。这是最接近的。

我坚持使用 VS2005 和 .NET 2.0。服务器是Win2008。不是R2。

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

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

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

  1. 使 AppPool 使用并将完全控制权分配给以下用户不起作用:
    1. NT AUTHORITY\网络服务
    2. NT AUTHORITY\SYSTEM
    3. NT 当局\本地服务
    4. 管理员组中的自定义用户。
  2. 我无法对 IIS APPPOOL\DefaultAppPool 应用权限,因为该用户似乎不存在。这是记录在案的 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。

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

4

1 回答 1

2

您正在搜索当前用户的键。显然,数据存在于管理员的密钥下,但不存在于其他用户。

对于没有配置文件的服务帐户,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\

那么所有用户通常都可以读取相同的值。

于 2012-09-13T14:14:35.450 回答