Amit
unread,Mar 28, 2012, 8:21:50 AM3/28/12You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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.