Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
The following code example reads the defaultSecurityDescriptor for a specified object class.
// Add adsiid.lib to your project
// Add activeds.lib to your project
#include <stdio.h>
#include "stdafx.h"
#include "iads.h"
#include "adshlp.h"
// Entry point to the application
int wmain(int argc, WCHAR* argv[])
{
HRESULT hr;
IADsContainer *pAbsSchema = NULL; // For the abstract schema
IADsClass *pClass = NULL; // For class objects
IADsProperty *pProp = NULL; // For attribute objects
IADsSyntax *pSyntax = NULL; // For syntax objects
IEnumVARIANT *pEnum = NULL;
ULONG lFetch;
VARIANT var;
VARIANT_BOOL bMulti, bAbstract, bAux;
BSTR bstrPI, bstrClass, bstrName;
LONG lCount = 0;
LONG lVarType = 0;
IADs *pChild = NULL;
DWORD dwUnknownClass = 0;
CoInitialize(NULL);
// Bind to the abstract schema.
hr = ADsGetObject(L"LDAP://schema",
IID_IADsContainer,
(void**)&pAbsSchema);
if (FAILED(hr))
goto cleanup;
// Enumerate the attribute and class entries in the abstract schema.
hr = ADsBuildEnumerator(pAbsSchema, &pEnum);
if (FAILED(hr))
goto cleanup;
VariantInit(&var);
hr = ADsEnumerateNext(pEnum, 1, &var, &lFetch);
while( hr == S_OK && lFetch == 1)
{
// Identify whether this is a class, attribute, or syntax.
hr = V_DISPATCH(&var)->QueryInterface(IID_IADs,
(void**) &pChild);
if (FAILED(hr))
goto cleanuploop;
hr = pChild->get_Class(&bstrClass);
if (FAILED(hr))
goto cleanuploop;
wprintf(L"%s", bstrClass );
hr = pChild->get_Name(&bstrName);
if (FAILED(hr))
goto cleanuploop;
wprintf(L",%s", bstrName);
// Retrieve data, depending on the type of schema element.
if (_wcsicmp(L"Class", bstrClass)==0)
{
hr = pChild->QueryInterface(IID_IADsClass,
(void**) &pClass);
if (FAILED(hr))
goto cleanuploop;
pClass->get_Abstract(&bAbstract);
pClass->get_Auxiliary(&bAux);
if (bAbstract)
wprintf(L",Abstract");
else if (bAux)
wprintf(L",Auxiliary");
else
wprintf(L",Structural");
// Retrieve the primary ADSI
// interface to use with this class.
pClass->get_PrimaryInterface(&bstrPI);
if (_wcsicmp(L"{FD8256D0-FD15-11CE-ABC4-02608C9E7553}",
bstrPI)==0)
wprintf(L",IID_IADS,%s", bstrPI);
if (_wcsicmp(L"{B15160D0-1226-11CF-A985-00AA006BC149}",
bstrPI)==0)
wprintf(L",IID_IADsPrintQueue,%s", bstrPI);
if (_wcsicmp(L"{A2F733B8-EFFE-11CF-8ABC-00C04FD8D503}",
bstrPI)==0)
wprintf(L",IID_IADsOU,%s", bstrPI);
if (_wcsicmp(L"{A05E03A2-EFFE-11CF-8ABC-00C04FD8D503}",
bstrPI)==0)
wprintf(L",IID_IADsLocality,%s", bstrPI);
if (_wcsicmp(L"{3E37E320-17E2-11CF-ABC4-02608C9E7553}",
bstrPI)==0)
wprintf(L",IID_IADsUser,%s", bstrPI);
if (_wcsicmp(L"{27636B00-410F-11CF-B1FF-02608C9E7553}",
bstrPI)==0)
wprintf(L",IID_IADsGroup,%s", bstrPI);
if (_wcsicmp(L"{00E4C220-FD16-11CE-ABC4-02608C9E7553}",
bstrPI)==0)
wprintf(L",IID_IADsDomain,%s", bstrPI);
SysFreeString(bstrPI);
}
else if (_wcsicmp(L"Property",bstrClass)==0)
{
hr = pChild->QueryInterface(IID_IADsProperty,
(void**) &pProp);
if (FAILED(hr))
goto cleanuploop;
pProp->get_MultiValued(&bMulti);
wprintf(L",%s", bMulti ? L"Multi-Valued" : L"Single-Valued");
}
else if (_wcsicmp(L"Syntax", bstrClass)==0)
{
hr = pChild->QueryInterface(IID_IADsSyntax,
(void**) &pSyntax);
if ( FAILED(hr) )
goto cleanuploop;
pSyntax->get_OleAutoDataType (&lVarType);
wprintf(L",%u", lVarType);
}
else
dwUnknownClass++;
cleanuploop:
wprintf(L"\n");
SysFreeString(bstrClass);
SysFreeString(bstrName);
pChild->Release();
VariantClear(&var);
if (SUCCEEDED(hr))
hr = ADsEnumerateNext( pEnum, 1, &var, &lFetch );
}
wprintf(L"dwUnknownClass: %u\n", dwUnknownClass);
cleanup:
if (pAbsSchema)
pAbsSchema->Release();
if (pEnum)
pEnum->Release();
VariantClear(&var);
CoUninitialize();
return hr;
}