• 在应用程序中编辑组策略


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

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

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

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

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

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

    [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();

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

  • 相关阅读:
    Express中间件简介
    Express中间件概念
    浏览器cookie插件
    node=day7
    cookie可视化操作工具---EditThisCookie
    node之cookie和session对比
    node通过session保存登录状态
    浅谈表单同步提交和异步提交
    node.js服务端存储用户密码md5加密
    jQuery的ajax里dataType预期服务器返回数据类型
  • 原文地址:https://www.cnblogs.com/TianFang/p/10990888.html
Copyright © 2020-2023  润新知