日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

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

發(fā)布時(shí)間:2023/12/31 windows 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自制Windows 7 注册表键值修改服务(Service) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

???? 首先說(shuō)說(shuō)為什么要寫這么一個(gè)服務(wù)。由于電腦要在公司域中使用,所以不可避免的會(huì)繼承域中的組策略配置。域中95% 的計(jì)算機(jī)是XP系統(tǒng),部分組策略對(duì)于Windows 7 系統(tǒng)來(lái)說(shuō)有些多余而且?guī)?lái)很多麻煩。

問(wèn)題一、清除虛擬內(nèi)存策略

???? 清除虛擬內(nèi)存策略(Clear virtual memory pagefile)可以在一定程度上降低域中計(jì)算機(jī)病毒的傳播。但問(wèn)題是如果啟動(dòng)這個(gè)策略也會(huì)降低Windows 關(guān)機(jī)速度(3~5分鐘),對(duì)于關(guān)機(jī)速度奇快(13~16秒)的Windows 7 系統(tǒng)來(lái)說(shuō)簡(jiǎn)直是一個(gè)沉重的打擊。

???? 修改這個(gè)組策略只需將[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management] 中的ClearPageFileAtShutdown 設(shè)為0x00000000 即可。

問(wèn)題二、系統(tǒng)更新策略

???? 在域中通過(guò)組策略可以使計(jì)算機(jī)通過(guò)WSUS 進(jìn)行補(bǔ)丁更新,雖然是針對(duì)XP 系統(tǒng)設(shè)置的,但它卻完全破壞了Windows 7 系統(tǒng)本身的更新機(jī)制,詳情請(qǐng)參考《Windows Update Error: 80244019》。解決這個(gè)問(wèn)題的辦法只需將注冊(cè)表中[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate] 完全刪除。

解決方法

???? 由此可見(jiàn)解決上面兩個(gè)問(wèn)題都可以通過(guò)修改注冊(cè)表來(lái)實(shí)現(xiàn),當(dāng)然有人會(huì)說(shuō)也可以通過(guò)修改域組策略來(lái)達(dá)到不在某一個(gè)域用戶主機(jī)上應(yīng)用組策略的效果,但這個(gè)方法還是不建議使用。起初寫了一個(gè)Reg 文件運(yùn)行一下就將注冊(cè)表更新了,但總這么做也很麻煩。所以就想到創(chuàng)建一個(gè)服務(wù)讓它在后臺(tái)運(yùn)行并修改注冊(cè)表內(nèi)容。

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

???? 創(chuàng)建一個(gè)Windows Service 項(xiàng)目,新建RegValueSet 類,并寫入以下代碼內(nèi)容。在類中ChangeKeyValue() 方法用于完成上述注冊(cè)表修改操作。其中Registry.LocalMachine.DeleteSubKeyTree(updatePath); 將刪除系統(tǒng)更新組策略信息,RegSetValueEx(hKey, keyName, 0, RegistryValueKind.DWord, keyVal, 4); 會(huì)將ClearPageFileAtShutdown 鍵值修改為0。

???? 開(kāi)始我嘗試通過(guò)RegNotifyChangeKeyValue 方法監(jiān)測(cè)SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management 下的鍵值是否被域組策略修改,如果被修改了便會(huì)執(zhí)行RegSetValueEx 方法,但這種方式在服務(wù)中似乎行不通(啟動(dòng)服務(wù)時(shí)它會(huì)一直處于監(jiān)聽(tīng)狀態(tài))。經(jīng)測(cè)試發(fā)現(xiàn)其實(shí)只需在開(kāi)/關(guān)機(jī)時(shí)進(jìn)行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 設(shè)為True,將Service 名稱設(shè)為RegistryMonitor。并在OnStart(服務(wù)啟動(dòng))、OnStop、OnShutdown(關(guān)機(jī)) 加入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();}} }

???? 編譯項(xiàng)目后安裝RegistryMonitor 服務(wù)(Installutil),并在Services.msc 中啟動(dòng)RegistryMonitor 服務(wù)。至此,就不用再擔(dān)心組策略的繼承問(wèn)題了。

相關(guān)參考

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

源程序下載

轉(zhuǎn)載于:https://www.cnblogs.com/gnielee/archive/2010/05/21/windows7-services-edit-registry.html

總結(jié)

以上是生活随笔為你收集整理的自制Windows 7 注册表键值修改服务(Service)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。