Gelöst: Exchange EWS und PHP SOAP

Das ist aber nicht erst seit gestern so. :smiley: Das ist schon seit V2.1 so.

Tja, dann siehst du jetz wie lange ich mich schon nicht mehr intensiv mit IPS beschäftigt habe :wink:

Ich hab in der Zwischenzeit mal die php_curl.dll gegen eine neuere Version ausgetauscht. Die vom Link auf der ersten Seite brachte die Fehlermeldung

>Erweiterung php_curl.dll nicht geladen. Version stimmt nicht überein: PHP: 5.3.1, EXT: 5.1.6

Das funktioniert jetzt. Aber die Fehlermeldung vom Script bleibt dieselbe :frowning:

Habe jetzt mal versucht ein paar Fehler nachzustellen komme aber nicht auf die von Dir gemeldeten.

Ich gehe einfach mal davon aus das Du die passenden Extension in der richtigen Version hast.

php_soap.dll (5.3.1) -> Ext-Verzeichnis
php_curl.dll (5.3.1) -> Ext-Verzeichnis
ssleay.dll (0.9.8.15) -> IP-Symcon-Verzeichnis

Die 3 Dateien:

messages.xsd
services.wsdl
types.xsd

aus deinem Exchange2007 oder 2010 in das Script-Verzeichnis.

Die service.wsdl vor der letzten Zeile um folgendes ergänzt.

 <wsdl:service name="ExchangeServices">
  <wsdl:port name="ExchangeServicePort" binding="tns:ExchangeServiceBinding">
   <soap:address location="https://sbs2008/EWS/Exchange.asmx"/>
  </wsdl:port>
 </wsdl:service>

der Servername muss natürlich deinem angepasst werden.

und in der Klasse 2x deine Benutzerdaten in Form der Emailadresse sowie des AD-Passwortes des entsprechenden Users eingetragen.

Ansonsten fällt mir jetzt auch nichts ein da mein System doch schon einige Zeit läuft und man dies allzu gerne wieder vergißt.:rolleyes:

Habe alles kontrolliert, die Fehlermeldung bleibt die Gleiche. Schade, werd mal weitergoogeln. Vielleicht finde ich noch etwas über die Fehlermeldung!

Oh Gott, ich hab den Fehler gefunden. Meine Dateien hatten die falsche Bezeichnung! Ich hatte die Dateierweiterungen ausgeblendet und meine 3 Files alle mit .xml abgespeichert. Deswegen wurden sie auch vom Script nicht gefunden.

So, jetzt mal schauen ob ich es ans Laufen bekomme!!

Leider nicht…mir bleibt noch diese Fehlermeldung übrig:

Notice:  Trying to get property of non-object in C:\IP-Symcon\scripts\30097.ips.php on line 50

Notice:  Trying to get property of non-object in C:\IP-Symcon\scripts\30097.ips.php on line 50

Notice:  Trying to get property of non-object in C:\IP-Symcon\scripts\30097.ips.php on line 50

Notice:  Trying to get property of non-object in C:\IP-Symcon\scripts\30097.ips.php on line 50

Notice:  Trying to get property of non-object in C:\IP-Symcon\scripts\30097.ips.php on line 50

Notice:  Trying to get property of non-object in C:\IP-Symcon\scripts\30097.ips.php on line 60
n

Die Fehlermeldung sagt eigentlich aus das in deinem abgefragten Zeitraum keine Daten vorhanden sind.

Sent from my iPhone using Tapatalk

Sonderbar. Ich habe in diesem Konto für diese Woche mal einige Termine zum Testen eingefügt, sollte also Termine geben die abgefragt werden können.

Zeig mir doch bitte einmal deine SOAP-Abfrage, insbesondere das Datum sollte es sich um einen Kalender handeln.

Hier mein Code, im Prinzip hab ich den von kpiep kopiert und halt bezüglich der Variablen angepasst:

<?

// Debug-Modus ein/aus
$debug = false;

// Pfad für Sprach- bzw. Erinnerungston
$path = IPS_GetKernelDir().'media/';

// Vorlauf der Kalenderansicht (heute plus x-Tage)
// Hilfs-Integervariable mit Profil anlegen - Assoziation 2, 7, 14 und 31 Tage

if($IPS_SENDER == "WebFront")
{
SetValue($IPS_VARIABLE, $IPS_VALUE);
 $vorlauf = $IPS_VALUE;
}
if(isset($IPS_VALUE)) {
 // NIX
} else {
 $vorlauf = 2;
 SetValue(46368 /*[ExchangeSync\Terminvorschau]*/, $vorlauf);
}

// Datum zusammensetzen der Startzeit für Abfrage Exchange
// alle Termine ab heute/jetzt
$s_jahr = date('Y');
$s_monat = date('m');
$s_tag   = date('j');
$s_start = $s_jahr."-".$s_monat."-".$s_tag."T00:00:01Z";
if($debug) { echo $s_start."
"; }

// Datum zusammensetzen der Endzeit für Abfrage Exchange
$s_EndDatum = time()+(60*60*24*$vorlauf);
$s_EndTag = date('d', $s_EndDatum);
$s_EndMonat = date('m', $s_EndDatum);
$s_EndJahr = date('Y', $s_EndDatum);
$s_ende = $s_EndJahr."-".$s_EndMonat."-".$s_EndTag."T23:59:59Z";
if($debug) { echo $s_ende."
"; }

// Klasse für den entsprechenden Benutzer laden
include "ipsuser.ips.php";

//SOAP-Anfrage an Exchange starten
$FindItem->Traversal = "Shallow";
$FindItem->ItemShape->BaseShape = "AllProperties";
$FindItem->ParentFolderIds->DistinguishedFolderId->Id = "calendar";
$FindItem->CalendarView->StartDate  = $s_start;
$FindItem->CalendarView->EndDate  = $s_ende;
$result = $client->FindItem($FindItem);
$calendaritems = $result->ResponseMessages->FindItemResponseMessage->RootFolder->Items->CalendarItem;

if($debug) { print_r($calendaritems); }


if(is_array($calendaritems))
{
foreach ($calendaritems as $item)
    {
//echo $item->Subject . "n";

 // Startzeit des Termines aus Exchange zerlegen für Anzeige in Datumsform (Unix-Timestamp)
 $stunde  = substr ( $item->Start, 11, 2 );
 $minute  = substr ( $item->Start, 14, 2 );
 $sekunde = substr ( $item->Start, 17, 2 );
 $tag     = substr ( $item->Start, 8, 2 );
 $monat   = substr ( $item->Start, 5, 2 );
 $jahr    = substr ( $item->Start, 0, 4 );

 // String für Anzeigedatum und Uhrzeit generieren und Zeitzone hinzufügen
 $unix = mktime ( $stunde+date('I')+1, $minute, $sekunde, $monat, $tag, $jahr );
 if(date('d.m.Y, H:i', $unix-(($item->ReminderMinutesBeforeStart)*60)) == date('d.m.Y, H:i', time())) {
 // WFC_SendNotification(28059 /*[Objekt #28059 existiert nicht]*/, "Terminwarnung", utf8_decode($item->Subject), "Glocke", 0);
        // WAC_PlayFile(30880 /*[Objekt #30880 existiert nicht]*/, $path."bell.wav");
      // In der kommenden Version wird der Termin vorgelesen
 }

 if($debug) { echo date ( 'd.m.Y, H:i', $unix) . ", " . utf8_decode($item->Subject)."<br>"; }
 if($debug) { echo $unix . "-". utf8_decode($item->Location) . "<br><br>"; }



 // Array für Anzeige in Stringvariable in Webfront erzeugen
 $ausgabe[$x] = date ( 'd.m.Y, H:i', $unix) . " Uhr - " . utf8_decode($item->Subject);
 $x++;
}
if($debug) { print_r($ausgabe); }

// Array für Webfront aufbereiten und in String-Variable schreiben
// die im Webfront angezeigt wird. Profil ~Textbox
//echo $ausgabe_wf;

$ausgabe_wf = implode("
", $ausgabe);
SetValueString(48066 /*[ExchangeSync\Termine]*/, $ausgabe_wf);

}
else{
//   echo $calendaritems->Subject . "n";
}

?>
<?
class NTLMSoapClient extends SoapClient {
    function __doRequest($request, $location, $action, $version) {
        $headers = array(
            'Method: POST',
            'Connection: Keep-Alive',
            'User-Agent: PHP-SOAP-CURL',
            'Content-Type: text/xml; charset=utf-8',
            'SOAPAction: "'.$action.'"',
        );
        $this->__last_request_headers = $headers;
        $ch = curl_init($location);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_POST, true );
        curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
        curl_setopt($ch, CURLOPT_USERPWD, $this->user.':'.$this->password);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        $response = curl_exec($ch);
        return $response;
    }
    function __getLastRequestHeaders() {
        return implode("n", $this->__last_request_headers)."n";
    }
}



class ExchangeNTLMSoapClient extends NTLMSoapClient {
    protected $user = 'mailadresse';
    protected $password = 'geheim';
}


class NTLMStream {
    private $path;
    private $mode;
    private $options;
    private $opened_path;
    private $buffer;
    private $pos;

    public function stream_open($path, $mode, $options, $opened_path) {
        echo "[NTLMStream::stream_open] $path , mode=$mode n";
        $this->path = $path;
        $this->mode = $mode;
        $this->options = $options;
        $this->opened_path = $opened_path;
        $this->createBuffer($path);
        return true;
    }

    public function stream_close() {
        echo "[NTLMStream::stream_close] n";
        curl_close($this->ch);
    }

    public function stream_read($count) {
        echo "[NTLMStream::stream_read] $count n";
        if(strlen($this->buffer) == 0) {
            return false;
        }
        $read = substr($this->buffer,$this->pos, $count);
        $this->pos += $count;
        return $read;
    }

    public function stream_write($data) {
        echo "[NTLMStream::stream_write] n";
        if(strlen($this->buffer) == 0) {
            return false;
        }
        return true;
    }

    public function stream_eof() {
        echo "[NTLMStream::stream_eof] ";
        if($this->pos > strlen($this->buffer)) {
            echo "true n";
            return true;
        }
        echo "false n";
        return false;
    }

    /* return the position of the current read pointer */
    public function stream_tell() {
        echo "[NTLMStream::stream_tell] n";
        return $this->pos;
    }

    public function stream_flush() {
        echo "[NTLMStream::stream_flush] n";
        $this->buffer = null;
        $this->pos = null;
    }

    public function stream_stat() {
        echo "[NTLMStream::stream_stat] n";
        $this->createBuffer($this->path);
        $stat = array(
            'size' => strlen($this->buffer),
        );
        return $stat;
    }

    public function url_stat($path, $flags) {
        echo "[NTLMStream::url_stat] n";
        $this->createBuffer($path);
        $stat = array(
            'size' => strlen($this->buffer),
        );
        return $stat;
    }

    /* Create the buffer by requesting the url through cURL */
    private function createBuffer($path) {
        if($this->buffer) {
            return;
        }
        echo "[NTLMStream::createBuffer] create buffer from : $pathn";
        $this->ch = curl_init($path);
        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($this->ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($this->ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
        curl_setopt($this->ch, CURLOPT_USERPWD, $this->user.':'.$this->password);
        echo $this->buffer = curl_exec($this->ch);
        echo "[NTLMStream::createBuffer] buffer size : ".strlen($this->buffer)."bytesn";
        $this->pos = 0;
    }
}


class ExchangeNTLMStream extends NTLMStream {
    protected $user = 'mailadresse';
    protected $password = 'geheim';
}


//verändert: erst wenn https registriert ist, unregistrieren
$existed = in_array("https", stream_get_wrappers());
if ($existed) {
    stream_wrapper_unregister("https");

    stream_wrapper_register('https', 'ExchangeNTLMStream') or die("Failed to register protocol");
    $wsdl = "services.wsdl";
    $client = new ExchangeNTLMSoapClient($wsdl);

    /* Do something with the web service connection */
    stream_wrapper_restore('https');
    }
    else {
        stream_wrapper_register('https', 'ExchangeNTLMStream') or die("Failed to register protocol");
        $wsdl = "services.wsdl";
        $client = new ExchangeNTLMSoapClient($wsdl);
}


?>

Kann mir jemand sagen wie ich den Fehler genauer eingrenzen könnte? Die Fehlermeldung sagt mir ja nicht gerade genau wo es hakt…

Sorry, aber im Moment kann ich Dir da auch nicht helfen.

Sent from my iPhone using Tapatalk

Schade! Das heisst aber die Scripts sind okay??

Schaut OK aus, ist ja auch meins.

Das einzige was Du noch probieren könntest ist die ganzen Variablen in der SOAP Anfrage durch feste Werte zu ersetzen damit evtl. Fehler ausgeschlossen werden.

Sent from my iPhone using Tapatalk

Habe hier aktuell das gleiche „Problem“ gehe davon aus die Meldung kommt oder heisst eher, dass das entsprechende Objekt welche die Verbindung darstellt gar nicht existiert, erstellt wurde weil irgendwo da etwas schiefläuft. Aktuell bruach ich die synch aber nicht wirklich oder dringend drumm bin ich da nicht so dolle drann. würde mir mal aber die methoden anschauen da gibts sicher welche die mehr zum verbindungststatus hergeben und wohl den Fehler besser beschreiben.

Schade, das Problem werde ich selber nicht lösen können. Vielleicht hilft mir ein Kollege, der kann wesentlich, nein viiiiiiiel besser programmieren als ich. Mal sehen…

Hallo Leute!

Habe das Script im Juli ans Laufen gebracht nachdem ich den User im include-Script auf das Format domäne\user geändert hatte. Dann hatte als funktioniert! Seit wir jetz August haben, bekomme ich diese Fehlermeldung:

2011-08-3T00:00:01Z
2011-08-5T23:59:59Z

Fatal error:  Uncaught SoapFault exception: [a:ErrorSchemaValidation] Fehler bei der Schemaüberprüfung der Anforderung: Das 'StartDate'-Attribut ist ungültig - Der Wert '2011-08-3T00:00:01Z' ist gemäß seinem Datentyp 'http://www.w3.org/2001/XMLSchema:dateTime' ungültig - Die Zeichenfolge '2011-08-3T00:00:01Z' kein gültiger XsdDateTime-Wert.. in C:\IP-Symcon\scripts\56659.ips.php:46
Stack trace:
#0 [internal function]: SoapClient->__call('FindItem', Array)
#1 C:\IP-Symcon\scripts\56659.ips.php(46): ExchangeNTLMSoapClient->FindItem(Object(stdClass))
#2 {main}
  thrown in C:\IP-Symcon\scripts\56659.ips.php on line 46

Jemand ne Idee wie das jetzt mit dem Monatswechsel zusammenhängen könnte?

Mach mal den Tag 2-stellig

Jope, das ist tatsächlich das Problem. Wenn ich eine 0 vor den einstelligen Tag mache, dann funktioniert es wieder. Das heisst immer wenn ich einstellig bin funktioniert es nicht! Warum hat das Problem sonst keiner bzw. wie kann ich es lösen?