次の方法で共有


Outlook プロファイルで Exchange Server のバージョンを検出する

適用対象: Outlook 2013 | Outlook 2016

このトピックには、PR_PROFILE_SERVER_VERSION プロパティと PR_PROFILE_SERVER_FULL_VERSION プロパティを使用して、アクティブなアカウントが接続されているMicrosoft Exchange Serverのバージョン情報を取得する方法を示す C++ のコード サンプルが含まれています。

コード サンプルの関数は GetProfileServiceVersion 、入力パラメーターとしてプロファイルを受け入れます。 指定されたプロファイルに PR_PROFILE_SERVER_VERSION プロパティと PR_PROFILE_SERVER_FULL_VERSION プロパティが存在するかどうかに応じて、関数は各プロパティを取得し、適切なバージョン情報を出力パラメーターとして返します。

GetProfileServiceVersion 最初に MAPIAdminProfiles 関数を 呼び出して、プロファイル管理オブジェクトを作成します。 その後、プロファイル管理オブジェクトを使用して IProfAdmin::AdminServices を呼び出してメッセージ サービス管理オブジェクトを取得します。 メッセージ サービス管理オブジェクトを使用して、 IMsgServiceAdmin::OpenProfileSection を呼び出して現在のプロファイルのセクションを取得し、 HrGetOneProp を呼び出して、プロファイルのそのセクションに 2 つのプロパティのそれぞれが存在するかどうかを確認し、その場合は適切な出力パラメーターにバージョン情報を設定します。

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;