Windows 10のグループポリシーをプログラムで書き換えてみた

レジストリとGPOの関係について教えてください。

2 レジストリの値を変更した場合設定内容が反映されるタイミングはいつでしょうか?

レジストリを編集して再起動しただけで、グループポリシーで上書きされることはないはずです(グループポリシーを変更しないかぎり)。

確か、Windows Server 2003/XP まではレジストリを変更するとローカルポリシー、グループポリシーも反映されていたはずですが、どういう事でしょうか(・ω・) ?

プログラムやスクリプトでグループポリシーを書き換えることは難しい?
というわけで調べてみた
GitHub - sjitech/powershell-local-group-policy-reg: Load group policy's registry hive to a temporary registry key path, then you can edit it by normal external command.
Power Shell でできるらしい。
ということはプログラムでもできるはずだ。

Pete's Blog: Programatically setting and applying Local Group Policies on Windows

DWORD val, val_size=sizeof(DWORD);
HRESULT hr;
IGroupPolicyObject* pLGPO;
HKEY machine_key, dsrkey;
// MSVC is finicky about these ones => redefine them
const IID my_IID_IGroupPolicyObject =
{ 0xea502723, 0xa23d, 0x11d1, {0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3} };
const IID my_CLSID_GroupPolicyObject =
{ 0xea502722, 0xa23d, 0x11d1, {0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3} };
GUID ext_guid = REGISTRY_EXTENSION_GUID;
// This next one can be any GUID you want
GUID snap_guid = { 0x3d271cfc, 0x2bc6, 0x4ac2, {0xb6, 0x33, 0x3b, 0xdf, 0xf5, 0xbd, 0xab, 0x2a} };

// Create an instance of the IGroupPolicyObject class
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
CoCreateInstance(&my_CLSID_GroupPolicyObject, NULL, CLSCTX_INPROC_SERVER,
&my_IID_IGroupPolicyObject, (LPVOID*)&pLGPO);

// We need the machine LGPO (if C++, no need to go through the lpVtbl table)
pLGPO->lpVtbl->OpenLocalMachineGPO(pLGPO, GPO_OPEN_LOAD_REGISTRY);
pLGPO->lpVtbl->GetRegistryKey(pLGPO, GPO_SECTION_MACHINE, &machine_key);

// The disable System Restore is a DWORD value of Policies\Microsoft\Windows\DeviceInstall\Settings
RegCreateKeyEx(machine_key, "Software\\Policies\\Microsoft\\Windows\\DeviceInstall\\Settings",
0, NULL, 0, KEY_SET_VALUE | KEY_QUERY_VALUE, NULL, &dsrkey, NULL);

調べてみると IGroupPolicyObject という COM OBJECTを介して アクセスするとポリシーを書き換えることができるようだ。

HRESULT hr = 0;
HKEY key = NULL;
DWORD disp = 0 , err = 0;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
hr=CoCreateInstance(CLSID_GroupPolicyObject, NULL, CLSCTX_INPROC_SERVER, IID_IGroupPolicyObject, (LPVOID*)&lgp);
if (SUCCEEDED(hr))
{
 hr = lgp->OpenLocalMachineGPO(GPO_OPEN_LOAD_REGISTRY);
 if (SUCCEEDED(lgp->GetRegistryKey(GPO_SECTION_MACHINE, &key)))
 {
 hr = RegCreateKeyExA(key, REG_PATH_POLICIES, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_QUERY_VALUE, NULL, &pol, &disp);
 hr = RegSetValueExA(pol, fname, 0, REG_DWORD,
(LPBYTE)&val,
sizeof(DWORD));
 }
 GUID ext = REGISTRY_EXTENSION_GUID;
 RegCloseKey(pol);
 hr = lgp->Save(TRUE, TRUE, &ext, const_cast

ここを参考に簡略化してみた。
プログラムを呼び出した後 GPEDIT.MSCでポリシー設定を開いてみたら書き換わってることが確認できた。
ちなみにGetRegistryKey で開いた値を変数に保存しておいて、その都度書き換えようと思ったらうまくいかなかったので、書き換えが必要な時に呼び出してまとめて書き換える方がよいみたいだ。

Windowsグループポリシーの嘘:Powershellで操作できるって - Qiita

アプリ配信のポリシーの中身は外部XMLに保存されているし、その中にはさらにバイナリ設定データが入っていますので、Powershellのグループポリシーモジュールは、これらの設定には全然無力です、これらの設定を変更するには、グループポリシーエディターが利用している該当グループポリシー拡張COM DLL(typelibなし)を無理やり利用するしか方法ない。

やってることはまさにこれですね・ω・

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です