У меня проблема с сервисом Windows, над которым я работаю в настоящее время. В основном я сохраняю некоторые значения в реестре HKCU (из инструмента GUI запускается как администратор), и из этого графического интерфейса я запускаю службу. Служба использует учетную запись SYSTEM для запуска, и я считаю, что это моя проблема. Я не могу получить доступ к ключам реестра, хранящимся в моем GUI-инструменте внутри службы, поскольку это указывает на другой HKCU!C# Реестр доступа другого пользователя
Как я могу «перенаправить» службу на использование HKCU пользователя, с которым он был сохранен? (На самом деле я могу передать имя пользователя службе или SID, если кто-то укажет мне, как получить ее в моем графическом интерфейсе, но я не знаю, что я должен использовать, чтобы «изменить» пользователя, чтобы указать на правильный)
@EDIT
Я использую статический класс для доступа к реестру, он используется как графический интерфейс и службы и функции, чтобы получить базовый ключ (это строка корневого раздела переменную, содержащую имя подраздела):
private static RegistryKey GetBaseKey(bool writable = false)
{
try
{
RegistryKey reg = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
RegistryKey rk = reg?.OpenSubKey("SOFTWARE", writable)?.OpenSubKey(rootKey, writable);
return rk;
}
catch (Exception ex)
{
// handle exceptions later
}
return null;
}
Я нашел класс WindowsIdentity, который может предоставить дескриптор (AccessToken) для текущего пользователя, должен ли я передать его в качестве аргумента моей службе и использовать этот дескриптор для олицетворять внутри службы?
@ EDIT2
Я сделал некоторые вещи, но он не работает. То, что я пробовал:
CurrentUserToken = WindowsIdentity.GetCurrent().Token; // to get current identity token
затем ServiceController.Start
я добавил CurrentUserToken.ToString()
в качестве аргумента. В моей службы я инициализируется RegistryUserToken (IntPtr)
с переданным значением, и я застрял на:
WindowsIdentity RegUser = new WindowsIdentity(RegistryUserToken)
бросали за исключением
недопустимый маркер для перевоплощения - это не может быть повторен
Я попытался то же самое с AccessToken текущего экземпляра WindowsIdentity - то же самое исключение, вызванное
Могу ли я вообще пойти так? Или я должен попробовать что-то другое?
Показать Ваш код. Как вы работаете с реестром? –
Добавлен «главный» метод реестра, все остальные методы используют его для получения подраздела для работы. – user1970395
Вы можете просто запустить службу Windows под учетной записью пользователя. –