会计考友 发表于 2012-8-3 00:11:48

微软技巧:自制Windows7注册表键值修改服务

首先说说为什么要写这么一个处事。因为电脑要在公司域中使用,所以不成避免的会担任域中的组策略设置装备摆设。域中95% 的计较机是XP系统,部门组策略对于Windows 7 系统来说有些多余而且带来良多麻烦。   问题一、断根虚拟内存策略
  断根虚拟内存策略(Clear virtual memory pagefile)可以在必然水平上降低域入彀较机病毒的传布。但问题是如不美观启动这个策略也会降低Windows 关机速度(3~5分钟),对于关机速度奇快(13~16秒)的Windows 7 系统来说简直是一个繁重的冲击。

  改削这个组策略只需将 中的ClearPageFileAtShutdown 设为0x00000000 即可。

  问题二、系统更新策略
  在域中经由过程组策略可以使计较机经由过程WSUS 进行补丁更新,虽然是针对XP 系统设置的,但它却完全破损了Windows 7 系统自己的更新机制,详情请参考《Windows Update Error: 80244019》。解决这个问题的法子只需将注册表中 完全删除。
  解决体例
  由此可看法决膳缦沔两个问题都可以经由过程改削注册表来实现,当然有人会说也可以经由过程改削域组策略来达到不在某一个域用户主机上应用组策略的效不美观,但这个体例仍是不建议使用。开初写了一个Reg 文件运行一下就将注册表更新了,但总这么做也很麻烦。所以就想到建树一个处事让它在后台运行并改削注册表内容。
  Windows Registry Editor Version 5.00
  [-HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindowsWindowsUpdate]
  
  "ClearPageFileAtShutdown"=dword:00000000   建树一个Windows Service 项目,新建RegValueSet 类,并写入以下代码内容。在类中ChangeKeyValue() 体例用于完成上述注册表改削操作。其中Registry.LocalMachine.DeleteSubKeyTree(updatePath); 将删除系统更新组策略信息,RegSetValueEx(hKey, keyName, 0, RegistryValueKind.DWord, keyVal, 4); 会将ClearPageFileAtShutdown 键值改削为0。

  起头我考试考试经由过程RegNotifyChangeKeyValue 体例监测SYSTEMCurrentControlSetControlSession ManagerMemory 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()

  {

会计考友 发表于 2012-8-3 00:11:49

微软技巧:自制Windows7注册表键值修改服务

</p>  string clrPath = @"SYSTEMCurrentControlSetControlSession ManagerMemory Management";
  string updatePath = @"SOFTWAREPoliciesMicrosoftWindowsWindowsUpdate";
  string keyName = "ClearPageFileAtShutdown";
  //Delete Windows Update Settings
  int vOpen = RegOpenKeyEx(HKEY_LOCAL_MACHINE, updatePath, 0, keyRights, out hKey);
  if (vOpen == 0)
  {
  Registry.LocalMachine.DeleteSubKeyTree(updatePath);
  }
  //Change Clear Page File Value
  RegOpenKeyEx(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);
  }
  }
页: [1]
查看完整版本: 微软技巧:自制Windows7注册表键值修改服务