Modificar atributos con la interfaz IDirectoryObject

Además de IADs::P ut e IADs::P utEx, puede usar el método IDirectoryObject::SetObjectAttributes para modificar los valores de atributo. Para usar este método, debe rellenar una estructura de ADS_ATTR_INFO para cada atributo que se va a modificar.

El método IDirectoryObject::SetObjectAttributes permite modificar atributos de un solo valor y de varios valores. Esta función proporciona controles operativos similares, como borrar, anexar, eliminar y actualizar, a los que se encuentran en el método IADs::P utEx . Las constantes de control incluyen:

Al especificar ADS_ATTR_UPDATE se desencadenará una operación del lado servidor que puede consumir muchos recursos. Un ejemplo sería iniciar la operación para actualizar una larga lista de pertenencia a grupos. En general, evite usar esta operación a menos que la modificación implique un pequeño número de atributos en el directorio. Para modificar una larga lista de pertenencias a grupos, el enfoque más eficaz sería leer la lista del directorio subyacente, realizar modificaciones y volver a almacenar la lista actualizada en el directorio.

Nota

Al igual que IADs::P ut e IADs::P utEx con IADs::SetInfo, los cambios de atributo se confirman o se descartan completamente en Active Directory. Si no se permiten una o varias de las modificaciones y, por tanto, no se pueden realizar, ninguna de las modificaciones colectivas realizadas en los atributos se confirma en el directorio.

 

Ejemplo

En el ejemplo de código siguiente se muestra cómo modificar atributos únicos y multivalor con el método IDirectoryObject::SetObjectAttributes .

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();
}