通过程序实现组策略的备份

Posted tianfang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过程序实现组策略的备份相关的知识,希望对你有一定的参考价值。

组策略编辑器是系统个性化的一个常用的方式。但是它没有提供备份手段,导致我们在换新机器或重装系统的时候,需要重新手动配置,如果修改的策略比较多的时候是一件比较麻烦的事情。

组策略本身的数据还是存储在注册表中,理论上我们只需要获取组策略编辑器对注册表的修改,然后通过程序实现同样的注册表修改行为,即可实现组策略的备份。周末的时候按照这个思路研究了下如何自己写程序实现组策略的编辑。

监控组策略的行为

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

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

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

[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionGroup?Policy?Objects{48914450-7595-411C-AFD3-AE2A07C8500C}UserSoftwarePoliciesMicrosoftPreviousVersions]
"DisableLocalPage"=dword:00000001
"DisableRemotePage"=dword:00000001
"HideBackupEntries"=dword:00000001

组策略相关API

监控到了组策略的行为后,第一反应是通过注册表API实现同样的操作,从而实现组策略的备份。但是实际使用中会发现,直接构造这样的注册表键值是不行的,原因在于它的路径是一个动态的。

[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionGroup Policy Objects{48914450-7595-411C-AFD3-AE2A07C8500C}UserSoftwarePoliciesMicrosoftPreviousVersions]

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

要打开这个动态注册表键值,需要用到IGroupPolicyObject相关的Windows API,网上也有相关的示例:http://delphi.longzu.net/viewthread.php?tid=49579&extra=page%3D2,也有不少c#版的封装。

我这里取得是GitHub的一个开源项目priv10的封装,它里面的工程LocalPolicy就是对相关接口的封装

代码示例

一个简单的示例如下:

var?po??=?new?ComputerGroupPolicyObject();
var?key?=?po.GetRootRegistryKey(GroupPolicySection.User)
????????????.OpenSubKey(@"SoftwarePoliciesMicrosoftPreviousVersions");
key.SetValue("DisableRemotePage",?0);
po.Save();

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

另外,需要注意的是,组策略相关的API是要求在STA线程下才能使用的,如果我们的主程序是MTA的,可以新建一个STA的线程,在STA线程中执行相关API:

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

以上是关于通过程序实现组策略的备份的主要内容,如果未能解决你的问题,请参考以下文章

MSSQL · 最佳实践 · 利用文件组实现冷热数据隔离备份方案

AD付费内容域组策略每日计划任务备份

MSSQL · 最佳实践 · 利用文件组实现冷热数据隔离备份方案

Xcode 4.6 的备份代码片段

利用组策略分发软件

管理员操作组策略对象时常见错误!