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;