windows-nt/Source/XPSP1/NT/admin/admt/exenum/enumexch.cpp
2020-09-26 16:20:57 +08:00

75 lines
1.9 KiB
C++

// EnumExch.cpp : Implementation of CExEnumApp and DLL registration.
#include "stdafx.h"
#include "ExLdap.h"
#include "ExEnum.h"
#include "EnumExch.h"
#import "\bin\McsVarSetMin.tlb" no_namespace
/////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP CEnumExch::OpenServer(BSTR exchangeServer,BSTR cred,BSTR password)
{
DWORD rc = 0;
m_e.m_connection.SetCredentials(cred,password);
if ( ! rc )
{
rc = m_e.InitConnection(exchangeServer,LDAP_PORT);
}
return HRESULT_FROM_WIN32(rc);
}
STDMETHODIMP CEnumExch::DoQuery(BSTR query, ULONG scope, BSTR basepoint, IUnknown **pVS)
{
// build the attribute list
IVarSetPtr pVarSet = (*pVS);
_bstr_t attrName;
long nAttributes = pVarSet->get(L"EnumExch.NumAttributes");
WCHAR ** ppAttributes = new PWCHAR[nAttributes + 1];
long i;
WCHAR key[100];
WCHAR ** vals = NULL;
DWORD rc = 0;
for ( i = 0 ;i <= nAttributes ; i++ )
ppAttributes[i] = NULL;
for ( i = 0 ; i < nAttributes ; i++ )
{
swprintf(key,L"EnumExch.Attributes.%ld",i);
attrName = pVarSet->get(key);
ppAttributes[i] = new WCHAR[attrName.length() + 1];
UStrCpy(ppAttributes[i],(WCHAR*)attrName);
}
// Call the enumerator
rc = m_e.Open(query,basepoint,(SHORT)scope,100,nAttributes,ppAttributes);
long count = 0;
if (! rc )
{
while ( 0 == ( rc = m_e.Next(&vals)) )
{
for ( i = 0 ; i < nAttributes ; i++ )
{
swprintf(key,L"EnumExch.Values.%ld.%ld",count,i);
pVarSet->put(key,vals[i]);
}
count++;
}
if ( rc == ERROR_NOT_FOUND )
{
rc = 0;
}
}
return HRESULT_FROM_WIN32(rc);
}