Modifica degli attributi con l'interfaccia IDirectoryObject

Oltre a IADs::P ut e IADs::P utEx, è possibile usare il metodo IDirectoryObject::SetObjectAttributes per modificare i valori degli attributi. Per utilizzare questo metodo, è necessario compilare una struttura ADS_ATTR_INFO per ogni attributo da modificare.

Il metodo IDirectoryObject::SetObjectAttributes consente di modificare sia gli attributi a valore singolo che multivalore. Questa funzione fornisce controlli operativi simili, ad esempio clear, append, delete e update, a quelli trovati nel metodo IADs::P utEx . Le costanti di controllo includono:

Specificando ADS_ATTR_UPDATE verrà attivata un'operazione sul lato server che può richiedere un elevato utilizzo di risorse. Un esempio è quello di avviare l'operazione per aggiornare un lungo elenco di appartenenze ai gruppi. In generale, evitare di usare questa operazione a meno che la modifica non comporti un numero ridotto di attributi nella directory. Per modificare un lungo elenco di appartenenze ai gruppi, l'approccio più efficiente consiste nel leggere l'elenco dalla directory sottostante, apportare modifiche e archiviare nuovamente l'elenco aggiornato nella directory.

Nota

Come IADs::P ut e IADs::P utEx con IADs::SetInfo, le modifiche dell'attributo vengono completamente sottoposte a commit o rimosse in Active Directory. Se una o più delle modifiche non sono consentite e pertanto non sono in grado di essere eseguite, nessuna delle modifiche collettive apportate agli attributi viene sottoposta a commit nella directory.

 

Esempio

Nell'esempio di codice seguente viene illustrato come modificare attributi singoli e multivalore con il metodo 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();
}