void CBaseDialog::OnNotificationsOff() { HRESULT hRes = S_OK; if (m_ulBaseAdviseConnection && m_lpMapiObjects) { switch (m_ulBaseAdviseObjectType) { case MAPI_SESSION: { LPMAPISESSION lpMAPISession = m_lpMapiObjects->GetSession(); // do not release if (lpMAPISession) EC_MAPI(lpMAPISession->Unadvise(m_ulBaseAdviseConnection)); break; } case MAPI_STORE: { LPMDB lpMDB = m_lpMapiObjects->GetMDB(); // do not release if (lpMDB) EC_MAPI(lpMDB->Unadvise(m_ulBaseAdviseConnection)); break; } case MAPI_ADDRBOOK: { LPADRBOOK lpAB = m_lpMapiObjects->GetAddrBook(false); // do not release if (lpAB) EC_MAPI(lpAB->Unadvise(m_ulBaseAdviseConnection)); break; } } } if (m_lpBaseAdviseSink) m_lpBaseAdviseSink->Release(); m_lpBaseAdviseSink = NULL; m_ulBaseAdviseObjectType = NULL; m_ulBaseAdviseConnection = NULL; } // CBaseDialog::OnNotificationsOff
/** Creates ECQuotaMonitor object and calls * ECQuotaMonitor::CheckQuota(). Entry point for this class. * * @param[in] lpVoid LPECTHREADMONITOR struct * @return NULL */ void* ECQuotaMonitor::Create(void* lpVoid) { HRESULT hr = hrSuccess; LPECTHREADMONITOR lpThreadMonitor = (LPECTHREADMONITOR)lpVoid; ECQuotaMonitor* lpecQuotaMonitor = NULL; LPMAPISESSION lpMAPIAdminSession = NULL; LPMDB lpMDBAdmin = NULL; time_t tmStart = 0; time_t tmEnd = 0; char* lpPath = lpThreadMonitor->lpConfig->GetSetting("server_socket"); lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_INFO, "Quota monitor starting"); //Open admin session hr = HrOpenECAdminSession(lpThreadMonitor->lpLogger, &lpMAPIAdminSession, "zarafa-monitor:create", PROJECT_SVN_REV_STR, lpPath, 0, lpThreadMonitor->lpConfig->GetSetting("sslkey_file","",NULL), lpThreadMonitor->lpConfig->GetSetting("sslkey_pass","",NULL)); if (hr != hrSuccess) { lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Unable to open an admin session. Error 0x%X", hr); goto exit; } lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_INFO, "Connection to Zarafa server succeeded"); // Open admin store hr = HrOpenDefaultStore(lpMAPIAdminSession, &lpMDBAdmin); if (hr != hrSuccess) { lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Unable to open default store for system account"); goto exit; } lpecQuotaMonitor = new ECQuotaMonitor(lpThreadMonitor, lpMAPIAdminSession, lpMDBAdmin); // Release session and store (Reference on ECQuotaMonitor) if(lpMDBAdmin){ lpMDBAdmin->Release(); lpMDBAdmin = NULL;} if(lpMAPIAdminSession){ lpMAPIAdminSession->Release(); lpMAPIAdminSession = NULL;} // Check the quota of allstores tmStart = GetProcessTime(); hr = lpecQuotaMonitor->CheckQuota(); tmEnd = GetProcessTime(); if(hr != hrSuccess) lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Quota monitor failed"); else lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_INFO, "Quota monitor done in %lu seconds. Processed: %u, Failed: %u", tmEnd - tmStart, lpecQuotaMonitor->m_ulProcessed, lpecQuotaMonitor->m_ulFailed); exit: if(lpecQuotaMonitor) delete lpecQuotaMonitor; if(lpMDBAdmin) lpMDBAdmin->Release(); if(lpMAPIAdminSession) lpMAPIAdminSession->Release(); return NULL; }
bool COLAddrBook::SessionLogOn(ULONG hWnd, LPCTSTR profile, LPCTSTR pswd, ULONG flags) { bool bResult = false; LPMAPISESSION pSession = NULL; HRESULT hr = g_pMAPIEDK->pMAPILogonEx(hWnd, (LPTSTR)profile, (LPTSTR)pswd, flags, &pSession); if (pSession) { LPADRBOOK pAddrBook = NULL; if (SUCCEEDED(pSession->OpenAddressBook(NULL, NULL, AB_NO_DIALOG, &pAddrBook))) { m_initRef->SetAddrBook(pAddrBook); // открываем корневой каталог ULONG ulObjType = 0; LPUNKNOWN pUnk = NULL; if (SUCCEEDED(pAddrBook->OpenEntry(0, NULL, NULL, MAPI_BEST_ACCESS, &ulObjType, &pUnk))) { if (MAPI_ABCONT == ulObjType) { LPABCONT pContainer = NULL; m_pABCont = (LPABCONT)pUnk; m_pABCont->AddRef(); bResult = true; } } if (pUnk) pUnk->Release(); } if (pAddrBook) pAddrBook->Release(); } if (pSession) pSession->Release(); return bResult; }
HRESULT AddRecipientW(LPMAPISESSION lpMAPISession, LPMESSAGE lpMessage, ULONG ulRecipientType, LPWSTR szRecipientName) { HRESULT hRes = S_OK; LPADRLIST lpAdrList = NULL; // ModifyRecips takes LPADRLIST LPADRBOOK lpAddrBook = NULL; if (!lpMessage || !lpMAPISession) return MAPI_E_INVALID_PARAMETER; hRes = lpMAPISession->OpenAddressBook( NULL, NULL, NULL, &lpAddrBook); if (SUCCEEDED(hRes) && lpAddrBook) { hRes = HrAllocAdrList(NUM_RECIP_PROPS, &lpAdrList); if (SUCCEEDED(hRes) && lpAdrList) { // Set up the recipient by indicating how many recipients // and how many properties will be set on each recipient. lpAdrList->cEntries = 1; // How many recipients. lpAdrList->aEntries[0].cValues = NUM_RECIP_PROPS; // How many properties per recipient lpAdrList->aEntries[0].rgPropVals[p_PR_DISPLAY_NAME_W].ulPropTag = PR_DISPLAY_NAME_W; lpAdrList->aEntries[0].rgPropVals[p_PR_RECIPIENT_TYPE].ulPropTag = PR_RECIPIENT_TYPE; lpAdrList->aEntries[0].rgPropVals[p_PR_DISPLAY_NAME_W].Value.lpszW = szRecipientName; lpAdrList->aEntries[0].rgPropVals[p_PR_RECIPIENT_TYPE].Value.l = ulRecipientType; hRes = lpAddrBook->ResolveName( 0L, MAPI_UNICODE, NULL, lpAdrList); if (SUCCEEDED(hRes)) { // If everything goes right, add the new recipient to the message // object passed into us. hRes = lpMessage->ModifyRecipients(MODRECIP_ADD, lpAdrList); } } } if (lpAdrList) FreePadrlist(lpAdrList); if (lpAddrBook) lpAddrBook->Release(); return hRes; }
/** * ECQuotaMonitor constructor * Takes an extra reference to the passed MAPI objects which have refcounting. */ ECQuotaMonitor::ECQuotaMonitor(LPECTHREADMONITOR lpThreadMonitor, LPMAPISESSION lpMAPIAdminSession, LPMDB lpMDBAdmin) { m_lpThreadMonitor = lpThreadMonitor; m_lpMAPIAdminSession = lpMAPIAdminSession; m_lpMDBAdmin = lpMDBAdmin; m_ulProcessed = 0; m_ulFailed = 0; if(lpMAPIAdminSession) lpMAPIAdminSession->AddRef(); if(lpMDBAdmin) lpMDBAdmin->AddRef(); }
BOOL CMsgStore::Open( LPMAPISESSION pSession, LPMDB *ppMdb) { if ( m_lpMdb) { if (ppMdb) *ppMdb = m_lpMdb; return( TRUE); } BOOL bResult = TRUE; HRESULT hr = pSession->OpenMsgStore( NULL, m_cbEid, (LPENTRYID)m_lpEid, NULL, MDB_NO_MAIL, &m_lpMdb); // MDB pointer if (HR_FAILED( hr)) { m_lpMdb = NULL; MAPI_TRACE2( "OpenMsgStore failed: 0x%lx, %d\n", (long)hr, (int)hr); bResult = FALSE; } if (ppMdb) *ppMdb = m_lpMdb; return( bResult); }
void CBaseDialog::OnNotificationsOn() { HRESULT hRes = S_OK; if (m_lpBaseAdviseSink || !m_lpMapiObjects) return; LPMDB lpMDB = m_lpMapiObjects->GetMDB(); // do not release LPMAPISESSION lpMAPISession = m_lpMapiObjects->GetSession(); // do not release LPADRBOOK lpAB = m_lpMapiObjects->GetAddrBook(false); // do not release CEditor MyData( this, IDS_NOTIFICATIONS, IDS_NOTIFICATIONSPROMPT, 3, CEDITOR_BUTTON_OK | CEDITOR_BUTTON_CANCEL); MyData.SetPromptPostFix(AllFlagsToString(flagNotifEventType, true)); MyData.InitPane(0, CreateSingleLinePane(IDS_EID, NULL, false)); MyData.InitPane(1, CreateSingleLinePane(IDS_ULEVENTMASK, NULL, false)); MyData.SetHex(1, fnevNewMail); UINT uidDropDown[] = { IDS_DDMESSAGESTORE, IDS_DDSESSION, IDS_DDADDRESSBOOK }; MyData.InitPane(2, CreateDropDownPane(IDS_OBJECTFORADVISE, _countof(uidDropDown), uidDropDown, true)); WC_H(MyData.DisplayDialog()); if (S_OK == hRes) { if ((0 == MyData.GetDropDown(2) && !lpMDB) || (1 == MyData.GetDropDown(2) && !lpMAPISession) || (2 == MyData.GetDropDown(2) && !lpAB)) { ErrDialog(__FILE__, __LINE__, IDS_EDADVISE); return; } LPENTRYID lpEntryID = NULL; size_t cbBin = NULL; WC_H(MyData.GetEntryID(0, false, &cbBin, &lpEntryID)); // don't actually care if the returning lpEntryID is NULL - Advise can work with that m_lpBaseAdviseSink = new CAdviseSink(m_hWnd, NULL); if (m_lpBaseAdviseSink) { switch (MyData.GetDropDown(2)) { case 0: EC_MAPI(lpMDB->Advise( (ULONG)cbBin, lpEntryID, MyData.GetHex(1), (IMAPIAdviseSink *)m_lpBaseAdviseSink, &m_ulBaseAdviseConnection)); m_lpBaseAdviseSink->SetAdviseTarget(lpMDB); m_ulBaseAdviseObjectType = MAPI_STORE; break; case 1: EC_MAPI(lpMAPISession->Advise( (ULONG)cbBin, lpEntryID, MyData.GetHex(1), (IMAPIAdviseSink *)m_lpBaseAdviseSink, &m_ulBaseAdviseConnection)); m_ulBaseAdviseObjectType = MAPI_SESSION; break; case 2: EC_MAPI(lpAB->Advise( (ULONG)cbBin, lpEntryID, MyData.GetHex(1), (IMAPIAdviseSink *)m_lpBaseAdviseSink, &m_ulBaseAdviseConnection)); m_lpBaseAdviseSink->SetAdviseTarget(lpAB); m_ulBaseAdviseObjectType = MAPI_ADDRBOOK; break; } if (SUCCEEDED(hRes)) { if (0 == MyData.GetDropDown(2) && lpMDB) { // Try to trigger some RPC to get the notifications going LPSPropValue lpProp = NULL; WC_MAPI(HrGetOneProp( lpMDB, PR_TEST_LINE_SPEED, &lpProp)); if (MAPI_E_NOT_FOUND == hRes) { // We're not on an Exchange server. We don't need to generate RPC after all. hRes = S_OK; } MAPIFreeBuffer(lpProp); } } else // if we failed to advise, then we don't need the advise sink object { if (m_lpBaseAdviseSink) m_lpBaseAdviseSink->Release(); m_lpBaseAdviseSink = NULL; m_ulBaseAdviseObjectType = NULL; m_ulBaseAdviseConnection = NULL; } } delete[] lpEntryID; } } // CBaseDialog::OnNotificationsOn
void CBaseDialog::OnCompareEntryIDs() { HRESULT hRes = S_OK; if (!m_lpMapiObjects) return; LPMDB lpMDB = m_lpMapiObjects->GetMDB(); // do not release LPMAPISESSION lpMAPISession = m_lpMapiObjects->GetSession(); // do not release LPADRBOOK lpAB = m_lpMapiObjects->GetAddrBook(false); // do not release CEditor MyEIDs( this, IDS_COMPAREEIDS, IDS_COMPAREEIDSPROMPTS, 4, CEDITOR_BUTTON_OK | CEDITOR_BUTTON_CANCEL); MyEIDs.InitPane(0, CreateSingleLinePane(IDS_EID1, NULL, false)); MyEIDs.InitPane(1, CreateSingleLinePane(IDS_EID2, NULL, false)); UINT uidDropDown[] = { IDS_DDMESSAGESTORE, IDS_DDSESSION, IDS_DDADDRESSBOOK }; MyEIDs.InitPane(2, CreateDropDownPane(IDS_OBJECTFORCOMPAREEID, _countof(uidDropDown), uidDropDown, true)); MyEIDs.InitPane(3, CreateCheckPane(IDS_EIDBASE64ENCODED, false, false)); WC_H(MyEIDs.DisplayDialog()); if (S_OK != hRes) return; if ((0 == MyEIDs.GetDropDown(2) && !lpMDB) || (1 == MyEIDs.GetDropDown(2) && !lpMAPISession) || (2 == MyEIDs.GetDropDown(2) && !lpAB)) { ErrDialog(__FILE__, __LINE__, IDS_EDCOMPAREEID); return; } // Get the entry IDs as a binary LPENTRYID lpEntryID1 = NULL; size_t cbBin1 = NULL; EC_H(MyEIDs.GetEntryID(0, MyEIDs.GetCheck(3), &cbBin1, &lpEntryID1)); LPENTRYID lpEntryID2 = NULL; size_t cbBin2 = NULL; EC_H(MyEIDs.GetEntryID(1, MyEIDs.GetCheck(3), &cbBin2, &lpEntryID2)); ULONG ulResult = NULL; switch (MyEIDs.GetDropDown(2)) { case 0: // Message Store EC_MAPI(lpMDB->CompareEntryIDs((ULONG)cbBin1, lpEntryID1, (ULONG)cbBin2, lpEntryID2, NULL, &ulResult)); break; case 1: // Session EC_MAPI(lpMAPISession->CompareEntryIDs((ULONG)cbBin1, lpEntryID1, (ULONG)cbBin2, lpEntryID2, NULL, &ulResult)); break; case 2: // Address Book EC_MAPI(lpAB->CompareEntryIDs((ULONG)cbBin1, lpEntryID1, (ULONG)cbBin2, lpEntryID2, NULL, &ulResult)); break; } if (SUCCEEDED(hRes)) { CString szRet; CString szResult; EC_B(szResult.LoadString(ulResult ? IDS_TRUE : IDS_FALSE)); szRet.FormatMessage(IDS_COMPAREEIDBOOL, ulResult, szResult); CEditor Result( this, IDS_COMPAREEIDSRESULT, NULL, (ULONG)0, CEDITOR_BUTTON_OK); Result.SetPromptPostFix(szRet); (void)Result.DisplayDialog(); } delete[] lpEntryID2; delete[] lpEntryID1; } // CBaseDialog::OnCompareEntryIDs
HRESULT RunStoreValidation(char* strHost, char* strUser, char* strPass, char *strAltUser, bool bPublic, CHECKMAP checkmap) { HRESULT hr = hrSuccess; LPMAPISESSION lpSession = NULL; LPMDB lpStore = NULL; LPMDB lpAltStore = NULL; LPMDB lpReadStore = NULL; LPMAPIFOLDER lpRootFolder = NULL; LPMAPITABLE lpHierarchyTable = NULL; LPSRowSet lpRows = NULL; ULONG ulObjectType; ULONG ulCount; LPEXCHANGEMANAGESTORE lpIEMS = NULL; // user ULONG cbUserStoreEntryID = 0; LPENTRYID lpUserStoreEntryID = NULL; wstring strwUsername; wstring strwAltUsername; wstring strwPassword; std::set<std::string> setFolderIgnore; LPSPropValue lpAddRenProp = NULL; ULONG cbEntryIDSrc = 0; LPENTRYID lpEntryIDSrc = NULL; ECLogger *const lpLogger = new ECLogger_File(EC_LOGLEVEL_FATAL, 0, "-"); hr = MAPIInitialize(NULL); if (hr != hrSuccess) { cout << "Unable to initialize session" << endl; goto exit; } // input from commandline is current locale if (strUser) strwUsername = convert_to<wstring>(strUser); if (strPass) strwPassword = convert_to<wstring>(strPass); if (strAltUser) strwAltUsername = convert_to<wstring>(strAltUser); hr = HrOpenECSession(lpLogger, &lpSession, "zarafa-fsck", PROJECT_SVN_REV_STR, strwUsername.c_str(), strwPassword.c_str(), (const char *)strHost, 0, NULL, NULL); lpLogger->Release(); if(hr != hrSuccess) { cout << "Wrong username or password." << endl; goto exit; } if (bPublic) { hr = HrOpenECPublicStore(lpSession, &lpStore); if (hr != hrSuccess) { cout << "Failed to open public store." << endl; goto exit; } } else { hr = HrOpenDefaultStore(lpSession, &lpStore); if (hr != hrSuccess) { cout << "Failed to open default store." << endl; goto exit; } } if (!strwAltUsername.empty()) { hr = lpStore->QueryInterface(IID_IExchangeManageStore, (void **)&lpIEMS); if (hr != hrSuccess) { cout << "Cannot open ExchangeManageStore object" << endl; goto exit; } hr = lpIEMS->CreateStoreEntryID(L"", (LPTSTR)strwAltUsername.c_str(), MAPI_UNICODE | OPENSTORE_HOME_LOGON, &cbUserStoreEntryID, &lpUserStoreEntryID); if (hr != hrSuccess) { cout << "Cannot get user store id for user" << endl; goto exit; } hr = lpSession->OpenMsgStore(0, cbUserStoreEntryID, lpUserStoreEntryID, NULL, MDB_WRITE | MDB_NO_DIALOG | MDB_NO_MAIL | MDB_TEMPORARY, &lpAltStore); if (hr != hrSuccess) { cout << "Cannot open user store of user" << endl; goto exit; } lpReadStore = lpAltStore; } else { lpReadStore = lpStore; } hr = lpReadStore->OpenEntry(0, NULL, &IID_IMAPIFolder, 0, &ulObjectType, (IUnknown **)&lpRootFolder); if(hr != hrSuccess) { cout << "Failed to open root folder." << endl; goto exit; } if (HrGetOneProp(lpRootFolder, PR_IPM_OL2007_ENTRYIDS /*PR_ADDITIONAL_REN_ENTRYIDS_EX*/, &lpAddRenProp) == hrSuccess && Util::ExtractSuggestedContactsEntryID(lpAddRenProp, &cbEntryIDSrc, &lpEntryIDSrc) == hrSuccess) { setFolderIgnore.insert(string((const char*)lpEntryIDSrc, cbEntryIDSrc)); } hr = lpRootFolder->GetHierarchyTable(CONVENIENT_DEPTH, &lpHierarchyTable); if (hr != hrSuccess) { cout << "Failed to open hierarchy." << endl; goto exit; } /* * Check if we have found at least *something*. */ hr = lpHierarchyTable->GetRowCount(0, &ulCount); if(hr != hrSuccess) { cout << "Failed to count number of rows." << endl; goto exit; } else if (!ulCount) { cout << "No entries inside Calendar." << endl; goto exit; } /* * Loop through each row/entry and validate. */ while (true) { hr = lpHierarchyTable->QueryRows(20, 0, &lpRows); if (hr != hrSuccess) break; if (lpRows->cRows == 0) break; for (ULONG i = 0; i < lpRows->cRows; i++) RunFolderValidation(setFolderIgnore, lpRootFolder, &lpRows->aRow[i], checkmap); if (lpRows) { FreeProws(lpRows); lpRows = NULL; } } exit: if (lpUserStoreEntryID) MAPIFreeBuffer(lpUserStoreEntryID); if (lpIEMS) lpIEMS->Release(); if (lpRows) { FreeProws(lpRows); lpRows = NULL; } if (lpEntryIDSrc) MAPIFreeBuffer(lpEntryIDSrc); if (lpAddRenProp) MAPIFreeBuffer(lpAddRenProp); if(lpHierarchyTable) lpHierarchyTable->Release(); if (lpRootFolder) lpRootFolder->Release(); if (lpAltStore) lpAltStore->Release(); if (lpStore) lpStore->Release(); if (lpSession) lpSession->Release(); MAPIUninitialize(); return hr; }
/** Uses the ECServiceAdmin to get a list of all users within a * given company and groups those per zarafa-server instance. Per * server it calls ECQuotaMonitor::CheckServerQuota(). * * @param[in] company lpecCompany ECCompany struct * @return hrSuccess or any MAPI error code. */ HRESULT ECQuotaMonitor::CheckCompanyQuota(LPECCOMPANY lpecCompany) { HRESULT hr = hrSuccess; /* Service object */ IECServiceAdmin *lpServiceAdmin = NULL; LPSPropValue lpsObject = NULL; /* Userlist */ LPECUSER lpsUserList = NULL; ULONG cUsers = 0; /* 2nd Server connection */ LPMAPISESSION lpSession = NULL; LPMDB lpAdminStore = NULL; set<string> setServers; char *lpszServersConfig; std::set<string, stricmp_comparison> setServersConfig; set<string>::iterator iServers; char *lpszConnection = NULL; bool bIsPeer = false; m_lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_INFO, "Checking quota for company %s", (char*)lpecCompany->lpszCompanyname); /* Obtain Service object */ hr = HrGetOneProp(m_lpMDBAdmin, PR_EC_OBJECT, &lpsObject); if(hr != hrSuccess) { m_lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Unable to get internal object, error code: 0x%08X", hr); goto exit; } hr = ((IECUnknown *)lpsObject->Value.lpszA)->QueryInterface(IID_IECServiceAdmin, (void **)&lpServiceAdmin); if(hr != hrSuccess) { m_lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Unable to get service admin, error code: 0x%08X", hr); goto exit; } /* Get userlist */ hr = lpServiceAdmin->GetUserList(lpecCompany->sCompanyId.cb, (LPENTRYID)lpecCompany->sCompanyId.lpb, 0, &cUsers, &lpsUserList); if (hr != hrSuccess) { m_lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Unable to get userlist for company %s, error code 0x%08X", (LPSTR)lpecCompany->lpszCompanyname, hr); goto exit; } for (ULONG i = 0; i < cUsers; i++) { if (lpsUserList[i].lpszServername && lpsUserList[i].lpszServername[0] != '\0') setServers.insert((char*)lpsUserList[i].lpszServername); } if (setServers.empty()) { // call server function with current lpMDBAdmin / lpServiceAdmin hr = CheckServerQuota(cUsers, lpsUserList, lpecCompany, m_lpMDBAdmin); if (hr != hrSuccess) { m_lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Unable to check server quota, error code 0x%08X", hr); goto exit; } } else { lpszServersConfig = m_lpThreadMonitor->lpConfig->GetSetting("servers","",NULL); if(lpszServersConfig) { // split approach taken from varafa-backup/backup.cpp boost::algorithm::split(setServersConfig, lpszServersConfig, boost::algorithm::is_any_of("\t "), boost::algorithm::token_compress_on); setServersConfig.erase(string()); } for (iServers = setServers.begin(); iServers != setServers.end(); iServers++) { if(!setServersConfig.empty() && (setServersConfig.find((*iServers).c_str()) == setServersConfig.end())) continue; hr = lpServiceAdmin->ResolvePseudoUrl((char*)string("pseudo://"+ (*iServers)).c_str(), &lpszConnection, &bIsPeer); if (hr != hrSuccess) { m_lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Unable to resolve servername %s, error code 0x%08X", iServers->c_str(), hr); m_ulFailed++; goto next; } m_lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_INFO, "Connecting to server %s using url %s", iServers->c_str(), lpszConnection); // call server function with new lpMDBAdmin / lpServiceAdmin if (bIsPeer) { // query interface hr = m_lpMDBAdmin->QueryInterface(IID_IMsgStore, (void**)&lpAdminStore); if (hr != hrSuccess) { m_lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Unable to get service interface again, error code 0x%08X", hr); m_ulFailed++; goto next; } } else { hr = HrOpenECAdminSession(m_lpThreadMonitor->lpLogger, &lpSession, "zarafa-monitor:check-company", PROJECT_SVN_REV_STR, lpszConnection, 0, m_lpThreadMonitor->lpConfig->GetSetting("sslkey_file","",NULL), m_lpThreadMonitor->lpConfig->GetSetting("sslkey_pass","",NULL)); if (hr != hrSuccess) { m_lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Unable to connect to server %s, error code 0x%08X", lpszConnection, hr); m_ulFailed++; goto next; } hr = HrOpenDefaultStore(lpSession, &lpAdminStore); if (hr != hrSuccess) { m_lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Unable to open admin store on server %s, error code 0x%08X", lpszConnection, hr); m_ulFailed++; goto next; } } hr = CheckServerQuota(cUsers, lpsUserList, lpecCompany, lpAdminStore); if (hr != hrSuccess) { m_lpThreadMonitor->lpLogger->Log(EC_LOGLEVEL_FATAL, "Unable to check quota on server %s, error code 0x%08X", lpszConnection, hr); m_ulFailed++; } next: if (lpszConnection) MAPIFreeBuffer(lpszConnection); lpszConnection = NULL; if (lpSession) lpSession->Release(); lpSession = NULL; if (lpAdminStore) lpAdminStore->Release(); lpAdminStore = NULL; } } exit: if (lpszConnection) MAPIFreeBuffer(lpszConnection); if(lpServiceAdmin) lpServiceAdmin->Release(); if(lpsObject) MAPIFreeBuffer(lpsObject); if(lpsUserList) MAPIFreeBuffer(lpsUserList); return hr; }
int main(int argc, char *argv[]) { HRESULT hr; if (argc == 1) { cout << "Set MAPI address list search order" << endl; cout << "Shawn Poulson <*****@*****.**>, 2008.10.24" << endl; //Start modified by CL cout << "Modified to work with Outlook2010 by CL <*****@*****.**> 2012-10-16" <<endl; //End modified by CL cout << endl; cout << "Usage: " << GetFilename(argv[0]) << " \"Address List A\" [ \"Address List B\" ...]" << endl; cout << endl; cout << "Example lists:" << endl; cout << " All Contacts (All Outlook contacts folders)" << endl; cout << " Contacts (Default Outlook contacts)" << endl; cout << " Global Address List" << endl; cout << " All Address Lists (All lists defined in Exchange)" << endl; cout << " All Users (All Exchange users)" << endl; return 1; } // Start modified by CN HKEY subKey = nullptr; LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Clients\\Mail\\Microsoft Outlook"), 0, KEY_READ, &subKey); if (result != ERROR_SUCCESS) { cout << "Error: Could not find Microsoft Outlook on machine" << endl; return 0; } // End modified by CN // Initialize MAPI hr = MAPIInitialize(NULL); if (FAILED(hr)) { cerr << "Error initializing MAPI" << endl; goto Exit; } // Logon to MAPI with default profile LPMAPISESSION lpSession; hr = MAPILogon(&lpSession); if (FAILED(hr)) goto Exit; if (lpSession != NULL) { // Compile command line arguments to SearchList list<string> SearchList; for (int i = 1; i < argc; i++) { SearchList.push_back(argv[i]); } // Save SearchList SetAddressListSearchOrder(*lpSession, SearchList); //Start modified by CL Setcustomization(*lpSession); //End modified by CL // Clean up MAPILogoff(*lpSession); hr = lpSession->Release(); if (FAILED(hr)) { cerr << "Warning: lpSession->Release() failed" << endl; } } else { cerr << "Error logging on to MAPI" << endl; goto Exit; } Exit: MAPIUninitialize(); return 0; }
void Test(){ HRESULT hr = 0; LPMAPISESSION lpMapiSession = NULL; LPMDB lpMdb = NULL; IMAPITable* pIStoreTable = NULL; LPSRowSet pRows = NULL; IUnknown* lpExchManageStroe = NULL; SPropValue* pAllFoldersPropValue = NULL; do{ MAPIINIT_0 mapiInit = { 0, MAPI_MULTITHREAD_NOTIFICATIONS }; hr = MAPIInitialize(&mapiInit); DEFINE_IF_HR_NT_OK_BREAK(hr); //L"Outlook" hr = MAPILogonEx(0, NULL , NULL, MAPI_NEW_SESSION | MAPI_USE_DEFAULT | MAPI_EXTENDED, &lpMapiSession); DEFINE_IF_HR_NT_OK_BREAK(hr); enum{ PR_DEFAULT_STORE_, PR_ENTRYID_, PR_RESOURCE_FLAGS_, PR_MDB_PROVIDER_, PR_DISPLAY_NAME_, COUNT }; SizedSPropTagArray(COUNT, storeEntryID) = { COUNT, { PR_DEFAULT_STORE, PR_ENTRYID, PR_RESOURCE_FLAGS, PR_MDB_PROVIDER, PR_DISPLAY_NAME} }; ULONG ulRowCount = 0; ULONG ulRowIndex = 0; BOOL bFind = FALSE; hr = lpMapiSession->GetMsgStoresTable(0, &pIStoreTable); DEFINE_IF_HR_NT_OK_BREAK(hr); hr = pIStoreTable->SetColumns((LPSPropTagArray)&storeEntryID, 0); DEFINE_IF_HR_NT_OK_BREAK(hr); hr = pIStoreTable->GetRowCount(0, &ulRowCount); DEFINE_IF_HR_NT_OK_BREAK(hr); hr = pIStoreTable->QueryRows(ulRowCount, 0, &pRows); DEFINE_IF_HR_NT_OK_BREAK(hr); ulRowIndex = 0; while (ulRowIndex<pRows->cRows) { _SRow row = pRows->aRow[ulRowIndex]; if (row.lpProps[PR_DEFAULT_STORE_].Value.b == TRUE && (row.lpProps[PR_RESOURCE_FLAGS_].Value.ul & STATUS_DEFAULT_STORE) ) { bFind = TRUE; break; } ulRowIndex++; } if (bFind) { hr = lpMapiSession->OpenMsgStore(0, pRows->aRow[ulRowIndex].lpProps[PR_ENTRYID_].Value.bin.cb, (ENTRYID*)pRows->aRow[ulRowIndex].lpProps[PR_ENTRYID_].Value.bin.lpb, NULL, MDB_WRITE | MAPI_BEST_ACCESS | MDB_NO_DIALOG, (IMsgStore**)&lpMdb); DEFINE_IF_HR_NT_OK_BREAK(hr); } else { break; } enum { PR_IPM_OUTBOX_ENTRYID_, PR_VALID_FOLDER_MASK_, COUNT_ }; SizedSPropTagArray(COUNT_, rgPropTag) = { COUNT_, { PR_IPM_OUTBOX_ENTRYID, PR_VALID_FOLDER_MASK } }; ULONG ulValues = 0; hr = lpMdb->GetProps((LPSPropTagArray)&rgPropTag, 0, &ulValues, &pAllFoldersPropValue); DEFINE_IF_HR_NT_OK_BREAK(hr); ULONG lpObjType = 0; IMAPIFolder* lpMapiFolder = NULL; if (pAllFoldersPropValue[PR_VALID_FOLDER_MASK_].Value.ul & FOLDER_IPM_OUTBOX_VALID){ hr = lpMdb->OpenEntry(pAllFoldersPropValue[PR_IPM_OUTBOX_ENTRYID_].Value.bin.cb, (ENTRYID*)pAllFoldersPropValue[PR_IPM_OUTBOX_ENTRYID_].Value.bin.lpb, NULL, MAPI_BEST_ACCESS | MAPI_MODIFY, &lpObjType, (IUnknown**)&lpMapiFolder); DEFINE_IF_HR_NT_OK_BREAK(hr); } hr = AddMailW(lpMapiSession, lpMapiFolder, L"ceshi测试12", L"lhy测试12", L"*****@*****.**", false, false, true, false); DEFINE_IF_HR_NT_OK_BREAK(hr); } while (0); DWORD dError = GetLastError(); if (pAllFoldersPropValue){ MAPIFREEBUFFER(pAllFoldersPropValue); } if (lpExchManageStroe) { lpExchManageStroe->Release(); lpExchManageStroe = NULL; } if (lpMdb) { ULONG ulLogOffTag = LOGOFF_NO_WAIT; lpMdb->StoreLogoff(&ulLogOffTag); lpMdb->Release(); lpMdb = NULL; } if (pRows) { FreeProws(pRows); pRows = NULL; } if (pIStoreTable) { pIStoreTable->Release(); pIStoreTable = NULL; } if (lpMapiSession){ lpMapiSession->Logoff(0, 0, 0); lpMapiSession->Release(); lpMapiSession = NULL; } MAPIUninitialize(); }