Ermitteln der Version des Exchange-Servers in einem Outlook-Profil
Gilt für: Outlook 2013 | Outlook 2016
Dieses Thema enthält ein Codebeispiel in C++, das zeigt, wie die eigenschaft PR_PROFILE_SERVER_VERSION und PR_PROFILE_SERVER_FULL_VERSION-Eigenschaft verwendet wird, um Versionsinformationen der Microsoft Exchange Server abzurufen, mit der das aktive Konto verbunden ist.
Die GetProfileServiceVersion
Funktion im Codebeispiel akzeptiert ein Profil als Eingabeparameter. Je nachdem, ob die PR_PROFILE_SERVER_VERSION-Eigenschaft und die PR_PROFILE_SERVER_FULL_VERSION-Eigenschaft im angegebenen Profil vorhanden sind, ruft die Funktion jede Eigenschaft ab und gibt die entsprechenden Versionsinformationen als Ausgabeparameter zurück.
GetProfileServiceVersion
ruft zuerst die MAPIAdminProfiles-Funktion auf, um ein Profilverwaltungsobjekt zu erstellen. Anschließend wird das Profilverwaltungsobjekt verwendet, um IProfAdmin::AdminServices aufzurufen, um ein Nachrichtendienstverwaltungsobjekt abzurufen. Mithilfe des Nachrichtendienstverwaltungsobjekts wird IMsgServiceAdmin::OpenProfileSection aufgerufen, um einen Abschnitt des aktuellen Profils abzurufen, und dann HrGetOneProp aufgerufen, um zu überprüfen, ob jede der beiden Eigenschaften in diesem Abschnitt des Profils vorhanden ist, und legt die Versionsinformationen in den entsprechenden Ausgabeparametern fest.
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;