XCLN: Como recuperar o horário do último logon dos usuários do Exchange usando Extended MAPI

Traduções deste artigo Traduções deste artigo
ID do artigo: 259570 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Convém recuperar informações sobre caixas de correio, como o último tempo de logon e logoff última vez. Você pode fazer isso, fazer logon no armazenamento de informações particulares com uma conta com privilégios, loop através da lista de caixas de correio e abertura PR_LAST_LOGON_TIME, PR_LAST_LOGOFF_TIME em cada linha da tabela da caixa de correio.

Mais Informações

O exemplo de código a seguir ilustra como recuperar a última hora de logon de cada caixa de correio em um computador Exchange 2000 Server ou um Exchange Server 5.5. HrGetServerDN é chamado para obter o nome distinto (DN) de um computador com Exchange Server 5.5 ou o herdados Exchange Server DN (legacyExchangeDN) de um computador Exchange 2000 Server. O DN é então passado para IExchangeManageStore::GetMailboxTable para obter uma lista de tabelas de caixa de correio.

Compile Este exemplo de código com a opção Ignorar todas as bibliotecas padrão na guia link no caixa de diálogo configurações do projeto. Você também deve usar as seguintes bibliotecas:
  • Version.lib
  • Exchsdk.lib
  • Mapi32.lib
  • Edkutils.lib
  • Edkmapi.lib
  • Msvcrt.lib

Código de exemplo

    
#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("\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))
   {
      printf("MAPI Logon failed\n");
   }

   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\n");

   }

   if(lpSess)
      lpSess->Release();

}

HRESULT OpenMailbox(LPMAPISESSION lpMAPISession, LPSTR pszServerName)
{
   HRESULT      hr            = S_OK;
   LPMAPITABLE	lpMailBoxTable = NULL;
   LPSRowSet	lpRows         = NULL;
   LPMDB		lpMDB         = NULL;
   LPEXCHANGEMANAGESTORE lpIManageStore = NULL;

   SYSTEMTIME  sLogonSystemTime     =   {0}; 
   SYSTEMTIME  sLogonLocalTime	    =   {0};

   BOOL        fSucceeded      =   FALSE;      

   // need to pass this array to HrQueryAllRows on lpMailBoxTable 
   SizedSPropTagArray(12, Columns) = 
   {
	   12,
	   {
		   PR_DISPLAY_NAME, PR_EMAIL_ADDRESS, PR_NT_USER_NAME, PR_CONTENT_COUNT,
		   PR_LOCALE_ID, PR_MESSAGE_SIZE, PR_MESSAGE_SIZE_EXTENDED,
		   PR_ASSOC_CONTENT_COUNT, PR_LAST_LOGON_TIME, PR_LAST_LOGOFF_TIME,
		   PR_STORAGE_LIMIT_INFORMATION, PR_INSTANCE_KEY 
	   }
   };
	
	LPMAPIPROP		pmp	= NULL;
	LPSPropValue	         pVal	= NULL;
	ULONG			ulObjType	   = NULL;

   if (FAILED(hr = HrOpenExchangePrivateStore(lpMAPISession, &lpMDB)))
   {
      printf("Message Store Not Available\n");
      return MAPI_E_NOT_FOUND;
   }

   if (FAILED(hr = lpMDB->QueryInterface(IID_IExchangeManageStore,
                            (void **) &lpIManageStore)))
   {
      printf("QueryInterace Failed\n");
      return MAPI_E_NOT_FOUND;
   }

   LPSTR pszServerDN; 

   // we need to use Exchange 2000 legacyExchangeDN 
   if (FAILED(hr = HrGetServerDN(lpMAPISession, &pszServerDN)))
   {
	   printf("HrGetServerDN Failed\n");
	   return MAPI_E_NOT_FOUND;
   }

   printf("Server DN: %s\n", pszServerDN);


   if (FAILED(hr = lpIManageStore->GetMailboxTable(pszServerDN,
                                    &lpMailBoxTable,0)))
   {
      printf("Mailbox Table Not Available\n");
      return MAPI_E_NOT_FOUND;
   }

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

   if(SUCCEEDED(hr))
   {
      if (lpRows->cRows > 0)
      {
         for (UINT i=0; i < lpRows->cRows; i++)
         {
			printf("\n\nNumber of properties: %d\n", lpRows->aRow[i].cValues);

			LPSPropValue lpDNspv = PpropFindProp(
                                lpRows->aRow[i].lpProps,
                                lpRows->aRow[i].cValues,
                                PR_DISPLAY_NAME );
			 printf("Display Name: %s\n", lpDNspv->Value.lpszA);

			LPSPropValue lpspv = PpropFindProp(
                                lpRows->aRow[i].lpProps,
                                lpRows->aRow[i].cValues,
                                PR_EMAIL_ADDRESS );
			printf("Email Address: %s\n", lpspv->Value.lpszA);


			LPSPropValue lpNTUSERspv = PpropFindProp(
                                lpRows->aRow[i].lpProps,
                                lpRows->aRow[i].cValues,
                                PR_NT_USER_NAME );
			 printf("NT User: %s\n", lpNTUSERspv->Value.lpszA);


			LPSPropValue lpLastLogonTimespv = PpropFindProp(
                                lpRows->aRow[i].lpProps,
                                lpRows->aRow[i].cValues,
                                PR_LAST_LOGON_TIME );

			fSucceeded = FileTimeToSystemTime(&(lpLastLogonTimespv->Value.ft), &sLogonSystemTime);
			if (fSucceeded)
			{
				TIME_ZONE_INFORMATION tzi; 
				GetTimeZoneInformation(&tzi); 
				SystemTimeToTzSpecificLocalTime(&tzi, &sLogonSystemTime, &sLogonLocalTime);
				printf("PR_LAST_LOGON_TIME : %2.2d/", sLogonLocalTime.wMonth);
			         printf("%2.2d/", sLogonLocalTime.wDay);
				printf("%2.2d  ", sLogonLocalTime.wYear);
				printf("%2.2d:", sLogonLocalTime.wHour);
				printf("%2.2d\n", sLogonLocalTime.wMinute);
			}

			LPSPropValue lpLocaleIDspv = PpropFindProp(
                                lpRows->aRow[i].lpProps,
                                lpRows->aRow[i].cValues,
                                PR_LOCALE_ID );
			 printf("PR_LOCALE_ID: %u\n", lpLocaleIDspv->Value.ul);

			LPSPropValue lpMessageSizespv = PpropFindProp(
                                lpRows->aRow[i].lpProps,
                                lpRows->aRow[i].cValues,
                                PR_MESSAGE_SIZE );
			 printf("PR_MESSAGE_SIZE: %u\n", lpMessageSizespv->Value.ul);

			LPSPropValue lpMessageSizeExtendedspv = PpropFindProp(
                                lpRows->aRow[i].lpProps,
                                lpRows->aRow[i].cValues,
                                PR_MESSAGE_SIZE_EXTENDED );
			 printf("PR_MESSAGE_SIZE_EXTENDED: not known\n");//, lpDNspv->Value.lpszA);

			LPSPropValue lpAssocContentCountspv = PpropFindProp(
                                lpRows->aRow[i].lpProps,
                                lpRows->aRow[i].cValues,
                                PR_ASSOC_CONTENT_COUNT );
			 printf("PR_ASSOC_CONTENT_COUNT: %u\n", lpAssocContentCountspv->Value.ul);
	

			LPSPropValue lpStorageLimitInfospv = PpropFindProp(
                                lpRows->aRow[i].lpProps,
                                lpRows->aRow[i].cValues,
                                PR_STORAGE_LIMIT_INFORMATION );
			 printf("PR_STORAGE_LIMIT_INFORMATION: %u\n", lpStorageLimitInfospv->Value.ul);	
			

			 LPSPropValue lpCountspv = PpropFindProp(
                                lpRows->aRow[i].lpProps,
                                lpRows->aRow[i].cValues,
                                PR_CONTENT_COUNT );
			 printf("Content Count: %u\n", lpCountspv->Value.ul);

         }
      }
   }

   if(lpRows)
   {
      FreeProws(lpRows);
   }

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

   if (FAILED(hr))
      return MAPI_E_NOT_FOUND;
   else
      return S_OK;
}
				
Microsoft fornece exemplos de programação apenas para ilustração, sem garantia expressa ou implícita, incluindo, mas não se limitando às garantias implícitas de comercialização e/ou adequação a uma finalidade específica. Este artigo presume que você esteja familiarizado com a linguagem de programação demonstrada e as ferramentas usadas para criar e depurar procedimentos. Profissionais de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas eles não modificarão esses exemplos para fornecer funcionalidades adicionais ou construir procedimentos para atender às suas necessidades específicas.
Se você não tenha muita experiência de programação, talvez queira em contato com um Microsoft Certified Partner ou Microsoft Advisory Services. Para obter mais informações, visite da Microsoft:

Microsoft Certified Partners - https://partner.microsoft.com/global/30000104

Comunicado de Microsoft Services - http://support.microsoft.com/gp/advisoryservice

Para obter mais informações sobre as opções de suporte estão disponíveis e sobre como entrar em contato com a Microsoft, visite o seguinte site: http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMS

Propriedades

ID do artigo: 259570 - Última revisão: domingo, 23 de fevereiro de 2014 - Revisão: 7.3
A informação contida neste artigo aplica-se a:
  • Microsoft Exchange 2000 Server Standard Edition
  • Microsoft Exchange Server 5.5 Standard Edition
  • Microsoft Exchange Development Kit 5.5
  • Microsoft Exchange Server 2003 Software Development Kit
  • Microsoft Messaging Application Programming Interface
Palavras-chave: 
kbnosurvey kbarchive kbmt kbinfo KB259570 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 259570

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com