registry项不可用于从服务运行的应用程序

我们正在写一个自定义的Windows服务应用程序。 该服务设置为允许与桌面进行交互,服务应用程序需要执行另一个“正常”应用程序。 该服务设置为启动并运行一个正常的Windows用户帐户,而不是系统帐户。

我们遇到的问题是,当服务调用另一个正常的应用程序时,看起来registry没有被加载,因为当服务正在运行的用户帐户login到Windows时,它就是这样。 特别是应用程序抛出一个错误,某些registry项不可用。

为什么运行该服务的帐户没有收到相同用户帐户在login到同一个Windows系统时收到的完整registry? 可以做任何事情来改变这种情况吗?

服务帐户不会加载用户configuration文件,因此无法访问HKCUregistryconfiguration单元。 这些服务的设置应保存在HKLM中,根据需要在键上放置相应的安全设置。 但是,如果configuration文件在系统上全部加载,则应该存在于香港大学的某个地方,如果你正在挖掘它的话。

我想这里还有其他的事情发生。

用户是否与服务同时login? 如果是这样,registryconfiguration单元可以被locking。 Windows事件日志中是否有消息?

我认为该应用程序应该能够访问HKEY_CURRENT_USERregistry的原因是因为我testing了这一点,并创build了一个示例C#Windows服务(如果感兴趣,下面的代码)。

应用程序devise作为服务运行,但不应将其信息存储在HKCU注册configuration单元中。 HKLM是系统范围应用程序设置的正确位置。

执行testing

我在Windows 7下创build了一个具有pipe理访问权限的新用户帐户。然后,我将其授予“作为服务login”权限,安装并启动服务。

我的发现是:*当我运行服务时,HKCU被加载并且能够被写入。 *当蜂巢已经加载,我得到了这个消息在事件日志和真正的蜂巢没有更新。 而是创build了一个临时的蜂巢。

Windows无法加载registry。 这个问题通常是由于内存不足或安全权限不足造成的。

详细信息 – 进程无法访问文件,因为正在被另一个进程使用。 对于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表明即使是默认系统帐户也有一个registryconfiguration单元被加载到HKCU,虽然它可能是共享的。

代码testing服务

 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) { } } }