Почему моему приложению ASP.NET нужны права администратора для чтения из реестра?

Я просмотрел пару потоков StackOverflow. Это происходит ближайший.

Я застрял, используя VS2005 и .NET 2.0. Сервер Win2008. Не Р2.

Я создаю веб-приложение C# ASP.NET, которое считывает информацию из базы данных, измененной приложением VB6. Параметры конфигурации базы данных хранятся в реестре.

Я использую функцию Registry.GetValue(), и она возвращает нулевое значение.

Если я запускаю пул приложений от имени администратора, код возвращает ожидаемое значение. Для любого другого пользователя ToString выдает исключение System.NullReferenceException. Я пробовал следующее:

  1. Making the AppPool use and assigning Full Control to the following users does not work:
    1. NT AUTHORITY\NETWORK SERVICE
    2. ПОЛНОМОЧИЯ NT\СИСТЕМА
    3. NT AUTHORITY\LOCAL SERVICE
    4. Пользовательский пользователь в группе администраторов.
  2. Я не могу применить разрешения к IIS APPPOOL\DefaultAppPool, потому что пользователь не существует. Это задокументированная ошибка сервера 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();
}

Если он не запущен от имени администратора, приведенный выше код всегда возвращает исключение System.NullReferenceException при запуске keyValue.ToString(). Он никогда не выдает исключение System.Security.SecurityException.

Я не хочу, чтобы мое веб-приложение требовало доступа администратора.


person LenPayne    schedule 13.09.2012    source источник
comment
Кто создает RegKey? Откройте regedit и перейдите к своему регистровому ключу. Щелкните правой кнопкой мыши => Premission и найдите правильные значения.   -  person CodeTherapist    schedule 13.09.2012
comment
Ключ принадлежит группе администраторов. Пользователь-администратор, группа «Администраторы» и группа «СИСТЕМА» имеют полный доступ. Группа RESTRICTED имеет доступ для чтения. Если я добавлю разрешения для СЕТЕВОЙ СЛУЖБЫ или любой другой учетной записи и запущу пул приложений под этим пользователем, приложение все равно выйдет из строя. Это работает только для Администратора. Он не работает даже как LocalSystem (SYSTEM).   -  person LenPayne    schedule 13.09.2012


Ответы (1)


Вы ищете под ключом текущего пользователя. Очевидно, что данные существуют под ключом для администратора, но не для других пользователей.

Для учетных записей служб, у которых нет профиля, 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\

тогда все пользователи обычно смогут прочитать одно и то же значение.

person Joe    schedule 13.09.2012
comment
Спасибо. Вот оно. Моя ошибка. Приложение также записывает настройки в HKEY_LOCAL_MACHINE, поэтому я буду использовать его. - person LenPayne; 13.09.2012