Exchange GAL Export kliens oldalról

Azt kell mondjam, hogy most jól érzem magam. Több hónapnyi rendszergazdai favágás után végre megint képes voltam némi programozgatásra. Az elmúlt hónapokban se időm se energiám nem volt erre. Nagyjából egy hete felmerült egy kérdés a levlistán. Némi kérdezősködés után a véglegesen megfogalmazott feladat valahogy így nézett ki:
Ki kellene exportálni az Exchange Global Address List-et egy Outlook Contact folderbe, kliens oldalon.
Gondoltam, ez egy igen egyszerű feladat, egy fél óra alatt összedobok rá egy scriptet és végeztem.
Gyorsan meg is csináltam a dolg vázát. Ugye előveszünk egy Outlook.Application objectet, ennek az AddressLists property-jéből kikeressük a Global Address Listet, végigmegyünk az elemein és első körben kiíratjuk a nevet és az e-mail címet.
És ekkor jött egy nagyméretű pofon. Az e-mail cím nem az SMTP címet tartalmazza amire szükségünk lenne, hanem az Exchange címet (ha minden igaz LDAP formában). Puff. Ez nekünk nem lesz jó, mert semmit sem tudunk kezdeni vele. Kezdett derengeni, hogy valami ilyesmibe régebben már belefutottam valahol, és akkor nem oldottam meg mert nem volt fontos.
Most továbbgondoltam az ügyet. Rájöttem, hogy az Outlook objektum modelben nem terem babér számomra, mert a kívánt információt nem tartalmazza.
Elővettem a jó öreg CDO 1.21-et ahol az AddressEntry objektumnak a az Outlook AddressEntry objektum property-jein  túl van egy Fields property-je is (ADODB.Fields objektum). Ebben a Fields-ben az elemek elvileg három féle módon szólíthatók meg:
– Egyszerű enumerációval
– A MAPI Property tag azonosítóval
– Névvel
Az első módszerrel az a baj, hogy ugyan megtaláltam benne minden szükséges érteket, de a pozíció nem fix, mert egy-egy GAL bejegyzésnek különböző számú tulajdonsága van, így nem tudható, hogy egy általunk keresett érték melyik pozición található.
A harmadik módszerrel az a gond, hogy semmiféle leírást sem találtam, és ha az első módszerrel a mezők nevét is kiiratom, nem csak az értékét akkor minden egyes mezőre egy-egy nagy büdös üres string-et kapok.
Maradt a második módszer. Elővettem a MAPITags.h fájlt és megpróbáltam kivadászni, hogy vajon melyik tag tartalmazhatja az általam áhított e-mail címet. Néhány próbálkozás után rájöttem, hogy ez a módszer nem célravezető. Nem találtam meg amit kerestem.
Arra gondoltam, hogy végigmegyek az összes lehetséges tag-en 0x0001-től 0xFFFF-ig adattipusnak pedig 0x001E-t (string) állítok be. Meg is találtam a kódot amit kerestem: 0x39FE. Nagy meglepetésemre azt tapasztaltam, hogy ez a MAPITags.h fájlban nincs benne (hurrá, nem dokumentált, de nekem jó lesz).
Ezekkel az információkkal felszerelkezve, sikerült megoldanom a problémát. Ez a dolog rávilágított még egy ügyre. Lehet, hogy ezek alapján képes leszek megoldani, hogy az Alternatív feladó nevű scriptkupacom (http://www.gomori.hu/as_hu.htm) képes legyen RPC over HTTP-n is működni, de ez egy későbbi történet.
Most itt van a script amit elkövettem:
/* 
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, 
EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED 
WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. 

This code is free for both personal and commercial use, but you are 
expressly forbidden from selling. 
************************************************************************** 

FILE NAME: 
eg.js 

DESCRIPTION: 
This Extract GAL script is used to export the contents of the Global Address List to an 
Outlook contact folder 

RECOMENDATION: 

SYSTEM REQUIREMENTS: 
Microsoft Outlook 

COPYRIGHT: 
Copyright (c) Zoltán Gömöri. 2005. 
All rights reserved. 

NOTES: 
The original version of this source code and the article that 
includes this source code can be found at: 
http://www.gomori.hu 

CREATED: 
2005.12.14 

LAST MODIFIED: 
2005.12.20 

VERSION: 
v1.0 Build 1 

TO DO: 
Find a better way to identify the GAL 

************************************************************************** 
*/ 

// declare "constants" 

// MAPI Constants 
var PR_GIVEN_NAME = 0x3A06001E; 
var PR_SURNAME = 0x3A11001E; 
var PR_MAIL = 0x39FE001E; 

// Outlook constants 
var olFolderContacts = 10; 
var olContactItem = 2; 

// Script parameters 
var GALName = "Global Address List"; 
var GALTargetFolder = "GAL"; 

// Create a CDO v1.21 Session 
CDOSession = new ActiveXObject("MAPI.Session"); 

// Link to the active Session 
CDOSession.Logon(null,null,false,false,0); 

// Get the Address Lists 
CDOALS = CDOSession.AddressLists; 

// Find the Global Address List 
for(i=1;i<CDOALS.Count;i++) 
{ 
    if(CDOALS.Item(i).Name == GALName) 
        GAL = CDOALS.Item(i); 
} 

// Connect to the running Outlook 
OLApplication = new ActiveXObject("Outlook.Application"); 
OLNameSpace = OLApplication.GetNameSpace("MAPI"); 

// Find the root Contacts folder 
OLContactRoot = OLNameSpace.GetDefaultFolder(olFolderContacts); 

// Open the folder for storing the GAL addreses 
OLGALFolder = OLContactRoot.Folders(GALTargetFolder); 

// Walk through the GAL 
for(i=1;i<GAL.AddressEntries.Count;i++) 
{ 
    // Create a contact item 
    ContactItem = OLGALFolder.Items.Add(olContactItem); 

    // Store the contact parameters from the GAL to the contact item 
    ContactItem.FullName = GAL.AddressEntries.Item(i).Name.replace(/"/g,""); 
    FName = ""; 
    LName = ""; 
    try 
    { 
        FName = GAL.AddressEntries.Item(i).Fields(PR_GIVEN_NAME).Value; 
        LName = GAL.AddressEntries.Item(i).Fields(PR_SURNAME).Value; 
        ContactItem.FirstName = FName; 
        ContactItem.LastName = LName; 
    } 
    catch(e) {} 
    ContactItem.Email1Address = GAL.AddressEntries.Item(i).Fields(PR_MAIL).Value; 
    // Save the contact item 
    ContactItem.Save(); 
}
 
Kategória: Exchange | Közvetlen link a könyvjelzőhöz.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s