[Problem] FRITZ!DECT 200 mit PowerShell per Script schalten - aber wie?!?

TheJohnny

Neuer User
Mitglied seit
17 Aug 2011
Beiträge
79
Punkte für Reaktionen
1
Punkte
8
Windows 7 mit PowerShell 2.0. FRITZ!Box 7490 mit FRITZ!OS 6.51

Hallo,

ich habe diesen Artikel in der c't gelesen und würde daraufhin gerne meinen FRITZ!DECT 200 per PowerShell-Script schalten.

Leider klappt dies nicht; genauer gesagt scheitere ich schon am Ausführen der beispiel.ps1 des verlinkten Artikels.

Mir wird die folgende Fehlermeldung angezeigt:
PHP:
Ausnahme beim Aufrufen von "UploadString" mit 2 Argument(en):  "Der Remoteserver hat einen Fehler zurückgegeben: (500) Interner Serverfehler."
Bei Zeile:66 Zeichen:26
+ $r = [xml]$w.UploadString <<<< ("https://fritz.box:"+$port+"/upnp/control/wanpppconn1",$query)
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

Gebe ich das Passwort zum Login falsch ein, so ist die Fehlermeldung nur wenig anders:
PHP:
Ausnahme beim Aufrufen von "UploadString" mit 2 Argument(en):  "Der Remoteserver hat einen Fehler zurückgegeben: (401) Nicht autorisiert."
Bei Zeile:66 Zeichen:26
+ $r = [xml]$w.UploadString <<<< ("https://fritz.box:"+$port+"/upnp/control/wanpppconn1",$query)
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

Das Zeichen 26 - "(" - kann also eigentlich nicht das Problem sein. Ich verstehe nicht, warum die einfache Abfrage nach der externen IP-Adresse nicht klappt. (Das Abspeichern des Telefonbuchs klappt auch nicht - gleiche Fehlermeldung.)
Einfach, selbst gebastelte Aufrufe haben die gleiche Fehlermeldung zur Folge. Allerdings nutze ich auch dasselbe Script-Gerüst.

Die beispiel.ps1 fragt den Security-Port sowie die externe IP-Adresse ab und speichert das Telefonbuch:
PHP:
$w=New-Object System.Net.WebClient
$w.Encoding=[System.Text.Encoding]::UTF8
$w.Headers.Set("Content-Type", 'text/xml; charset="utf-8"')
$w.Headers.Set("SOAPACTION", 'urn:dslforum-org:service:DeviceInfo:1#GetSecurityPort')
$query='<?xml version="1.0"?>
        <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
        s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <s:Body> ' +
        '<u:GetSecurityPort xmlns:u="urn:dslforum-org:service:DeviceInfo:1">
        </u:GetSecurityPort>' +
        '</s:Body>
        </s:Envelope>'
$r = [xml]$w.UploadString("http://fritz.box:49000/upnp/control/deviceinfo",$query)
$port=$r.Envelope.Body.GetSecurityPortResponse.NewSecurityPort

$w.Headers.Set("Content-Type", 'text/xml; charset="utf-8"')
$w.Headers.Set("SOAPACTION", 'urn:dslforum-org:service:WANPPPConnection:1#GetExternalIPAddress')
$query='<?xml version="1.0"?>
        <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
        s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <s:Body> ' +
        '<u:GetExternalIPAddress xmlns:u="urn:dslforum-org:service:WANPPPConnection:1">
        </u:GetExternalIPAddress>' +
        '</s:Body>
        </s:Envelope>'
$w.Credentials=New-Object System.Net.NetworkCredential("login","passwort")
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
$r = [xml]$w.UploadString("https://fritz.box:"+$port+"/upnp/control/wanpppconn1",$query)
"Externe IP-Adresse: " + $r.Envelope.Body.GetExternalIPAddressResponse.NewExternalIPAddress

$w.Headers.Set("Content-Type", 'text/xml; charset="utf-8"')
$w.Headers.Set("SOAPACTION", 'urn:dslforum-org:service:X_AVM-DE_OnTel:1#GetPhoneBook')
$query='<?xml version="1.0"?>
        <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
        s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <s:Body> ' +
        '<u:GetPhoneBook xmlns:u="urn:dslforum-org:service:X_AVM-DE_OnTel:1">
        <NewPhonebookID>0</NewPhonebookID>
        </u:GetPhoneBook>'+
        '</s:Body>
        </s:Envelope>'
$r = [xml]$w.UploadString("https://fritz.box:"+$port+"/upnp/control/x_contact",$query)
$url=$r.Envelope.Body.GetPhonebookResponse.NewPhonebookURL
$w.Headers.Clear()
$w.DownloadFile( $url, "pbook.xml")

Wer kann mir einen Tipp geben, woran es liegt?

Vielen Dank!!!
 
Zuletzt bearbeitet:
Ich würde es erst einmal mit einer Abfrage testen.

Aber wenn ich mir den Code ansehen, fehlt mir irgendwie die 'Verrechnung' der zurückgegebenen Daten, um an die SID zu kommen, und diese an den Aufruf zu übergeben.

(Oder ich habe das übersehen. So gut sind meine PS-Kenntnisse nicht ;-))
 
Auf dem TR-064-Interface erfolgt die Anmeldung mit "basic digest auth" und man muß keinen Hash selbst berechnen. Der Zugriff erfolgt aber über HTTPS (daher auch zuerst die Abfrage (die ohne Credentials funktioniert), welcher Port zu verwenden ist - normalerweise wird das dann 49443) und da ist die komplette Verbindung verschlüsselt, so daß "basic digest auth" kein Sicherheitsproblem wird.

- - - Aktualisiert - - -

Ansonsten sieht das PowerShell-Skript aber sauber aus ... ein analoges arbeitet bei mir auch einwandfrei.

Kann es sein, daß der verwendete Benutzer keine Rechte für die Konfiguration hat? Meines Erachtens geht dann nicht einmal die Abfrage der "NewExternalIPAddress", wenn das wirklich das TR-064-Interface ist und nicht die IGD-Variante. Wobei ich auch nicht weiß, was AVM da in neuerer Firmware gemacht hat. Es gibt irgendeine Erweiterung des IGD-Interfaces (IGD2), wie sich das jetzt mit dem TR-064-Interface verträgt (die Spec. enthält dafür einen gesonderten Punkt), weiß ich nicht bzw. habe ich nicht getestet.

Am ehesten würde ich auf "unauthorized" tippen, wobei ja offenbar Benutzername und Kennwort zueinander passen, ansonsten gäbe es das (ja ebenfalls getestete) 401.

Zum generellen Verständnis, wie die Authentifizierung arbeitet (insbesondere, was man als Benutzer verwenden soll, wenn "nur Kennwort" konfiguriert ist in der Box), liest man am besten den Abschnitt 4.1 in diesem Dokument: http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AVM_TR-064_first_steps.pdf
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.