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

时间:2012-09-13 13:49:55

标签: 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 AUTHORITY \ NETWORK SERVICE
    2. NT AUTHORITY \ SYSTEM
    3. NT AUTHORITY \ LOCAL SERVICE
    4. 管理员组中的自定义用户。
  2. 我无法将权限应用于IIS APPPOOL \ DefaultAppPool,因为用户似乎不存在。这是documented fault of Server 2008
  3. 如果我让AppPool使用管理员帐户,则系统可以正常工作。
  4. 附件是相关代码:

    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。

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

1 个答案:

答案 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\

然后所有用户通常都能读取相同的值。