Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Creating Exchange 2007 Mailbox using MAPI C++

40 views
Skip to first unread message

Amit

unread,
Mar 28, 2012, 8:21:50 AM3/28/12
to
Dear All,
I am trying to write a C++ function to create a Exchange 2007 mailbox with the help of pure MAPI functions (no CDO etc stuff). I can create a account but while opening the properties for this mailbox in Exchange management console, it always throws error that "ExchangeGuid is invalid". The code snippet is as follows:

// Get loggedin user container
hr = ADsOpenObject(strContainer, NULL, NULL, ADS_SECURE_AUTHENTICATION,
IID_IDirectoryObject, (void **)pLogonContainer.getptr());
ADS_ATTR_INFO *pAttrInfo = NULL;
DWORD dwReturn;
LPWSTR pAttrNames[] = { L"mail", L"homeMDB", L"homeMTA" };
DWORD dwNumAttr = sizeof (pAttrNames) / sizeof (LPWSTR);
wstring strLogonHomeMDB;
wstring strLogonHomeMTA;
wstring strLogonMail;

hr = pLogonContainer->GetObjectAttributes(pAttrNames, dwNumAttr, &pAttrInfo,&dwReturn);
for (DWORD idx = 0; idx < dwReturn; idx++)
{
if (_wcsicmp(pAttrInfo[idx].pszAttrName, L"mail") == 0)
strLogonMail = pAttrInfo[idx].pADsValues->Email.Address;

else if (_wcsicmp(pAttrInfo[idx].pszAttrName, L"homeMTA") == 0)
strLogonHomeMTA = pAttrInfo[idx].pADsValues->DNString;

else if (_wcsicmp(pAttrInfo[idx].pszAttrName, L"homeMDB") == 0)
strLogonHomeMDB = pAttrInfo[idx].pADsValues->DNString;
}
FreeADsMem(pAttrInfo);

wstring twtsrlogonuserDN = LogonUserDN;
size_t nPos = twtsrlogonuserDN.find(_T("DC="), 0);
wstring wstrServerDN = twtsrlogonuserDN.substr(nPos);
wstring wstrADSPath = _T("LDAP://CN=Users,") + wstrServerDN;
ADSVALUE cnValue;
ADSVALUE classValue;
ADSVALUE sAMValue;
ADSVALUE uPNValue;
ADSVALUE controlValue;
ADS_ATTR_INFO attrInfo[] = {
{ L"objectClass", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, &classValue, 1 },
{ L"cn", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, &cnValue, 1 },
{ L"sAMAccountName", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, &sAMValue, 1 },
{ L"userPrincipalName", ADS_ATTR_UPDATE, ADSTYPE_CASE_IGNORE_STRING, &uPNValue, 1 },
{L"userAccountControl", ADS_ATTR_UPDATE, ADSTYPE_INTEGER,&controlValue, 1},
};
DWORD dwAttrs = sizeof (attrInfo) / sizeof (ADS_ATTR_INFO);

classValue.dwType = ADSTYPE_CASE_IGNORE_STRING;
classValue.CaseIgnoreString = L"user";

int UF_PASSWD_NOTREQD = 0x0020;
int UF_NORMAL_ACCOUNT = 0x0200;
int UF_DONT_EXPIRE_PASSWD = 0x10000;


controlValue.dwType = ADSTYPE_INTEGER;
controlValue.Integer=UF_NORMAL_ACCOUNT | UF_PASSWD_NOTREQD |UF_DONT_EXPIRE_PASSWD;

cnValue.dwType = ADSTYPE_CASE_IGNORE_STRING;
cnValue.CaseIgnoreString = (LPWSTR)lpwstrNewUser;

sAMValue.dwType = ADSTYPE_CASE_IGNORE_STRING;
sAMValue.CaseIgnoreString = (LPWSTR)lpwstrNewUser;

wstring wstrMail;
size_t nPosMail = strLogonMail.find(_T("@"), 0);

wstrMail = strLogonMail.substr(nPosMail);
wstrMail = lpwstrNewUser + wstrMail;

LPWSTR upnval = (LPWSTR)wstrMail.c_str();

uPNValue.dwType = ADSTYPE_CASE_IGNORE_STRING;
uPNValue.CaseIgnoreString = upnval;

My::Util::ScopedInterface<IDirectoryObject> pDirContainer;
My::Util::ScopedInterface<IDispatch> pDisp;
My::Util::ScopedInterface<IADsUser> pIADNewUser;
wstring wstrLoggedUserName(LogonUserDN);
size_t snPos = 0;
size_t enPos = 0;

if ((snPos = wstrLoggedUserName.find(L"CN=")) != wstring::npos)
{
if ((enPos = wstrLoggedUserName.find(L",", snPos)) != wstring::npos)
wstrLoggedUserName = wstrLoggedUserName.substr(snPos + 3, (enPos - (snPos + 3)));
}
// get dir container
hr = ADsOpenObject(wstrADSPath.c_str(), wstrLoggedUserName.c_str(),
lpwstrLogonUsrPwd, ADS_SECURE_AUTHENTICATION, IID_IDirectoryObject,
(void **)pDirContainer.getptr());

wstring wstrUserCN = L"CN=";

wstrUserCN += lpwstrNewUser;
hr = pDirContainer->CreateDSObject((LPWSTR)wstrUserCN.c_str(), attrInfo, dwAttrs,
pDisp.getptr());
hr = pDisp->QueryInterface(IID_IADsUser, (void **)pIADNewUser.getptr());

CComVariant varProp;

varProp.Clear();

// set samAccount
varProp = lpwstrNewUser;
hr = pIADNewUser->Put(CComBSTR(L"sAMAccountName"), varProp);

// set userAccountControl
varProp.Clear();
hr = pIADNewUser->Get(CComBSTR(L"userAccountControl"), &varProp);
varProp = varProp.lVal & ~(ADS_UF_ACCOUNTDISABLE);
hr = pIADNewUser->Put(CComBSTR(L"userAccountControl"), varProp);

// set Account enabled
hr = pIADNewUser->put_AccountDisabled(VARIANT_FALSE)'
// set password
hr = pIADNewUser->SetPassword(CComBSTR(lpwstrNewUserPwd));

// user account password does not expire
varProp.Clear();

VARIANT var;

VariantInit(&var);
hr = pIADNewUser->Get(CComBSTR(L"userAccountControl"), &var)))
{
V_I4(&var) |= ADS_UF_DONT_EXPIRE_PASSWD;
hr = pIADNewUser->Put(CComBSTR(L"userAccountControl"), var);
}

// set the homeMDB;
if (!strLogonHomeMDB.empty())
{
varProp = strLogonHomeMDB.c_str();
hr = pIADNewUser->Put(CComBSTR("homeMDB"), varProp);
}

if (!strLogonHomeMTA.empty())
{
varProp = strLogonHomeMTA.c_str();
hr = pIADNewUser->Put(CComBSTR("homeMTA"), varProp);
}

if (!msExchHomeSvrName.empty())
{
varProp = msExchHomeSvrName.c_str();
hr = pIADNewUser->Put(CComBSTR("msExchHomeServerName"), varProp);
}

if (!legacyName.empty())
{
varProp = legacyName.c_str();
hr = pIADNewUser->Put(CComBSTR("legacyExchangeDN"), varProp);
}

// set nickname
varProp.Clear();
varProp = lpwstrNewUser;
hr = pIADNewUser->Put(CComBSTR("mailNickname"), varProp);

// set the displayName
varProp.Clear();
varProp = lpwstrNewUser;
hr = pIADNewUser->Put(CComBSTR("displayName"), varProp);

// set the mail atrribute
varProp.Clear();
varProp = wstrMail.c_str();
hr = pIADNewUser->Put(CComBSTR("mail"), varProp);

// set email
hr = pIADNewUser->put_EmailAddress(CComBSTR(wstrMail.c_str()));

hr = pIADNewUser->SetInfo();




Any help is highly appreciated.
Regards.
0 new messages