Назад | Перейти на главную страницу

Ключи реестра недоступны для приложения, запущенного из службы

Мы пишем собственное приложение-службу Windows. Служба настроена так, чтобы разрешить взаимодействие с рабочим столом, и приложение службы должно будет выполнить другое «обычное» приложение. Служба настроена для запуска и работы с обычной учетной записью пользователя Windows, а не с системной.

Проблема, с которой мы сталкиваемся, заключается в том, что, когда служба вызывает другое обычное приложение, кажется, что реестр не загружается, как это происходит, когда учетная запись пользователя, под которой работает служба, входит в Windows. В частности, приложение выдает ошибку о том, что определенные разделы реестра недоступны.

Почему учетная запись, на которой запущена служба, не получает полный реестр, который получают те же учетные записи пользователей при входе в ту же систему Windows? Что можно сделать, чтобы это изменить?

Учетные записи служб не загружают профиль пользователя, поэтому не имеют доступа к кусту реестра HKCU. Настройки для таких сервисов должны храниться в HKLM с соответствующими настройками безопасности, размещенными на ключах по мере необходимости. Однако, если профиль вообще загружен в систему, он должен существовать где-то под HKU, если вы попытаетесь его найти.

Я думаю, здесь происходит что-то еще.

Пользователь вошел в систему одновременно с сервисом? В этом случае куст реестра может быть заблокирован. Есть ли сообщения в журнале событий Windows?

Причина, по которой я считаю, что приложение должно иметь доступ к реестру HKEY_CURRENT_USER, заключается в том, что я протестировал это и создал образец службы C # Windows (код ниже, если интересно).

Однако приложения, предназначенные для работы в качестве службы, не должны хранить свою информацию в кусте регистров HKCU. HKLM - это правильное место для общесистемных настроек приложения.

Тестирование выполнено

Я создал новую учетную запись пользователя с административным доступом в Windows 7. Затем я предоставил ей права «Вход в качестве службы», установил и запустил службу.

Мои выводы были следующими: * Когда я запускал службу, HKCU был загружен и в него можно было писать. * Когда улей уже был загружен, я получил это сообщение в журнале событий, а реальный улей не был обновлен. Вместо этого был создан временный улей.

Windows не удалось загрузить реестр. Эта проблема часто вызвана нехваткой памяти или недостаточными правами безопасности.

ДЕТАЛИ - Процесс не может получить доступ к файлу, потому что он используется другим процессом. для C: \ Users \ OtherService \ ntuser.dat

Также http://msdn.microsoft.com/en-us/library/ms684190(v=VS.85).aspx и тут http://msdn.microsoft.com/en-us/library/ms684188(v=VS.85).aspx указывают, что даже системные учетные записи по умолчанию имеют куст реестра, который загружается в HKCU, хотя он может быть общим.

Код для тестовой службы

public partial class ExecuterSvc : ServiceBase
{
    public ExecuterSvc()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        TagRegistryHive("Tag", "Written");
    }

    protected override void OnStop()
    {

    }

    public void TagRegistryHive(string KeyName, object Value)
    {
        try
        {
            // Load the hive.
            var rk = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default);

            rk.SetValue(KeyName.ToUpper(), Value);
        }
        catch (Exception e)
        {

        }
    }
}