nordicmike
Goto Top

Mit PHP autodiscover Antwort auslesen

Moin zusammen,

ich möchte unter PHP die Antwort eines Exchange Servers in eine Variable abspeichern.

Unter Powershell würde es recht einfach gehen:

$response = Invoke-WebRequest "https://ex1.meinedomain.de/Autodiscover/Autodiscover.xml" -Method "POST" -Headers $headers -Body $body -Credential $Cred  

Jedoch, wie würde der Code unter PHP aussehen?

mit wget? mit curl?

Vielen Dank in Voraus and keep rockin'

Der Mike

Content-ID: 4231460013

Url: https://administrator.de/contentid/4231460013

Printed on: October 5, 2024 at 04:10 o'clock

LordGurke
Solution LordGurke Oct 11, 2022 at 08:46:57 (UTC)
Goto Top
Müsste gehen mit
$xml = new SimpleXMLElement('https://ex1.meinedomain.de/Autodiscover/Autodiscover.xml', null, true);  

Dann hast du in $xml ein Objekt mit dem auf die einzelnen Zweige zugreifen kannst.
NordicMike
NordicMike Oct 11, 2022 at 08:50:01 (UTC)
Goto Top
Danke erstmal, da fehlt jedoch dann die Authentifizierung usw...
LordGurke
Solution LordGurke Oct 11, 2022 at 08:53:53 (UTC)
Goto Top
Ups, das hatte ich übersehen...
Wenn es Basic-Auth ist, könnte es reichen, das Inline in der URL mitzugeben, also https://user:pass@ex1...
NordicMike
NordicMike Oct 11, 2022 at 09:26:12 (UTC)
Goto Top
So einfach... Jetzt hänge ich jedoch daran, das der FreeBSD apache mit php 7.4 das simplexml nicht kennt :c)
Ausser Hürden nur noch Hürden...
Dani
Solution Dani Oct 11, 2022 at 09:42:43 (UTC)
Goto Top
Moin
in den Fall fehlt noch das Module php7.4.-xml.
Vor der Installation natürlich noch kurz mit php -m verifizieren.


Gruß,
Dani
colinardo
Solution colinardo Oct 11, 2022 updated at 11:12:33 (UTC)
Goto Top
Servus,
<?php
// uncomment for debugging
// error_reporting(E_ALL);
// ini_set('display_errors','On'); 

$email = 'user@domain.tlld';  
$username = 'DOMAIN\user';  
$password = 'Passw0rd';  
$domain = 'domain.tld';  

$body = <<<EOF
<?xml version="1.0" encoding="utf-8" ?>  
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006">  
  <Request>
    <EMailAddress>$email</EMailAddress>
    <AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema>
  </Request>
</Autodiscover>
EOF;

$ch = curl_init("https://$domain/Autodiscover/Autodiscover.xml");  
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,$body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERNAME, $username);
curl_setopt($ch, CURLOPT_PASSWORD, $password);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml',"X-User-Identity: $email","X-AnchorMailbox: $email"));  
if ( !($result = curl_exec($ch)) ) {
echo "CURL REQUEST ERROR (" . curl_getinfo($ch,CURLINFO_RESPONSE_CODE ) .') : ' . curl_error($ch);  
  curl_close($ch);
  exit;
}
curl_close($ch);
$xml = new SimpleXMLElement($result);
var_dump($xml);
?>
Das Skript geht davon aus das Zertifikat und Common-Name/SANs gültig sind und zur Domain passen. Wenn dass nicht der Fall ist dann müssen zwei Parameter angepasst werden
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
Dann werden auch nicht passende SSL-Zertifikate akzeptiert.
Bei Bedarf auch die AUTH Methode CURLOPT_HTTPAUTH anpassen (CURLAUTH_BASIC, CURLAUTH_DIGEST, CURLAUTH_GSSNEGOTIATE, CURLAUTH_NTLM, CURLAUTH_ANY, und CURLAUTH_ANYSAFE)

Grüße Uwe
NordicMike
NordicMike Oct 11, 2022 at 09:57:30 (UTC)
Goto Top
php -m meldet, dass SimpleXML installiert ist.

Da fehlt noch mehr.
z.B. fehlt noch der Body, der mitgesendet werden müsste.
<?'.'xml version="1.0" encoding="utf-8"?'.'><Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006"><Request><EMailAddress>'.$email.'</EMailAddress><AcceptableResponseSchema#>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema></Request></Autodiscover>  


Ich denke ich muss es für den Body mit curl machen:

(code für logeintrag1)
$ccur = curl_init();
(code für logeintrag2)

curl_setopt_array($ccur, array(
  CURLOPT_RETURNTRANSFER => 1,
  CURLOPT_URL => $url,
  CURLOPT_POST => 1,
  CURLOPT_POSTFIELDS => $sInput
));
$resp = curl_exec($ccur);
curl_close($ccur);

php bricht jedoch das Script ab nach dem logeintrag 1, logeintrag 2 wird schon gar nicht mehr geschrieben.

php -m meldet jedoch, dass curl installiert wäre.
NordicMike
NordicMike Oct 11, 2022 at 09:58:29 (UTC)
Goto Top
Danke Uwe, ich probier mal deine Version mit curl
NordicMike
NordicMike Oct 11, 2022 at 10:43:31 (UTC)
Goto Top
Also... Auch bei Uwes Code kommt ein Fehler:

(500) Interner Server Fehler

Gleich nach dem
$ch = curl_init("https://$domain/Autodiscover/Autodiscover.xml");  
In Zeile 21.
Zu Zeile 22 kommt er schon gar nicht mehr.


Schon mal vielen Dank für Eure Geduld...
colinardo
Solution colinardo Oct 11, 2022 updated at 11:02:34 (UTC)
Goto Top
Klappt hier im Test einwandfrei. Hast du mal das Error-Reporting im Skript oben aktiviert? Deine PHP-Umgebung scheint wohl noch nicht vollständig zu sein. PHP Version? Webserver? Was steht im Journal des Webservers zum 500er Error?
Siehe die ergänzenden Hinweise zu Zertifikaten und HTTPAUTH Methode oben.
NordicMike
NordicMike Oct 11, 2022 at 11:17:34 (UTC)
Goto Top
Ja, das Logfile musste ich erst suchen... Alles nicht so einfach mit dem FreeBSD, wenn man Debian gewohnt ist.

Fehler sagt:
Call to undefined function curl_init()


php -v sagt:
PHP 7.4.32 (cli) (built: Oct  6 2022 12:03:32) ( NTS )

php -m sagt:
[PHP Modules]
Core
curl
date
filter
hash
iconv
imap
ldap
libxml
mbstring
mcrypt
mysqlnd
openssl
pcre
Phar
Reflection
session
SimpleXML
SPL
standard

[Zend Modules]

httpd -v sagt:
Server version: Apache/2.4.54 (FreeBSD)
Server built:   unknown

Updaten traue ich mich nicht, da es nicht meiner ist. Danke dir schon einmal...
NordicMike
NordicMike Oct 11, 2022 at 11:23:10 (UTC)
Goto Top
Jetzt bin ich ein Stück weiter. "apachectl restart" hattte noch gefehlt. Ich melde mich bald wieder...

Danke schon mal...
colinardo
Solution colinardo Oct 11, 2022 updated at 15:30:55 (UTC)
Goto Top
Habe das ganze mal in einer aktuellen FreeBSD 13.1 VM ausprobiert, läuft dort nach meinem Test wie erwartet auch problemlos in folgender Umgebung.
back-to-topVersions
# uname -a
FreeBSD freebsd 13.1-RELEASE FreeBSD 13.1-RELEASE releng/13.1-n250148-fc952ac2212 GENERIC amd64

# httpd -v
Server version: Apache/2.4.54 (FreeBSD)
Server built:   unknown

back-to-topModules
# php -m

[PHP Modules]
Core
curl
date
hash
libxml
mysqli
mysqlnd
pcre
Reflection
SimpleXML
SPL
standard
xml

back-to-topInstallierte Pakete
# pkg info

apache24-2.4.54                Version 2.4.x of Apache web server
apr-1.7.0.1.6.1_2              Apache Portability Library
bash-5.2_3                     GNU Project's Bourne Again SHell  
ca_root_nss-3.83               Root certificate bundle from the Mozilla Project
curl-7.85.0                    Command line tool and library for transferring data with URLs
db5-5.3.28_8                   Oracle Berkeley DB, revision 5.3
expat-2.4.9                    XML 1.0 parser written in C
gdbm-1.23                      GNU database manager
gettext-runtime-0.21           GNU gettext runtime libraries and programs
indexinfo-0.3.1                Utility to regenerate the GNU info page index
jansson-2.14                   C library for encoding, decoding, and manipulating JSON data
libargon2-20190702             Memory hard password hashing program and library
libidn2-2.3.3                  Implementation of IDNA2008 internationalized domain names
libnghttp2-1.48.0              HTTP/2.0 C Library
libpsl-0.21.1_4                C library to handle the Public Suffix List
libssh2-1.10.0,3               Library implementing the SSH2 protocol
libunistring-1.0               Unicode string library
libxml2-2.10.2                 XML parser library for GNOME
mod_php74-7.4.32_1             PHP Scripting Language
nano-6.4                       Nano's ANOther editor, an enhanced free Pico clone  
pcre2-10.40                    Perl Compatible Regular Expressions library, version 2
perl5-5.32.1_3                 Practical Extraction and Report Language
php74-7.4.32                   PHP Scripting Language
php74-curl-7.4.32              The curl shared extension for php
php74-mysqli-7.4.32            The mysqli shared extension for php
php74-simplexml-7.4.32         The simplexml shared extension for php
php74-xml-7.4.32               The xml shared extension for php
pkg-1.18.4                     Package manager
readline-8.1.2                 Library for editing command lines as they are typed

back-to-topPHP Info

screenshot

Nur zur Info, für den PHP 7.4 Port wir der Support im November eingestellt.
NordicMike
NordicMike Oct 12, 2022 at 06:39:38 (UTC)
Goto Top
Danke dafür. Ich muss mit meinen Tests noch warten, bis unser Firewall Chef die Firewall angepasst hat.
NordicMike
NordicMike Oct 12, 2022 at 19:33:35 (UTC)
Goto Top
Juhuu, es funktioniert. Danke euch allen für die Geduld...