首先说说为什么要写这么一个服务。由于电脑要在公司域中使用,所以不可避免的会继承域中的组策略配置。域中95% 的计算机是XP系统,部分组策略对于Windows 7 系统来说有些多余而且带来很多麻烦。

问题一、清除虚拟内存策略

清除虚拟内存策略(Clear virtual memory pagefile)可以在一定程度上降低域中计算机病毒的传播。但问题是如果启动这个策略也会降低Windows 关机速度(3~5分钟),对于关机速度奇快(13~16秒)的Windows 7 系统来说简直是一个沉重的打击。

修改这个组策略只需将[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management] 中的ClearPageFileAtShutdown 设为0x00000000 即可。

问题二、系统更新策略

在域中通过组策略可以使计算机通过WSUS 进行补丁更新,虽然是针对XP 系统设置的,但它却完全破坏了Windows 7 系统本身的更新机制,详情请参考《Windows Update Error: 80244019》。解决这个问题的办法只需将注册表中[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate] 完全删除。

解决方法

由此可见解决上面两个问题都可以通过修改注册表来实现,当然有人会说也可以通过修改域组策略来达到不在某一个域用户主机上应用组策略的效果,但这个方法还是不建议使用。起初写了一个Reg 文件运行一下就将注册表更新了,但总这么做也很麻烦。所以就想到创建一个服务让它在后台运行并修改注册表内容。

Windows Registry Editor Version 5.00[-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate][HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
"ClearPageFileAtShutdown"=dword:00000000

创建一个Windows Service 项目,新建RegValueSet 类,并写入以下代码内容。在类中ChangeKeyValue() 方法用于完成上述注册表修改操作。其中Registry.LocalMachine.DeleteSubKeyTree(updatePath); 将删除系统更新组策略信息,RegSetValueEx(hKey, keyName, 0, RegistryValueKind.DWord, keyVal, 4); 会将ClearPageFileAtShutdown 键值修改为0。

开始我尝试通过RegNotifyChangeKeyValue 方法监测SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management 下的键值是否被域组策略修改,如果被修改了便会执行RegSetValueEx 方法,但这种方式在服务中似乎行不通(启动服务时它会一直处于监听状态)。经测试发现其实只需在开/关机时进行ChangeKeyValue() 操作即可,所以便将代码改为以下方式。

using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;namespace RegMonitor
{class RegValueSet{private static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);private static UIntPtr hKey;private const int keyRights = 0xF003F; //KEY_ALL_ACCESS (0xF003F)private const UInt32 INFINITE = 0xFFFFFFFF;private const UInt32 WAIT_FAILED = 0xFFFFFFFF;public static void ChangeKeyValue(){string clrPath = @"SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management";string updatePath = @"SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate";string keyName = "ClearPageFileAtShutdown";//Delete Windows Update Settingsint vOpen = RegOpenKeyEx(HKEY_LOCAL_MACHINE, updatePath, 0, keyRights, out hKey);if (vOpen == 0){Registry.LocalMachine.DeleteSubKeyTree(updatePath);}//Change Clear Page File ValueRegOpenKeyEx(HKEY_LOCAL_MACHINE, clrPath, 0, keyRights, out hKey);IntPtr hEvent = CreateEvent(IntPtr.Zero, true, false, null);            RegNotifyChangeKeyValue(hKey, true, 4, hEvent, true);            while (WaitForSingleObject(hEvent, INFINITE) != WAIT_FAILED){RegistryKey key = Registry.LocalMachine.OpenSubKey(clrPath);int val = (int)key.GetValue(keyName);if (val != 0){IntPtr keyVal = Marshal.AllocHGlobal(4);Marshal.WriteInt32(keyVal, 0, 0);RegSetValueEx(hKey, keyName, 0, RegistryValueKind.DWord, keyVal, 4);key.Close();}RegCloseKey(hKey);}}[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]public static extern int RegOpenKeyEx(UIntPtr hKey,string subKey,int ulOptions,int samDesired,out UIntPtr hkResult);[DllImport("advapi32.dll", SetLastError = true)]public static extern int RegSetValueEx(UIntPtr hKey,[MarshalAs(UnmanagedType.LPStr)] string lpValueName,int Reserved,RegistryValueKind dwType,IntPtr lpData,int cbData);[DllImport("advapi32.dll", SetLastError = true)]public static extern int RegCloseKey(UIntPtr hKey);[DllImport("kernel32.dll")]public static extern IntPtr CreateEvent(IntPtr lpEventAttributes,bool bManualReset,bool bInitialState,string lpName);[DllImport("advapi32.dll", SetLastError = true)]public static extern int RegNotifyChangeKeyValue(UIntPtr hKey,bool watchSubtree,int dwNotifyFilter,IntPtr hEvent,bool fAsynchronous);[DllImport("kernel32.dll", SetLastError = true)]        static extern UInt32 WaitForSingleObject(            IntPtr hHandle,            UInt32 dwMilliseconds);    }
}

最后在Service 属性中将CanShutdown 和CanStop 设为True,将Service 名称设为RegistryMonitor。并在OnStart(服务启动)、OnStop、OnShutdown(关机) 加入ChangeKeyValue() 方法就可以了,如下代码所示。

using System.ServiceProcess;namespace RegMonitor
{public partial class Service1 : ServiceBase{public Service1(){InitializeComponent();}protected override void OnStart(string[] args){RegValueSet.ChangeKeyValue();}protected override void OnShutdown(){RegValueSet.ChangeKeyValue();}protected override void OnStop(){RegValueSet.ChangeKeyValue();}}
}

编译项目后安装RegistryMonitor 服务(Installutil),并在Services.msc 中启动RegistryMonitor 服务。至此,就不用再担心组策略的继承问题了。

相关参考

1. RegOpenKeyEx Function
http://msdn.microsoft.com/en-us/library/ms724897(VS.85).aspx

2. RegSetValueEx Function
http://msdn.microsoft.com/en-us/library/ms724923(VS.85).aspx

3. RegistryKey Methods
http://msdn.microsoft.com/en-US/library/microsoft.win32.registrykey_methods(v=VS.80).aspx

源程序下载

转载于:https://www.cnblogs.com/gnielee/archive/2010/05/21/windows7-services-edit-registry.html

自制Windows 7 注册表键值修改服务(Service)相关推荐

  1. 求助:Windows Service 读取注册表键值

    最近项目需要程序监控记录用户使用和打开的文件,于是做了一个使用Windows Service监控Recent文件夹中文件增加和更改的程序, 但是需要在服务程序确定Recent文件夹的路径,使用Regi ...

  2. 控制Open With菜单项的注册表键值

    当右键单击一个文件的时候, 你会发现有一个菜单项叫做Open With. 为了说明问题, 我们在这里使用.xyz文件类型, xyzfile作为.xyz文件的ProgID. 某种文件的Open With ...

  3. VC删除注册表键值项

    2019独角兽企业重金招聘Python工程师标准>>> VC删除注册表键值项. HKEY hkResult; HKEY hKey=NULL; TCHAR lpFilename[MAX ...

  4. Inno setup 访问注册表键值,获取软件安装路径

    ; 脚本由 Inno Setup 脚本向导 生成! ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! [Setup] ; 注: AppId的值为单独标识该应用程序. ; 不要为其 ...

  5. 注册表键值明明存在OpenSubKey始终返回null,解决方案

    注册表键值明明存在OpenSubKey始终返回null,解决方案 参考文章: (1)注册表键值明明存在OpenSubKey始终返回null,解决方案 (2)https://www.cnblogs.co ...

  6. windows黑客编程系列(四):修改注册表键值对之自启动

    文章目录 自启动技术 注册表 WINAPI介绍 RegOpenKeyEx函数 参数说明 返回值 RegSetValueEx 参数说明 返回值 编码 运行效果 自启动技术 对于一个病毒木马来说,重要的不 ...

  7. bat添加修改注册表键值 批处理修改注册表项

    1. 创建REG文件 REG文件的创建过程非常简单,可以通过任何一个文本文件编辑工具来实现.创建前记得先去掉"文件夹选项"中的"隐藏已知文件类型的扩展名"子项, ...

  8. 注册表键值的导出与导入

    其实就是用了Delphi的TRegistry类中两个函数,一个是SaveKey,一个是LoadKey.这两个函数在使用之前要取得SE_BAKCUP_NAME权限,而就是因为LookupPrivileg ...

  9. Explorer注册表键值归纳

    WinCE的Explorer的各种相关设置都保存在注册表中,以方便下次启动时恢复之前的各种设置.只是WinCE的Explorer的在WinCe设置的地方比较分散,不好查找,所以本文将这些有用的键值总结 ...

最新文章

  1. 【luogu3398】 仓鼠找sugar [LCA 倍增]
  2. 腾讯会议用户突破1亿,发布企业版最高支持2000人同时参会
  3. html单选框背景图片,如何更改radio、checkbox选项框背景图?
  4. k8s中几种port介绍
  5. 项目乱码 GBK转UTF-8工具
  6. 创建XNA Shooter游戏——挑战:用引擎编写自己的游戏
  7. 基站定位php,SIM800C支持基站定位功能了。。。
  8. cxGrid 在 GridMode = True 模式下实现标题点击排序以及标题列过滤筛选!!!
  9. 当今 计算机已进入千家万户英语,学生英语教学论文,关于信息技术在大学英语教学中的应用探析相关参考文献资料-免费论文范文...
  10. Docker 以 docker 方式运行 jenkins
  11. 用python进行GUI开发的选择
  12. chromium中的性能优化工具syzyProf
  13. linux tomcat catalina.out 乱码,Tomcat输出日志乱码解决
  14. 技校学计算机和本科计算机,中专计算机专业学什么,中专和技校的区别​
  15. android singleTask使用情况,场景分析
  16. EASY CHM使用
  17. VOCs有机废气处理方法-吸附树脂
  18. 怎样获取Atlantic免费一年的VPS主机
  19. jquery - 公历转农历方法
  20. uniapp 微信小程序配置全局主题色、实现动态修改主题色

热门文章

  1. AES_ENCRYPT() 和 AES_DECRYPT()
  2. XMLHttpRequest、fetch的ajax请求
  3. python构建bp神经网络_鸢尾花分类(一个隐藏层)__1.数据集
  4. Thinkpad F2不能进行重命名的问题
  5. mysql安装后无法启动和连接问题
  6. apache poi合并单元格设置边框
  7. CentOS系统下docker的安装与卸载
  8. 360度旋转图片小特效
  9. (七)React使用
  10. x390更换开机_ThinkPad X390怎么装win10系统|ThinkPad X390用u盘重装win10系统教程-系统城...