Я пытаюсь создать gpo программно используя IGrouppolicyobject интерфейс
Запускаю программу в дочернем домене и могу успешно создать объект групповой политики в дочернем домене.
Чтобы создать объект групповой политики в родительском домене, я имитирую (с помощью функции Windows LogonUser) учетные данные родительского администратора домена
(олицетворение является успешным, и я использую LOGON32_LOGON_NEW_CREDENTIALS в методе LogonUser для олицетворения и даже последующего успеха метода ImpersonateLoggedOnUser)
Но вызов создания gpo (метод IGrouppolicyobject’s New) завершается неудачно с кодом отказа в доступе: 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
Новый метод ошибочно возвращает олицетворение, выполненное в вызывающем потоке. Так что только подражание не происходит. Поэтому создал новый процесс с необходимыми учетными данными для выполнения моей задачи.
Других решений пока нет …