136 lines
3.0 KiB
C++
136 lines
3.0 KiB
C++
// Read.cpp : Defines the entry point for the console application.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "stdio.h"
|
|
#include "activeds.h"
|
|
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
HRESULT hr;
|
|
IADs *pUsr=NULL;
|
|
|
|
|
|
CoInitialize(NULL);
|
|
|
|
////////////////////////////////////
|
|
// Bind to a directory object
|
|
/////////////////////////////////////
|
|
hr = ADsGetObject(L"WinNT://INDEPENDENCE/Administrator,user", IID_IADs, (void**) &pUsr );
|
|
if ( !SUCCEEDED(hr) )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
///////////////////////////////////
|
|
// Get a single value attribute
|
|
////////////////////////////////////
|
|
VARIANT var;
|
|
VariantInit(&var);
|
|
|
|
|
|
hr = pUsr->Get(L"FullName", &var );
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
printf("FullName: %S\n", V_BSTR(&var) );
|
|
VariantClear(&var);
|
|
}
|
|
|
|
if ( pUsr )
|
|
{
|
|
pUsr->Release();
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////
|
|
// Get a multi value attribute from a service object
|
|
/////////////////////////////////////////////////////////
|
|
IADs *pSvc = NULL;
|
|
|
|
hr = ADsGetObject(L"WinNT://INDEPENDENCE/ANDYHAR11/Browser,service", IID_IADs, (void**) &pSvc );
|
|
if ( !SUCCEEDED(hr) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
hr = pSvc->Get(L"Dependencies", &var );
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
LONG lstart, lend;
|
|
SAFEARRAY *sa = V_ARRAY( &var );
|
|
VARIANT varItem;
|
|
|
|
// Get the lower and upper bound
|
|
hr = SafeArrayGetLBound( sa, 1, &lstart );
|
|
hr = SafeArrayGetUBound( sa, 1, &lend );
|
|
|
|
// Now iterate and print the content
|
|
VariantInit(&varItem);
|
|
printf("Getting service dependencies using IADs :\n");
|
|
for ( long idx=lstart; idx < lend; idx++ )
|
|
{
|
|
hr = SafeArrayGetElement( sa, &idx, &varItem );
|
|
printf("%S ", V_BSTR(&varItem));
|
|
VariantClear(&varItem);
|
|
}
|
|
printf("\n");
|
|
|
|
VariantClear(&var);
|
|
}
|
|
|
|
// Clean-up
|
|
if ( pSvc )
|
|
{
|
|
pSvc->Release();
|
|
}
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Using IDirectoryObject to get a multivalue attribute
|
|
// Note: NOT all providers support this interface
|
|
////////////////////////////////////////////////////////////
|
|
IDirectoryObject *pDirObject=NULL;
|
|
ADS_ATTR_INFO *pAttrInfo=NULL;
|
|
DWORD dwReturn;
|
|
LPWSTR pAttrNames[]={L"objectClass" };
|
|
DWORD dwNumAttr=sizeof(pAttrNames)/sizeof(LPWSTR);
|
|
|
|
hr = ADsGetObject(L"LDAP://CN=Administrator,CN=Users,DC=testDom1,DC=testDom2,DC=microsoft,DC=com",
|
|
IID_IDirectoryObject,
|
|
(void**) &pDirObject );
|
|
|
|
if ( !SUCCEEDED(hr) )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
// Now get the attribute
|
|
hr = pDirObject->GetObjectAttributes( pAttrNames,
|
|
dwNumAttr,
|
|
&pAttrInfo,
|
|
&dwReturn );
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
printf("Getting the objectClass multivalue attribute using IDirectoryObject :\n");
|
|
for (DWORD val=0; val < pAttrInfo->dwNumValues; val++, pAttrInfo->pADsValues++)
|
|
{
|
|
printf(" %S\n", pAttrInfo->pADsValues->CaseIgnoreString);
|
|
}
|
|
FreeADsMem(pAttrInfo);
|
|
}
|
|
|
|
//Clean up
|
|
pDirObject->Release();
|
|
|
|
|
|
CoUninitialize();
|
|
return 0;
|
|
}
|