C# Windows 服务需要更改注册表

问题描述 投票:0回答:6

我有一项服务需要每 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");

有什么想法吗?

编辑:

感谢您的回复。我不知道为什么“CurrentUser”逃过了我的注意。感谢您指出这一点。

我的问题仍然是,组策略正在针对 CurrentUser 进行推动。现在我正在考虑创建一个在启动时加载并保持活动状态的应用程序。欢迎任何其他建议。

编辑:

至于Will的评论,我无法在win32 API中找到

UpdatePerUserSystemParameters
函数签名。这是否意味着可以不带参数调用它?

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool UpdatePerUserSystemParameters();
c# windows-services registry
6个回答
5
投票

参见此页

在 LocalSystem 帐户上下文中运行的服务继承 SCM 的安全上下文...这有几个含义:

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


3
投票

您期望

Currentuser
在服务中包含什么(谁)?


2
投票

注册表总是很有趣,但这是否意味着您正在编辑“本地系统”用户的user注册表设置?因此,除非您的实际用户以“本地系统”身份登录(我严重怀疑),否则他们不会看到任何内容......

我怀疑您需要编辑计算机范围的设置,或活动用户。


2
投票

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

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


2
投票

如果它在服务之外工作,则可能是权限问题。当您尝试使用 key.SetValue() 时是否遇到异常?该服务是否在具有注册表写入权限的帐户下运行?


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.