使用 C++ 程序的新 GPO

New GPO using c++ program

我正在尝试使用 IGrouppolicyobject 接口

以编程方式创建 gpo

是 运行 子域中的程序并且能够在子域中成功创建 GPO。

要在父域中创建 GPO,我正在模拟(使用 LogonUser windows 函数)父域管理员凭据

(模拟成功,我在LogonUser方法中使用LOGON32_LOGON_NEW_CREDENTIALS模拟,甚至后续的ImpersonateLoggedOnUser方法也成功)

但是 gpo 创建调用(IGrouppolicyobject 的新方法)失败,访问被拒绝错误代码:80070005

请指导我。

这是代码..

HANDLE tokHandle = NULL;
BOOL chk = LogonUser("parent domain admin name", "parent domain name", "password", LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &tokHandle);
if(chk) {
    chk = ImpersonateLoggedOnUser(tokHandle);
    if(!chk)
    {
        //print error code in log
    }
    CloseHandle(tokHandle);
}
else
{
    //print error code in log
}
if(chk) {
    IGroupPolicyObject* gpo = NULL;
    HRESULT hr = CoCreateInstance(CLSID_GroupPolicyObject, NULL, CLSCTX_INPROC_SERVER, IID_IGroupPolicyObject, (LPVOID*)&gpo);
    if (hr==S_OK) {
        hr = gpo->New(L"LDAP://dcname/DC=domain,DC=com", L"gponame", GPO_OPEN_READ_ONLY);
        if(hr!=0) {
            print hr;   //ACCESS DENIED ERROR CODE COMES HERE...
        }
    } else {
        //print error code in log
    }
    if(gpo) gpo->Release();
    RevertToSelf();
}

终于找到答案了。

似乎 IGroupPolicyObject 新方法错误地恢复了在调用线程中完成的模拟。所以只有模拟没有发生。因此使用完成我的任务所需的凭据创建了一个新进程。

参考:https://shellexecute.wordpress.com/2008/11/18/igrouppolicyobjectnew-will-fail-if-thread-is-impersonating-or-identity-or-delegation/