在應用程序中編輯組策略

組策略編輯器是系統個性化的一個經常使用的方式。可是它沒有提供備份手段,致使咱們在換新機器或重裝系統的時候,須要從新手動配置,若是修改的策略比較多的時候是一件比較麻煩的事情。週末的時候研究了下如何本身寫程序實現組策略的編輯。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

相關文章
相關標籤/搜索