在应用程序中编辑组策略

组策略编辑器是系统个性化的一个经常使用的方式。可是它没有提供备份手段,致使咱们在换新机器或重装系统的时候,须要从新手动配置,若是修改的策略比较多的时候是一件比较麻烦的事情。周末的时候研究了下如何本身写程序实现组策略的编辑。php

组策略的启动方式是"gpedit.msc",但他实际上的进程是mmc.exe,咱们能够经过ProcessMonotor监控其对注册表的修改方法,具体能够参考这篇文章:git

如何查看组策略对象修改的注册表设置github

后来发现了一个更加小巧好用的程序:RegFromApp,它能够更方便快速mmc.exe对注册表的修改。一个基本的示例以下。c#

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\{48914450-7595-411C-AFD3-AE2A07C8500C}User\Software\Policies\Microsoft\PreviousVersions]
"DisableRemotePage"=dword:00000001

 然而,实际使用中发现,直接构造这样的注册表键值是不行的,缘由在于它的路径是动态的。windows

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\{48914450-7595-411C-AFD3-AE2A07C8500C}User\Software\Policies\Microsoft\PreviousVersions]api

其中标红的部分是动态的,每次组策略编辑的时候是不同的。网上也有帖子讨论这一问题:https://bbs.csdn.net/topics/70402935app

 

要打开这个动态注册表键值,须要用到IGroupPolicyObject相关的Windows API,网上也有相关的示例:http://delphi.longzu.net/viewthread.php?tid=49579&extra=page%3D2.编辑器

也有很多c#版的封装。我这里取得是GitHub的一个开源项目priv10的封装,它里面的工程LocalPolicy就是对组策略接口的封装,一个简单的示例以下:spa

var po  = new ComputerGroupPolicyObject();
var key = po.GetRootRegistryKey(GroupPolicySection.User)
            .OpenSubKey(@"Software\Policies\Microsoft\PreviousVersions");
key.SetValue("DisableRemotePage", 0);|
po.Save();

上面的例子演示了如何打开这个动态的注册表,而后就是普通的注册表操做了。操做完成后,须要调用Save写入策略。.net

另外,须要注意的是,组策略相关的API是要求在STA线程下才能使用的,若是咱们的主程序是MTA的,能够新建一个STA的线程,在STA线程中执行相关API:

Thread thread = new Thread(EditPolicy);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

完整关代码示例能够参看:https://gitee.com/tianfang/GroupPolicyEditor

相关文章
相关标签/搜索