如何以编程方式修改本地组策略设置

时间:2010-06-29 01:13:59

标签: group-policy

我正在寻找一种以编程方式更改组策略设置值的方法,而无需重新启动计算机或在其上安装任何其他组件

寻找适用于Windows 2003,2008的解决方案,计算机是域

的一部分

该值位于Administrative Templates \ Network \ QoS Packet Scheduler,Limit outstanding packets

尝试以下方法:

  • 直接更改注册表 - 这不起作用,因为该值实际存储在registry.pol文件中并从那里传播到注册表

  • 使用的WMI - 表示注册表的WMI对象是只读的,值未被修改

似乎有效的一个选项是修改C:\ Windows \ System32 \ GroupPolicy \ Machine下的registry.pol文件,但这似乎有问题,我将不得不手动解析此文件。

3 个答案:

答案 0 :(得分:5)

我写了一个.NET库来帮助解决这个问题。你可以阅读它here。它是开源的,您可以获得代码和二进制文件here。一旦知道了相关的注册表值,就可以使用此库对它们进行必要的更改,并将它们保存到registry.pol文件中。

答案 1 :(得分:0)

使用组策略对象(CLSID_GroupPolicyObject),示例here

答案 2 :(得分:0)

使用此链接 :)

http://blogs.technet.com/b/fdcc/archive/2010/01/15/updated-lgpo-utility-sources.aspx

您可以使用此项目在本地系统上修改GPO。 不要改变Direct Registry !!!!

HRESULT hr;
IGroupPolicyObject* pLGPO;
HKEY machine_key, dsrkey;

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)
hr = pLGPO->OpenLocalMachineGPO( GPO_OPEN_LOAD_REGISTRY);
hr = pLGPO->GetRegistryKey( GPO_SECTION_MACHINE, &machine_key);
//hr = pLGPO->GetRegistryKey(GPO_SECTION_USER, &machine_key);

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

// Create the value
LSTATUS ds = RegSetKeyValue(dsrkey, NULL, KeyValue, REG_DWORD, &KeyData, sizeof(KeyData));
RegCloseKey(dsrkey);

// Apply policy and free resources
//pLGPO->Save( TRUE, TRUE, &ext_guid, &snap_guid);
GUID RegistryId = REGISTRY_EXTENSION_GUID;
GUID ThisAdminToolGuid =
    /*{ CLSID_PolicySnapinUser/* */
{
    0x0F6B957E,
    0x509E,
    0x11D1,
    { 0xA7, 0xCC, 0x00, 0x00, 0xF8, 0x75, 0x71, 0xE3 }
};

LSTATUS rStatus = RegCloseKey(machine_key);
//
// Write the GPO back to the directory
//
hr = pLGPO->Save(
    FALSE,
    TRUE,
    &RegistryId,
    &ThisAdminToolGuid);

RegCloseKey(machine_key);
pLGPO->Release();