Мы пишем собственное приложение-службу 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)
{
}
}
}