Ändern von Attributen mit der IDirectoryObject-Schnittstelle

Zusätzlich zu IADs::P ut und IADs::P utExkönnen Sie die IDirectoryObject::SetObjectAttributes-Methode verwenden, um Attributwerte zu ändern. Um diese Methode zu verwenden, müssen Sie eine ADS _ ATTR _ INFO-Struktur für jedes zu ändernde Attribut ausfüllen.

Mit der IDirectoryObject::SetObjectAttributes-Methode können Sie sowohl einwertige als auch mehrwertige Attribute ändern. Diese Funktion stellt ähnliche betriebsbereite Steuerelemente wie Clear, Append, Delete und Update für diejenigen bereit, die in der IADs::P utEx-Methode gefunden werden. Zu den Steuerelementkonstanten gehören:

Die Angabe von ADS _ ATTR _ UPDATE löst einen serverseitigen Vorgang aus, der ressourcenintensiv sein kann. Ein Beispiel wäre das Initiieren des Vorgangs zum Aktualisieren einer langen Liste von Gruppenmitgliedschaften. Im Allgemeinen sollten Sie diesen Vorgang nicht verwenden, es sei denn, die Änderung umfasst eine kleine Anzahl von Attributen im Verzeichnis. Um eine lange Liste von Gruppenmitgliedschaften zu ändern, besteht der effizientere Ansatz darin, die Liste aus dem zugrunde liegenden Verzeichnis zu lesen, Änderungen vorzunehmen und die aktualisierte Liste wieder im Verzeichnis zu speichern.

Hinweis

Wie IADs::P ut und IADs::P utEx mit IADs::SetInfowerden die Attributänderungen in Active Directory entweder vollständig ausgeführt oder verworfen. Wenn eine oder mehrere der Änderungen nicht zulässig sind und daher nicht ausgeführt werden können, wird für keine der an den Attributen vorgenommenen gemeinsamen Änderungen ein Commit für das Verzeichnis ausgeführt.

Beispiel

Das folgende Codebeispiel zeigt, wie Sie sowohl einzelne als auch mehrwertige Attribute mit der IDirectoryObject::SetObjectAttributes-Methode ändern.

HRESULT hr;
LPCWSTR pwszADsPath = L"LDAP://CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=com";
IDirectoryObject *pDirObject = NULL;

// Bind to the object.
hr = ADsGetObject(pwszADsPath, IID_IDirectoryObject, (void**)&pDirObject);
if(SUCCEEDED(hr))
{ 
    ADSVALUE adsvFaxNumber;
    ADSVALUE rgadsvOtherTelephones[2];
     
    // Set the new FAX number.
    adsvFaxNumber.dwType = ADSTYPE_CASE_IGNORE_STRING; 
    adsvFaxNumber.CaseIgnoreString = L"425-707-9790";

    // Set the first telephone number.
    rgadsvOtherTelephones[0].dwType = ADSTYPE_CASE_IGNORE_STRING;
    rgadsvOtherTelephones[0].CaseIgnoreString = L"425-707-9791";

    // Set the second telephone number.
    rgadsvOtherTelephones[1].dwType = ADSTYPE_CASE_IGNORE_STRING;
    rgadsvOtherTelephones[1].CaseIgnoreString = L"425-707-9792";

    ADS_ATTR_INFO attrInfo[2];

    // Setup the facsimileTelephoneNumber attribute data.
    attrInfo[0].pszAttrName = L"facsimileTelephoneNumber";
    attrInfo[0].dwControlCode = ADS_ATTR_UPDATE;
    attrInfo[0].dwADsType = adsvFaxNumber.dwType;
    attrInfo[0].pADsValues = &adsvFaxNumber;
    attrInfo[0].dwNumValues = 1;

    // Setup the otherTelephone attribute data.
    attrInfo[1].pszAttrName = L"otherTelephone";
    attrInfo[1].dwControlCode = ADS_ATTR_UPDATE;
    attrInfo[1].dwADsType = rgadsvOtherTelephones[0].dwType;
    attrInfo[1].pADsValues = rgadsvOtherTelephones;
    attrInfo[1].dwNumValues = sizeof(rgadsvOtherTelephones)/sizeof(ADSVALUE);

    DWORD dwReturn;
 
    // Set the new attribute values.
    hr = pDirObject->SetObjectAttributes(attrInfo, 
        sizeof(attrInfo)/sizeof(ADS_ATTR_INFO), 
        &dwReturn);

    pDirObject->Release();
}