【问题标题】:New GPO using c++ program使用 c++ 程序的新 GPO
【发布时间】:2017-06-07 13:27:27
【问题描述】:

我正在尝试使用 IGrouppolicyobject 接口以编程方式创建 gpo

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

要在父域中创建 GPO,我将模拟(使用 LogonUser windows 功能)父域管理员凭据

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

但是 gpo 创建调用(IGrouppolicyobject 的 New 方法)失败,并出现 Access Denied 错误代码: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();
}

【问题讨论】:

  • 你的代码在哪里?见How to Ask
  • 更新了有问题的代码
  • 谢谢,我根据我在代码中很快注意到的内容发布了一个答案。有时会看到某些变量未更新,不确定您是否是这种情况,但如果是,这将是一个简单的修复,只需与您的 Active Directory 管理员确认即可。
  • 嗨,Heron,我希望这个问题与变量更新无关。代码正在努力在子域中创建 gpo。

标签: c++ impersonation group-policy gpo


【解决方案1】:

终于找到答案了。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多