IDirectoryObject :: SetObjectAttributes не возвращает ошибок, но атрибуты не обновляются - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь обновить атрибут пользователя в Active Directory. Я вошел в систему как администратор домена и локально выполнил следующий код:

LPCWSTR pwszADsPath = L"LDAP://CN=MyUserName,CN=Users,DC=XXX,DC=YYY,DC=com";

// Bind to the root of the current domain.
hr = ADsOpenObject(pwszADsPath,
    NULL,
    NULL,
    ADS_SECURE_AUTHENTICATION,
    IID_IDirectorySearch,
    (void**)&pDirObject);    

// Bind to the object
if (SUCCEEDED(hr))
{
    DWORD dwReturn = 0;
    ADSVALUE givenName;
    ADSVALUE phoneValue[2];

    ADS_ATTR_INFO  attrInfo[] = {   
        {L"givenName",      ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, &givenName, 1},
        {L"otherTelephone", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, phoneValue, 2}
    };

    givenName.dwType           = ADSTYPE_CASE_IGNORE_STRING;
    givenName.CaseIgnoreString = L"Janet";

    phoneValue[0].dwType = ADSTYPE_CASE_IGNORE_STRING;
    phoneValue[0].CaseIgnoreString = L"425 844 1234";

    phoneValue[1].dwType = ADSTYPE_CASE_IGNORE_STRING;
    phoneValue[1].CaseIgnoreString = L"425 924 4321"; 

    hr = pDirObject->SetObjectAttributes(attrInfo, sizeof(attrInfo) / sizeof(ADS_ATTR_INFO), &dwReturn);
    if (SUCCEEDED(hr))
    {
        wprintf(L"%d Attributes updated\n", dwReturn);
    }
    else
    {
        wprintf(L"SetObjectAttributes failed. hr=0x%x\n", hr);
    }

    pDirObject->Release();
}

Когда я запускаю программу, я всегда получаю 0 Attributes updated. И я подтверждаю в AD Users And Computers, данное имя не обновляется.

pwszADsPath правильно скопировано из редактирования ADSI, и у меня есть права на запись, что я пропустил?

1 Ответ

0 голосов
/ 03 октября 2019

ОК, поэтому я попытался скомпилировать часть вашего кода и получил следующее ошибка (MSVC, в Visual Studio 2019):

ADS_ATTR_INFO  attrInfo[] = {
    {L"givenName",      ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, &givenName, 1},
};
     ^^^ error C2440: 'initializing': cannot convert from 'const wchar_t [15]' to 'LPWSTR'

Возможно, ваша версия компилятора отличается,и разрешает это неявное преобразование, но, похоже, это расстраивает последующий вызов.

Попробуйте вместо этого:

wchar_t gnString[32] = L"givenName";
ADS_ATTR_INFO  attrInfo[] = {
    {gnString, ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, &givenName, 1},
};

Вероятно, у вас будут аналогичные проблемы при инициализацииADSVALUE структура (ы)!

Изменение:

givenName.dwType           = ADSTYPE_CASE_IGNORE_STRING;
givenName.CaseIgnoreString = L"Janet";

К:

wchar_t forename[16]       = L"Janet";
givenName.dwType           = ADSTYPE_CASE_IGNORE_STRING;
givenName.CaseIgnoreString = foreName;
...