Modifica di 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 usare questo metodo, è necessario compilare una struttura ADS_ATTR_INFO per ogni attributo da modificare.

Il metodo IDirectoryObject::SetObjectAttributes consente di modificare sia attributi con valore singolo che multivalore. Questa funzione fornisce controlli operativi simili, ad esempio cancella, accodamento, eliminazione e aggiornamento, a quelli trovati nel metodo IADs::P utEx . Le costanti di controllo includono:

Se si specifica ADS_ATTR_UPDATE , verrà attivata un'operazione lato server che può essere a elevato utilizzo di risorse. Un esempio consiste nell'avviare l'operazione per aggiornare un elenco lungo di appartenenza al gruppo. In generale, non usare questa operazione a meno che la modifica non implica un numero ridotto di attributi nella directory. Per modificare un elenco lungo 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

Ad esempio IADs::P ut e IADs::P utEx con IADs::SetInfo, le modifiche all'attributo vengono completamente eseguite o rimosse in Active Directory. Se una o più modifiche non sono consentite e pertanto non possono essere eseguite, nessuno delle modifiche collettive apportate agli attributi viene eseguito nel commit della 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();
}