a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 163|回复: 1

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

[复制链接]
发表于 2012-8-3 00:11:48 | 显示全部楼层 |阅读模式
首先说说为什么要写这么一个处事。因为电脑要在公司域中使用,所以不成避免的会担任域中的组策略设置装备摆设。域中95% 的计较机是XP系统,部门组策略对于Windows 7 系统来说有些多余而且带来良多麻烦。   问题一、断根虚拟内存策略
" r) k! d# E/ w& }  l, C, s. L9 |  断根虚拟内存策略(Clear virtual memory pagefile)可以在必然水平上降低域入彀较机病毒的传布。但问题是如不美观启动这个策略也会降低Windows 关机速度(3~5分钟),对于关机速度奇快(13~16秒)的Windows 7 系统来说简直是一个繁重的冲击。7 z9 q: B3 q0 V  ]6 i: u
8 `) W% E4 f: M  O
  改削这个组策略只需将[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management] 中的ClearPageFileAtShutdown 设为0x00000000 即可。# `' w& w" }( H: t: D5 S" q

+ r9 F7 V. F  E2 r. s8 L6 X7 v  问题二、系统更新策略
* p1 b7 K, H' |0 g1 E  在域中经由过程组策略可以使计较机经由过程WSUS 进行补丁更新,虽然是针对XP 系统设置的,但它却完全破损了Windows 7 系统自己的更新机制,详情请参考《Windows Update Error: 80244019》。解决这个问题的法子只需将注册表中[HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindowsWindowsUpdate] 完全删除。
( `  O( y* V. s; I& d! t  解决体例( E! E" c" M! w, Z
  由此可看法决膳缦沔两个问题都可以经由过程改削注册表来实现,当然有人会说也可以经由过程改削域组策略来达到不在某一个域用户主机上应用组策略的效不美观,但这个体例仍是不建议使用。开初写了一个Reg 文件运行一下就将注册表更新了,但总这么做也很麻烦。所以就想到建树一个处事让它在后台运行并改削注册表内容。
! r0 g2 s9 ^( g  Windows Registry Editor Version 5.00. @; q/ h6 ~+ h6 u
  [-HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindowsWindowsUpdate]* ?7 D; `( g5 v2 K: N$ [+ Z" c
  [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management], e) b. ~& x) t( G
  "ClearPageFileAtShutdown"=dword:00000000     建树一个Windows Service 项目,新建RegValueSet 类,并写入以下代码内容。在类中ChangeKeyValue() 体例用于完成上述注册表改削操作。其中Registry.LocalMachine.DeleteSubKeyTree(updatePath); 将删除系统更新组策略信息,RegSetValueEx(hKey, keyName, 0, RegistryValueKind.DWord, keyVal, 4); 会将ClearPageFileAtShutdown 键值改削为0。
; Z& Y* D, N6 l8 I! u9 _+ ^* A
7 e4 `% m: G- r* w4 P  起头我考试考试经由过程RegNotifyChangeKeyValue 体例监测SYSTEMCurrentControlSetControlSession ManagerMemory Management 下的键值是否被域组策略改削,如不美观被改削了便会执行RegSetValueEx 体例,但这种体例在处事中似乎行欠亨(启动处事时它会一向处于监听状况)。经测试发现其实只需在开/关机时进行ChangeKeyValue() 操作即可,所以便将代码改为以下体例。
5 S8 T5 G# H0 b+ a+ C  using System;
# F1 \6 Z/ S2 ~  using System.Runtime.InteropServices;& D# W2 t; D( H$ f# v
  using Microsoft.Win32;
+ K8 P1 Y- o3 S; s/ b& Y) c  namespace RegMonitor  W: b, O5 W0 j  k  g- N4 j
  {
: D. y& \  z; t, q9 P% t( D; y  class RegValueSet' Z6 L7 l/ x2 c, {" ?/ y
  {" n8 L' U8 p$ l& O5 Z3 ]* [/ f
  private static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);+ I) o, y& I. s4 L
  private static UIntPtr hKey;
2 @" Q. X6 C  m% g! @  private const int keyRights = 0xF003F; //KEY_ALL_ACCESS (0xF003F)
, b9 p* F* p( I  private const UInt32 INFINITE = 0xFFFFFFFF;8 v) n: `6 t! w1 \
  private const UInt32 WAIT_FAILED = 0xFFFFFFFF;
) N) U  G& j  l4 }  o6 k  s: t  public static void ChangeKeyValue()
4 B) z8 A& `8 R/ M+ [2 |; @4 b. o; x  ?3 e" T/ y( B" {3 c2 E
  {
回复

使用道具 举报

 楼主| 发表于 2012-8-3 00:11:49 | 显示全部楼层

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

</p>  string clrPath = @"SYSTEMCurrentControlSetControlSession ManagerMemory Management";
" ^% q2 \- `6 J  string updatePath = @"SOFTWAREPoliciesMicrosoftWindowsWindowsUpdate";
. q& h1 W" V' ^/ z2 I- X  string keyName = "ClearPageFileAtShutdown";9 Y$ K+ O; q: H! e4 _+ u# ?" {% G" G
  //Delete Windows Update Settings( Z1 g# R; M4 H9 P5 O2 ~3 I; J
  int vOpen = RegOpenKeyEx(HKEY_LOCAL_MACHINE, updatePath, 0, keyRights, out hKey);( d8 B: O- g3 @- j) C% ^
  if (vOpen == 0)# T) {: G% q; h: |4 C% m
  {
* I7 [  d/ I7 X  Registry.LocalMachine.DeleteSubKeyTree(updatePath);
9 G& a' c, T* i, A  }5 K1 y; O: ~+ k0 ?2 T$ I& e
  //Change Clear Page File Value& |2 |3 }/ h! S8 U+ F* h$ d: K
  RegOpenKeyEx(HKEY_LOCAL_MACHINE, clrPath, 0, keyRights, out hKey);
: y2 V# w5 Q% {; a' \/ v# C: h  IntPtr hEvent = CreateEvent(IntPtr.Zero, true, false, null);" ~+ S0 w% ^2 V: D4 Q9 ?7 u% T
  RegNotifyChangeKeyValue(hKey, true, 4, hEvent, true);
6 c1 I7 |8 p7 y' Z2 C  while (WaitForSingleObject(hEvent, INFINITE) != WAIT_FAILED), h/ p- T, K" G2 v) u) D+ T. K0 @7 _. V
  {
' \: R& w% F) Y" [$ S3 g  RegistryKey key = Registry.LocalMachine.OpenSubKey(clrPath);. S' {3 k- V. X. g) j
  int val = (int)key.GetValue(keyName);
8 A( s$ ~! m: e0 w) P  if (val != 0)  r' H' m, j8 Q/ _; s
  {
( y, e; R& ~& h* L& L1 L5 j% l% D9 y  IntPtr keyVal = Marshal.AllocHGlobal(4);8 A! K  G# a* m, P' d: S4 g
  Marshal.WriteInt32(keyVal, 0, 0);) j9 J* i) z- ]; g0 S# U
  RegSetValueEx(hKey, keyName, 0, RegistryValueKind.DWord, keyVal, 4);; I. p# f( v) \4 t) M' q2 g
  key.Close();/ k7 _7 V3 A) N& @& ?$ Q
  }
; n4 f* ?" B, N; Q0 r# {  RegCloseKey(hKey);
1 @( B' J' B% c: Q  }4 h2 l) Z  }8 l8 k- U- P1 G% c1 j8 U
  }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-27 00:43 , Processed in 0.396188 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表