Compartir a través de


Detectar la versión de Exchange Server en un perfil de Outlook

Hace referencia a: Outlook 2013 | Outlook 2016

En este tema se incluye un ejemplo de código en C++ que muestra cómo usar la propiedad PR_PROFILE_SERVER_VERSION y PR_PROFILE_SERVER_FULL_VERSION propiedad para obtener información de versión de la Microsoft Exchange Server a la que está conectada la cuenta activa.

La GetProfileServiceVersion función del ejemplo de código acepta un perfil como parámetro de entrada. En función de si la propiedad PR_PROFILE_SERVER_VERSION y la propiedad PR_PROFILE_SERVER_FULL_VERSION existen en el perfil determinado, la función obtiene cada propiedad y devuelve la información de versión adecuada como parámetros de salida.

GetProfileServiceVersion primero llama a la función MAPIAdminProfiles para crear un objeto de administración de perfiles. A continuación, usa el objeto de administración de perfiles para llamar a IProfAdmin::AdminServices para obtener un objeto de administración del servicio de mensajes. Con el objeto de administración del servicio de mensajes, llama a IMsgServiceAdmin::OpenProfileSection para obtener una sección del perfil actual y, a continuación, llama a HrGetOneProp para comprobar si cada una de las dos propiedades existe en esa sección del perfil y, si es así, establece la información de versión en los parámetros de salida adecuados.

TZDEFINITION* BinToTZDEFINITION(ULONG cbDef, LPBYTE lpbDef) 
{ 
    if (!lpbDef) return NULL; 
 
    // Update this if parsing code is changed. 
    // This checks the size up to the flag member. 
    if (cbDef < 2*sizeof(BYTE) + 2*sizeof(WORD)) return NULL; 
 
    TZDEFINITION tzDef = {0}; 
    TZRULE* lpRules = NULL; 
    LPBYTE lpPtr = lpbDef; 
    WORD cchKeyName = NULL; 
    WCHAR* szKeyName = NULL; 
    WORD i = 0; 
 
    BYTE bMajorVersion = *((BYTE*)lpPtr); 
    lpPtr += sizeof(BYTE); 
    BYTE bMinorVersion = *((BYTE*)lpPtr); 
    lpPtr += sizeof(BYTE); 
 
    // We only understand TZ_BIN_VERSION_MAJOR 
    if (TZ_BIN_VERSION_MAJOR != bMajorVersion) return NULL; 
 
    // We only understand if >= TZ_BIN_VERSION_MINOR 
    if (TZ_BIN_VERSION_MINOR > bMinorVersion) return NULL; 
 
    lpPtr += sizeof(WORD); 
 
    tzDef.wFlags = *((WORD*)lpPtr); 
    lpPtr += sizeof(WORD); 
 
    if (TZDEFINITION_FLAG_VALID_GUID & tzDef.wFlags) 
    { 
        if (lpbDef + cbDef - lpPtr < sizeof(GUID)) return NULL; 
        tzDef.guidTZID = *((GUID*)lpPtr); 
        lpPtr += sizeof(GUID); 
    } 
 
    if (TZDEFINITION_FLAG_VALID_KEYNAME & tzDef.wFlags) 
    { 
        if (lpbDef + cbDef - lpPtr < sizeof(WORD)) return NULL; 
        cchKeyName = *((WORD*)lpPtr); 
        lpPtr += sizeof(WORD); 
        if (cchKeyName) 
        { 
            if (lpbDef + cbDef - lpPtr < (BYTE)sizeof(WORD)*cchKeyName) return NULL; 
            szKeyName = (WCHAR*)lpPtr; 
            lpPtr += cchKeyName*sizeof(WORD); 
        } 
    } 
 
    if (lpbDef+ cbDef - lpPtr < sizeof(WORD)) return NULL; 
    tzDef.cRules = *((WORD*)lpPtr); 
    lpPtr += sizeof(WORD); 
    if (tzDef.cRules) 
    { 
        lpRules = new TZRULE[tzDef.cRules]; 
        if (!lpRules) return NULL; 
 
        LPBYTE lpNextRule = lpPtr; 
        BOOL bRuleOK = false;