Modificando atributos com a interface IDirectoryObject

Além de IADs::P ut e IADs::P utEx, você pode usar o método IDirectoryObject::SetObjectAttributes para modificar valores de atributo. Para usar esse método, você deve preencher uma estrutura ADS_ATTR_INFO para cada atributo a ser modificado.

O método IDirectoryObject::SetObjectAttributes permite modificar atributos de valor único e de vários valores. Essa função fornece controles operacionais semelhantes, como limpar, acrescentar, excluir e atualizar, àqueles encontrados no método IADs::P utEx . As constantes de controle incluem:

Especificar ADS_ATTR_UPDATE disparará uma operação do lado do servidor que pode ser intensiva em recursos. Um exemplo seria iniciar a operação para atualizar uma longa lista de associação de grupo. Em geral, evite usar essa operação, a menos que a modificação envolva um pequeno número de atributos no diretório. Para modificar uma longa lista de associações de grupo, a abordagem mais eficiente seria ler a lista do diretório subjacente, fazer modificações e armazenar a lista atualizada de volta para o diretório.

Observação

Como IADs::P ut e IADs::P utEx com IADs::SetInfo, as alterações de atributo são completamente confirmadas ou descartadas no Active Directory. Se uma ou mais modificações não forem permitidas e, portanto, não puderem ser executadas, nenhuma das modificações coletivas feitas aos atributos será confirmada no diretório.

 

Exemplo

O exemplo de código a seguir mostra como modificar atributos únicos e de vários valores com o 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();
}