2009-10-27 50 views
3

我有一个服务需要每隔5分钟更新注册表(抵消gpo)。代码在常规应用程序中运行良好,但是当我将它放入Windows服务中时,它不会进行更改。我使用的是本地系统帐户的服务,它不抛出任何异常C#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"); 

什么想法?

编辑:

感谢您的答复。我不知道为什么“当前用户”逃脱了我的注意。感谢您指出了这一点。

我的问题仍然是,组策略被推向当前用户。现在我正在考虑创建一个在启动时加载并保持活动状态的应用程序。任何其他建议将受到欢迎。

编辑:

至于威尔的评论,我无法找到在Win32 API中的UpdatePerUserSystemParameters函数签名。这是否意味着它可以在没有参数的情况下被调用?

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

回答

5

this page

一在本地系统帐户的上下文中运行的服务继承t他有SCM的安全上下文......这有几点含义:

注册表项HKEY_CURRENT_USER与默认用户关联,而不是当前用户。要访问其他用户的配置文件,请模拟该用户,然后访问HKEY_CURRENT_USER。

2

注册表总是充满乐趣,但并不意味着你正在编辑的“本地系统”用户的用户注册表设置?所以除非你的用户以“本地系统”身份登录(我严重怀疑),他们不会看到任何东西......

我怀疑你需要编辑机器范围的设置,或者活动用户。

1

尝试将注册表操作代码放入try-catch块中;服务在辅助线程中运行,这会发生异常

3

你认为Currentuser是什么(谁)在服务中?

2

在另一个实际登录帐户下运行您的服务。

本地系统帐户不是用户,因此没有Registry.CurrentUser键(没有登录=没有当前用户=没有当前用户的关键。

+0

实际上,本地系统/本地服务/网络服务帐户得到了他们的HKCU条目。只需检查HK_USERS即可。 –

2

如果它工作在服务之外,它可能?是一个权限问题你得到一个异常,当您尝试使用key.SetValue()是具有写访问注册表的帐户下运行的服务