Sonntag, Januar 20, 2008

Exchange 2007 Webservice Zugriff mit VS 2008

Ich hab mich am Wochenende mit Exchange 2007 WebService Zugriff beschäftigt. Ich habe dazu auch einige nette Guides gefunden im Internet, unter anderem von Eric Lee. Meine Versuche gestalteten sich allerdings etwas schwieriger. Ich wollte alles mit Visual Studio 2008 machen, allerdings basiert hier alles auf WCF. Die generierten Proxy-Klassen sich komplett anders aus, so dass die Beschreibungen nicht ganz halfen.

Zu erst musste ich mal meine Konfigurationsdatei hinbiegen, irgendwann sah die Datei so aus:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
      <client>
        <endpoint name="CapeVisionExchange" address="https://mail.capevision.net/EWS/Exchange.asmx" binding="basicHttpBinding" bindingConfiguration="ExchangeServiceBinding" contract="ExchangeWebServices.ExchangeServicePortType" behaviorConfiguration="ServiceAuth">
        </endpoint>
      </client>
      <behaviors>
        <endpointBehaviors>
          <behavior name="ServiceAuth">
            <clientCredentials >
              <windows allowNtlm="true" allowedImpersonationLevel="Identification"/>
            </clientCredentials>
          </behavior>
        </endpointBehaviors>
      </behaviors>
        <bindings>
            <basicHttpBinding>
                <binding name="ExchangeServiceBinding" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="Transport">
                      <transport clientCredentialType="Ntlm" proxyCredentialType="None" />
                      <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
    </system.serviceModel>

</configuration>

Das war nicht mehr mit den alten WebService-Kenntnissen vergleichbar, allerdings es funktioniert.

Ich habe anschließend versucht mich nahe an dem Beispiel entlang zu hangeln, aber irgendwie war alles anders. Letztendlich habe ich es geschafft und einen Aufruf hinbekommen.  ExpandDL ist zur Abfrage von Distribution Lists (Verteiler) gedacht, eine komplette Dokumentation der WebServices gibt es in der MSDN. Nun aber mein Code-Brocken.
ExpandDLType dl = new ExpandDLType();
EmailAddressType addr = new EmailAddressType();
addr.EmailAddress = "<email>@capevision.de";
dl.Mailbox = addr;
ExchangeServicePortTypeClient exchange = new ExchangeServicePortTypeClient();
exchange.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
ExpandDLResponseType resp;
exchange.ExpandDL(null, null, "de-DE", null, dl, out resp);

Die Rückgabe der Methode enthält den Response und auch alle Nutzer der Liste. Aber am besten mal selber ausprobieren.

Mein zweiter Versuch zielte dann auf die Suche nach bestimmten Mail-Items, allerdings bin ich hier noch nicht glücklich. Ich habe 20 Zeilen Code (eine Übertreibung) und noch immer keine Ergebnisse. Am leichtesten hat sich die Entwicklung mit dem durchstöbern der Proxy-Klasse gemacht und immer wieder probieren. Fehlermeldung lesen, meist wird die Basisklasse genannt, anschließend in der Proxy-Klasse suchen und dann versuchen weiterzukommen. Meist beginnt der Prozess wieder von vorn. Nicht desto trotz hier mal der Code bisher: (bekomme keine Ergebnisse)
FindItemType item = new FindItemType();
item.Traversal = ItemQueryTraversalType.Shallow;
item.ItemShape = new ItemResponseShapeType();
item.ItemShape.BaseShape = new DefaultShapeNamesType();
item.ItemShape.BodyTypeSpecified = true;
item.ItemShape.BaseShape = DefaultShapeNamesType.Default;
GroupByType g = new GroupByType();
g.Order = SortDirectionType.Ascending;
item.Item1 = g;
PathToUnindexedFieldType u = new PathToUnindexedFieldType();
u.FieldURI = UnindexedFieldURIType.itemParentFolderId;
g.Item = u;
g.AggregateOn = new AggregateOnType();
g.AggregateOn.Aggregate = AggregateType.Minimum;
g.AggregateOn.Item = u;
item.Restriction = new RestrictionType();
ContainsExpressionType c = new ContainsExpressionType();
c.ContainmentMode = ContainmentModeType.Substring;
c.ContainmentComparison = ContainmentComparisonType.IgnoreCase;
PathToUnindexedFieldType pi = new PathToUnindexedFieldType();
pi.FieldURI = UnindexedFieldURIType.itemSubject;
c.Item = pi;
c.Constant = new ConstantValueType();
c.Constant.Value = "Test";
item.Restriction.Item = c;
IndexedPageViewType i = new IndexedPageViewType();
i.Offset = 0;
i.MaxEntriesReturned = 10;
item.Item = i;
DistinguishedFolderIdType id = new DistinguishedFolderIdType();
id.Id = DistinguishedFolderIdNameType.inbox;
item.ParentFolderIds = new BaseFolderIdType[] { id };
item.SortOrder = new FieldOrderType[1];
item.SortOrder[0] = new FieldOrderType();
item.SortOrder[0].Order = SortDirectionType.Ascending;
item.SortOrder[0].Item = pi;
ExpandDLType dl = new ExpandDLType();
EmailAddressType addr = new EmailAddressType();
addr.EmailAddress = "<email>@capevision.de";
dl.Mailbox = addr;
ExchangeServicePortTypeClient exchange = new ExchangeServicePortTypeClient();
exchange.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
FindItemResponseType findResp;
exchange.FindItem(null, null, Thread.CurrentThread.CurrentUICulture.ToString(), null, item, out findResp);
Console.WriteLine(resp.ToString());

Sonntag, Januar 13, 2008

VMWare ESX 3.5 Windows AD

Diese Woche waren noch mal eher Support Themen zu bearbeiten. Allerdings war der Freitag sehr interessant, wir haben die Entscheidung für VMWare ESX als Betriebssystem für unsere neuen Server (jeder 2*Quad Core mit 14GB Ram) gemacht. Nach dem die Entscheidung gefallen war, haben wir den ersten Server mit VMWare ESX installiert (momentan nur als Trial). Die Einrichtung lief recht Problemlos, abgesehen von einem Tastatur und Bildschirmproblem. Wie bei vielen Linux Installationen, hab es Probleme auf unserer Console mit der Anzeige, so dass ein guter alter Monitor her musste. Bei der Tastatur haben wir es richtig getroffen. Wir haben an der Server Console Englisches Tastaturlayout, eigentlich ist das noch kein Problem, allerdings versucht mal eine Pipe einzugeben.

Nach der Installation wollten wir den ESX mit dem AD Verbinden, schließlich will keiner die Nutzer doppelt pflegen. Um den Rechner ins AD zu bekommen, haben wir folgende Schritte durchführen müssen:

1.       Auf dem DC: Rechneraccount in der Domaine anlegen und „Pre-Windows 2000 Computer“ setzen.

2.       Auf dem DC: KTPASS aus den Windows Support-Tools ausführen “ ktpass.exe -princ HOST/<DC>@<FQDN DOMAIN in Großschrift> -mapuser <NETBIOS DOMAIN>\<HOST>$ -crypto all -pass <PW> -ptype KRB5_NT_PRINCIPAL -out <FILE>

3.       Im ESX: Remote SSL aktivieren. (bei uns für Root) Dazu muss man die /etc/ssh/sshd_conf editieren und „PermitRootLogin = yes“ setzen

4.       Im ESX: Restart SSH Dienst „service sshd restart

5.       Im ESX: “esxcfg-auth --enablead --addomain=<DOMAIN> --addc=<FQDN DC>” noch einige Details gibt es hier.

6.       Im ESX: „Adduser<name>

7.       Eventuell noch die Firewall auf dem ESX anpassen, das kann über die Virtual Infrastructure Console geschehen.

Was uns so nicht bewusst war, wir brauchen noch einen Windows Server um den Virtual Infrastructure Server aufzusetzen und wirklich die volle Funktionalität nutzen zu können. Ich denke mal, dazu nächste Woche mehr.

Nette ausführliche Anleitung und Tipps zur AD-Integration gibt es hier. Hier der Guide von VMWare. Hier auch noch eine Liste mit weiteren wichtigen Befehlen des ESX-Servers.

Für de nächsten 50 Tage haben wir so erst mal 2 ESX Server zum testen, vermutlich werden wir die Server danach mit dem Licencekey bestücken. Dann bis ich mehr von der VMWare Front habe.

Unsere neuen Server haben nur ein einziges Problem, wir haben keine ausreichende Klimaanlage, so dass Server nicht die ganze Zeit an bleiben dürfen, aber auch dafür werden wir eine Lösung finden. Ein Freund hatte mal bei seinem Rechner einen Ventilator daneben gestellt. Hat immerhin funktioniert. Vielleicht machen wir das auch noch ;)

Samstag, Januar 05, 2008

2 Foliensätze zu SVN/TRAC

Das Neue Jahr ist da und viel habe ich in der ersten Woche nicht viel an technischen News parat, habe die Woche viel Support gemacht. Ich habe die Woche für einige Kollegen einen Crashkurs zur Nutzung von SVN/TRAC gehalten. Für den Kurs habe ich als Intro einen alten Vortrag recycled. Hier die beiden Vorträge:

·         Subversion-Tortoise-Svn-Crashkurs

·         Trac-Svn-Vss

Ansonsten kann ich nächste Woche nur den Techtalk zum Thema Ajax empfehlen. Termin und Ort findet ihr auf der Microsoft Seite.

Ich bin die Woche auch Schritt-für-Schritt mit meinen Sharepoint Authentification-/Authorization-Problem weitergekommen. Irgendwas läuft in meinem Custom-Code, der bereits durch einen Kollegen umgeschrieben wurde immer noch schief. Wahrscheinlich werde ich alles wegschmeißen, googlen und alles neu machen.