Partager via


Détection de la version d’Exchange Server dans un profil Outlook

S’applique à : Outlook 2013 | Outlook 2016

Cette rubrique inclut un exemple de code en C++ qui montre comment utiliser la propriété PR_PROFILE_SERVER_VERSION et PR_PROFILE_SERVER_FULL_VERSION propriété pour obtenir les informations de version du Microsoft Exchange Server auquel le compte actif est connecté.

La GetProfileServiceVersion fonction dans l’exemple de code accepte un profil en tant que paramètre d’entrée. Selon que la propriété PR_PROFILE_SERVER_VERSION et la propriété PR_PROFILE_SERVER_FULL_VERSION existent ou non dans le profil donné, la fonction obtient chaque propriété et retourne les informations de version appropriées en tant que paramètres de sortie.

GetProfileServiceVersion appelle d’abord la fonction MAPIAdminProfiles pour créer un objet d’administration de profil. Il utilise ensuite l’objet d’administration de profil pour appeler IProfAdmin ::AdminServices afin d’obtenir un objet d’administration de service de message. À l’aide de l’objet d’administration du service de message, il appelle IMsgServiceAdmin ::OpenProfileSection pour obtenir une section du profil actuel, puis appelle HrGetOneProp pour vérifier si chacune des deux propriétés existe dans cette section du profil et, le cas échéant, définit les informations de version dans les paramètres de sortie appropriés.

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;