HOWTO: Opening Mailboxes with Privileged Access

ID: Q194627

The information in this article applies to:

SUMMARY

Applications that are doing statistics or monitoring of mailboxes need to access all the mailboxes. You can accomplish this by logging into the private information store with a privileged account, looping through the list of mailboxes, and open the mailboxes with the HrMailboxLogon() function.

MORE INFORMATION

The following code shows how to open all of the mailboxes on a server. It requires the Windows NT account you use to launch the application to have administrative privileges on the Exchange Server Directory.

Here is the list of additional libraries used to compile this code. (You should add these to the libraries required for a Win32 console application.)

There are some items within the code marked with "TO DO:" that you need to change to use the organization and site information for the server you access. It is also possible for you to change the code to accept the server Distinguished Name (DN) from the prompt.

    #include <stdio.h>
    #include <edk.h>

    HRESULT OpenMailbox(LPMAPISESSION lpMAPISession,
                        LPSTR pszExchangeServerName);

    void main()
    {
       HRESULT hr = S_OK;

       hr = MAPIInitialize(NULL);
       if(FAILED(hr))
       {
          printf("Failed to initialize MAPI\n");
       }

       char pszExchangeServerName[500];
       LPMAPISESSION lpSess = NULL;
       LPMDB   lpMDB = NULL;

       // Get the Exchange Server name from the user.
       //
       printf("n\nPlease enter the name of your Exchange System ?  ");
       gets(pszExchangeServerName);
       printf("\n\n");

       // TO DO: Need to logon using a profile for the service account or
       //        an Exchange Admin.
       hr = MAPILogonEx(0, "", NULL,
               MAPI_LOGON_UI | MAPI_NEW_SESSION |  MAPI_EXPLICIT_PROFILE ,
               &lpSess);
       if (FAILED(hr))
       {
          MessageBox(NULL,"MAPI Logon failed",NULL,MB_OK);
       }

       if(SUCCEEDED(hr)&& lpSess)
       {
          printf("Created MAPI session\n");
          hr = OpenMailbox(lpSess, pszExchangeServerName);

          if(FAILED(hr))
             printf("Failed to Run\n");
          else
             printf("Opened users mailboxes\n");

       }

       char ch;
       printf("\nHit a key to exit");
       ch = getchar();

       if(lpSess)
          lpSess->Release();

    }

    HRESULT OpenMailbox(LPMAPISESSION lpMAPISession, LPSTR pszServerName)
    {
       HRESULT      hr            = S_OK;
       LPMAPITABLE lpMailBoxTable = NULL;
       LPSRowSet   lpRows         = NULL;
       LPENTRYID   lpMsgStoreID   = NULL;
       ULONG      cbMsgStoreID   = 0;
       LPMDB      lpMDB         = NULL;
       LPMDB      lpUserMDB      = NULL;
       LPMAPIFOLDER lpFolder      = NULL;
       LPEXCHANGEMANAGESTORE lpIManageStore = NULL;
       char pszServerDN[500];

       if (FAILED(hr = HrOpenExchangePrivateStore(lpMAPISession, &lpMDB)))
       {
          MessageBox(0L,"Message Store Not Available","Error",MB_OK);
          return MAPI_E_NOT_FOUND;
       }

       if (FAILED(hr = lpMDB->QueryInterface(IID_IExchangeManageStore,
                                (void **) &lpIManageStore)))
       {
          MessageBox(0L,"QueryInterace Failed","Error",MB_OK);
          return MAPI_E_NOT_FOUND;
       }

       // TO DO: Create server DN. Replace "myorgname" and "mysitename"
       //        with appropriate organization and site name.
       sprintf(pszServerDN,"/o=myorgname/ou=mysitename/cn=servers/cn=%s",
               pszServerName);

       if (FAILED(hr = lpIManageStore->GetMailboxTable(pszServerDN,
                                        &lpMailBoxTable,0)))
       {
          MessageBox(0L,"Mailbox Table Not Available","Error",MB_OK);
          return MAPI_E_NOT_FOUND;
       }

       //  Get a list of Mailboxes taking up resources.
       hr = HrQueryAllRows(lpMailBoxTable, NULL, NULL, NULL, 0, &lpRows);

       if(SUCCEEDED(hr))
       {
          if (lpRows->cRows > 0)
          {
             for (UINT i=0; i < lpRows->cRows; i++)
             {
                LPSPropValue lpspv = PpropFindProp(
                                    lpRows->aRow[i].lpProps,
                                    lpRows->aRow[i].cValues,
                                    PR_EMAIL_ADDRESS );

                // TO DO: Create Information Store DN. Replace "myorgname"
                //        and "mysitename" with appropriate organization
                //        and site name.
                sprintf(pszServerDN,
                        "/o=myorgname/ou=mysitename/cn=servers/cn=%s%s",
                        pszServerName,"/cn=Microsoft Private MDB");

                if(FAILED(hr = HrMailboxLogon(lpMAPISession,
                                   lpMDB,pszServerDN,lpspv->Value.lpszA,
                                   &lpUserMDB)))
                {
                    MessageBox(0L,"Mailbox Not Available","Error",MB_OK);
                    return MAPI_E_NOT_FOUND;
                }
                else
                {
                    printf("Opened %s \n",lpspv->Value.lpszA);
                }
                // TO DO: ****** Place Mailbox Processing Here.
             }
          }
       }

       if(lpRows)
       {
          FreeProws(lpRows);
       }

       if(lpMailBoxTable)
       {
          lpMailBoxTable->Release();
       }

       if (FAILED(hr))
          return MAPI_E_NOT_FOUND;
       else
          return S_OK;
    }

Additional query words: kbDSupport kbMAPI100 kbMsg kbEDK500 kbEDK550
Version           : WINDOWS:1.0,5.0,5.5
Platform          : WINDOWS
Issue type        : kbhowto

Last Reviewed: October 22, 1998