Служба Windows C # должна внести изменения в реестр - PullRequest
3 голосов
/ 27 октября 2009

У меня есть служба, которая должна обновлять реестр каждые 5 минут (противодействовать gpo). Код работает нормально в обычном приложении, но когда я помещаю его в службу Windows, он не вносит изменения. Я использую локальную системную учетную запись для службы, и она не выдает никаких исключений

Код ниже работает в обычном консольном приложении, но не в сервисе:

RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true);
        if (key != null)
        {
            key.SetValue("ScreenSaverIsSecure", "0", RegistryValueKind.String);
            key.SetValue("ScreenSaveActive", "0", RegistryValueKind.String);
            key.SetValue("ScreenSaveTimeOut", "0", RegistryValueKind.String);
            key.SetValue("SCRNSAVE.EXE", "", RegistryValueKind.String);
        }


        key = Registry.CurrentUser.OpenSubKey(@"Software\Policies\Microsoft\Windows\Control Panel\Desktop", true);
        if (key != null)
        {
            key.SetValue("ScreenSaverIsSecure", "0", RegistryValueKind.String);
            key.SetValue("ScreenSaveActive", "0", RegistryValueKind.String);
            key.SetValue("ScreenSaveTimeOut", "0", RegistryValueKind.String);
            key.SetValue("SCRNSAVE.EXE", "", RegistryValueKind.String);
        }
        System.Diagnostics.Process.Start(@"c:\windows\System32\RUNDLL32.EXE", "user32.dll, UpdatePerUserSystemParameters");

Есть идеи?

EDIT:

Спасибо за ответы. Я не знаю, почему «CurrentUser» ускользнул от моего внимания. Спасибо за указание на это.

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

EDIT:

Что касается комментария Уилла, я не могу найти подпись функции UpdatePerUserSystemParameters в интерфейсе win32. Означает ли это, что он может быть вызван без параметров?

   [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool UpdatePerUserSystemParameters();

Ответы [ 6 ]

5 голосов
/ 27 октября 2009

См. эту страницу :

Служба, которая работает в контексте учетной записи LocalSystem, наследует контекст безопасности SCM ... Это имеет несколько последствий:

Раздел реестра HKEY_CURRENT_USER связан с пользователем по умолчанию, а не с текущим пользователем. Чтобы получить доступ к профилю другого пользователя, выдать себя за пользователя, а затем получить доступ к HKEY_CURRENT_USER.

3 голосов
/ 27 октября 2009

Что (кого) вы ожидаете Currentuser внутри службы?

2 голосов
/ 27 октября 2009

Если это работает вне службы, это может быть проблема с разрешениями. Получаете ли вы исключение при попытке использовать key.SetValue ()? Служба работает под учетной записью, которая имеет доступ на запись в реестр?

2 голосов
/ 27 октября 2009

Запустите свой сервис под другой учетной записью, которая фактически имеет логин.

Локальная системная учетная запись не является пользователем, и поэтому отсутствует ключ Registry.CurrentUser (нет логина = нет текущего пользователя = нет текущего ключа пользователя.

2 голосов
/ 27 октября 2009

Реестр - это всегда весело, но разве это не значит, что вы редактируете настройки реестра user пользователя "локальной системы"? Поэтому, если ваш фактический пользователь не вошел в систему как "локальная система" (в чем я серьезно сомневаюсь), он ничего не увидит ...

Я подозреваю, что вам нужно отредактировать настройки всей машины или активных пользователей.

1 голос
/ 27 октября 2009

попробуйте поместить код манипуляции с реестром в блок try-catch; службы запускаются во вторичных потоках, которые питаются исключениями

...