Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Powershell: FritzBox über TR-064 im Netzwerk konfigurieren und auslesen

Mitglied: colinardo

colinardo (Level 5) - Jetzt verbinden

02.05.2016, aktualisiert 29.11.2018, 20240 Aufrufe, 37 Kommentare, 20 Danke

Ich stand neulich vor der undankbaren Aufgabe eine Fritzbox per Powershell auszulesen und Aktionen darüber automatisiert auszuführen. Herausgekommen ist ein Skript das bestimmt dem ein oder anderen hier nützlich sein könnte. Ich stelle es deshalb hier öffentlich zur Verfügung.

Ich hatte dazu zwar schon einen Artikel für die Bash geschrieben, jedoch hat dieser das ganze Prozedere über das Webinterface realisiert was jedoch durch die ständigen Anpassungen seitens AVM nicht für dauerhafte Skripte geeignet und auch nicht sehr zuverlässig ist wenn zukünftige Updates auf der FritzBox gefahren werden.

Also habe ich das ganze nun mal mit der standardisierte Schnittstelle TR-064 umgesetzt welche die Fritzbox unterstützt. Die Abfragen laufen dort über standardisierte SOAP-Requests auf die uPnP Schnittstelle der Box (Port 49000/49443) ab. Damit diese Requests funktionieren, muss folgende Einstellung in der Fritzbox aktiviert sein:

Heimnetz > Heimnetzübersicht > Netzwerkeinstellungen > Zugriff für Anwendungen zulassen

screenshot - Klicke auf das Bild, um es zu vergrößern

Das Skript stellt im jetzigen Zustand nicht alle verfügbaren Funktionen zur Verfügung, jedoch lassen sich diese mit Kenntnis der entsprechenden Dokumentation und der SOAP-XML-Beschreibungsdatei selbst leicht nachrüsten. Dazu schreibe ich später noch mehr.

Das Skript wurde hier für eine FritzBox 7390 mit Firmware 6.51/6.83 an einem DSL-Anschluss entwickelt und getestet.

Wichtige Information: Die Funktionen die die DSL-Infos auslesen sind spezifisch auf das DSL-PPPoE-Interface ausgelegt, d.h. also wenn eure Fritzbox keine direkte PPPoE DSL-Verbindung aufbaut sondern das Internet z.B. über LAN1 oder einen Kabelanschluss bezieht, müssen die Funktionen angepasst werden. Das geschieht in jeder Funktion über die Parameter -URN und -action. Diese Strings findet man in der Dienstbeschreibungs-XML-Datei seiner FritzBox.

Dort finden sich zum WAN folgende Services:
  • urn:dslforum-org:service:WANDSLLinkConfig:1
  • urn:dslforum-org:service:WANEthernetLinkConfig:1
  • urn:dslforum-org:service:WANPPPConnection:1
  • urn:dslforum-org:service:WANIPConnection:1
Je nachdem wie eure Fritzbox also am WAN angeschlossen ist muss hier also der dazu passende Service angepasst werden. Mehr dazu siehe weiter unten.

Das Skript funktioniert nur im internen Netz der Fritzbox, also nicht über den WAN-Port!

Skript: Powershell Fritzbox über TR-064 steuern

01.
<#
02.
    Fritzbox via TR-064 (uPNP-SOAP) steuern und auslesen 
03.
      ------------ @colinardo https://www.administrator.de ---------------
04.
#>
05.
# ====== Variablen =========
06.
$FB_FQDN = "fritz.box"
07.
$USERNAME = 'admin'
08.
$PASSWORD = 'Geheim'
09.
# ====== ENDE Variablen ====
10.

11.
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
12.

13.
# XML Service-Beschreibungs XML abrufen und Namespace setzen
14.
[xml]$serviceinfo = Invoke-RestMethod -Method GET -Uri "http://$($FB_FQDN):49000/tr64desc.xml"
15.
[System.Xml.XmlNamespaceManager]$ns = new-Object System.Xml.XmlNamespaceManager $serviceinfo.NameTable
16.
$ns.AddNamespace("ns",$serviceinfo.DocumentElement.NamespaceURI)
17.
# Ignore Certificate Errors
18.
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
19.

20.

21.
# Funktion zum senden eines SOAP Requests
22.
function Execute-SOAPRequest {
23.
    param(
24.
        [Xml]$SOAPRequest,
25.
        [string]$soapactionheader,
26.
        [String]$URL
27.
    )
28.
    try{
29.
        $wr = [System.Net.WebRequest]::Create($URL)
30.
        $wr.Headers.Add('SOAPAction',$soapactionheader)
31.
        $wr.ContentType = 'text/xml; charset="utf-8"'
32.
        $wr.Accept      = 'text/xml'
33.
        $wr.Method      = 'POST'
34.
        $wr.PreAuthenticate = $true
35.
        $wr.Credentials = [System.Net.NetworkCredential]::new($USERNAME,$PASSWORD)
36.

37.
        $requestStream = $wr.GetRequestStream()
38.
        $SOAPRequest.Save($requestStream)
39.
        $requestStream.Close()
40.
        [System.Net.HttpWebResponse]$wresp = $wr.GetResponse()
41.
        $responseStream = $wresp.GetResponseStream()
42.
        $responseXML = [Xml]([System.IO.StreamReader]($responseStream)).ReadToEnd()
43.
        $responseStream.Close()
44.
        return $responseXML
45.
    }catch {
46.
        if ($_.Exception.InnerException.Response){
47.
            throw ([System.IO.StreamReader]($_.Exception.InnerException.Response.GetResponseStream())).ReadToEnd()
48.
        }else{
49.
            throw $_.Exception.InnerException
50.
        }
51.
    }
52.
}
53.

54.
function New-Request {
55.
    param(
56.
        [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$urn,
57.
        [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$action,
58.
        [hashtable]$parameter = @{},
59.
        $Protocol = 'https'
60.
    )
61.
        # SOAP Request Body Template
62.
        [xml]$request = @"
63.
<?xml version="1.0"?>
64.
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
65.
    <s:Body>
66.
    </s:Body>
67.
</s:Envelope>
68.
"@
69.
    # Service auslesen
70.
    $service = $serviceinfo.SelectNodes('//ns:service',$ns) | ?{$_.ServiceType -eq $URN}
71.
    if(!$service){throw "URN does not exist."}
72.
    # Action Element erstellen
73.
    $actiontag = $request.CreateElement('u',$action,$service.serviceType)
74.
    # Parameter erstellen
75.
    $parameter.GetEnumerator() | %{
76.
          $el = $request.CreateElement($_.Key)
77.
          $el.InnerText = $_.Value
78.
          $actiontag.AppendChild($el)| out-null
79.
    }
80.
    # Action Element einfügen
81.
    $request.GetElementsByTagName('s:Body')[0].AppendChild($actiontag) | out-null
82.
    # Send request
83.
    $resp = Execute-SOAPRequest $request "$($service.serviceType)#$($action)" "$($Protocol)://$($FB_FQDN):$(@{$true=$script:secport;$false=49000}[($Protocol -eq 'https')])$($service.controlURL)"
84.
    return $resp
85.
}
86.

87.
# Security-Port (https) abfragen
88.
$script:secport = (New-Request -urn "urn:dslforum-org:service:DeviceInfo:1" -action 'GetSecurityPort' -proto 'http').Envelope.Body.GetSecurityPortResponse.NewSecurityPort
89.

90.
# ----------- Fritz!Box-Funktionen --------------------------
91.
# Fritzbox Reboot
92.
function Invoke-FBReboot(){
93.
    $resp = New-Request -urn 'urn:dslforum-org:service:DeviceConfig:1' -action 'Reboot'
94.
    return $resp.Envelope.Body.InnerText
95.
}
96.
# Basisinformationen und letzte Logeinträge abrufen
97.
function Get-FBInfo(){
98.
    $resp = New-Request -urn 'urn:dslforum-org:service:DeviceInfo:1' -action 'GetInfo'
99.
    return $resp.Envelope.Body.GetInfoResponse
100.
}
101.
# Anruferliste abrufen
102.
function Get-FBCallList(){
103.
    param(
104.
        [int]$maxentries = 999,
105.
        [int]$days = 999
106.
    )
107.
    $resp = New-Request -urn 'urn:dslforum-org:service:X_AVM-DE_OnTel:1' -action 'GetCallList'
108.
    $list = [xml](new-object System.Net.WebClient).DownloadString("$($resp.Envelope.Body.GetCallListResponse.NewCallListURL)&max=$maxentries&days=$days")
109.
    return $list.root.call
110.
}
111.
# WAN-PPP-Info auslesen
112.
function Get-FBWANPPPInfo(){
113.
    $URN = 'urn:dslforum-org:service:WANPPPConnection:1'
114.
    $action = 'GetInfo'
115.
    $resp = New-Request -urn 'urn:dslforum-org:service:WANPPPConnection:1' -action 'GetInfo'
116.
    return $resp.Envelope.Body.GetInfoResponse
117.
}
118.
# Aktuelle DSL-Verbindungsdaten auslesen
119.
function Get-FBWANDSLInterfaceConfig(){
120.
    $resp = New-Request -urn 'urn:dslforum-org:service:WANDSLInterfaceConfig:1' -action 'GetInfo'
121.
    return $resp.Envelope.body.GetInfoResponse
122.
}
123.
# DSL Leitungsstatistik abfragen
124.
function Get-FBWANDSLInterfaceStatistics(){
125.
    $resp = New-Request -urn 'urn:dslforum-org:service:WANDSLInterfaceConfig:1' -action 'GetStatisticsTotal'
126.
    return $resp.Envelope.body.GetStatisticsTotalResponse
127.
}
128.
# DSL-Verbindung trennen
129.
function Invoke-DSLDisconnect(){
130.
    $resp = New-Request -urn 'urn:dslforum-org:service:WANPPPConnection:1' -action 'ForceTermination'
131.
    return $resp.Envelope.body
132.
}
133.
# Portfreigaben abrufen
134.
function Get-FBPortMappings(){
135.
    $resp = New-Request -urn 'urn:dslforum-org:service:WANPPPConnection:1' -action 'GetPortMappingNumberOfEntries' 
136.
    [int]$cnt = $resp.Envelope.Body.GetPortMappingNumberOfEntriesResponse.NewPortMappingNumberOfEntries
137.
    if ($cnt -gt 0){
138.
        0..($cnt - 1) | %{
139.
            $resp = New-Request -urn 'urn:dslforum-org:service:WANPPPConnection:1' -action 'GetGenericPortMappingEntry' -parameter @{NewPortMappingIndex=[string]$_}
140.
            return $resp.Envelope.body.GetGenericPortMappingEntryResponse
141.
        }
142.
    }
143.
}
144.

145.
# Portweiterleitungen anlegen / verändern
146.
function Add-FBPortMapping(){
147.
    param(
148.
        [string]$RemoteHost = '0.0.0.0',
149.
        [Parameter(mandatory=$true)][ValidateRange(1,65535)][uint16]$ExternalPort,
150.
        [Parameter(mandatory=$true)][ValidateSet('TCP','UDP')][string]$Protocol,
151.
        [Parameter(mandatory=$true)][string]$InternalClient,
152.
        [Parameter(mandatory=$true)][ValidateRange(1,65535)][uint16]$InternalPort,
153.
        [bool]$Enabled = $true,
154.
        [Parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$Description,
155.
        [string]$LeaseDuration = "0"
156.
    )
157.

158.
    $parameter = [ordered] @{
159.
        NewRemoteHost = $RemoteHost
160.
        NewExternalPort = [string]$ExternalPort
161.
        NewProtocol = $Protocol
162.
        NewInternalPort = [string]$InternalPort
163.
        NewInternalClient = $InternalClient
164.
        NewEnabled = @{$true="1";$false="0"}[$Enabled]
165.
        NewPortMappingDescription = $Description
166.
        NewLeaseDuration = $LeaseDuration
167.
    }
168.
    $resp = New-Request -urn 'urn:dslforum-org:service:WANPPPConnection:1' -action 'AddPortMapping' -parameter $parameter
169.
    return $resp.envelope.body.AddPortMappingResponse
170.
}
171.

172.
# Bestimmte Portweiterleitung löschen
173.

174.
function Delete-FBPortMapping(){
175.
    param(
176.
        [ValidateRange(1,65535)][uint16]$ExternalPort,
177.
        [ValidateSet('TCP','UDP')][string]$Protocol
178.
    )
179.
 
180.
    $parameter = [ordered] @{
181.
        NewRemoteHost = '0.0.0.0'
182.
        NewExternalPort = [string]$ExternalPort
183.
        NewProtocol = $Protocol
184.
    }
185.
    $resp = New-Request -urn 'urn:dslforum-org:service:WANPPPConnection:1' -action 'DeletePortMapping' -parameter $parameter
186.
    return $resp.envelope.body
187.
}
188.

189.
# Rufnummer mit der Wählhilfe wählen
190.
function Dial-FBNumber {
191.
    param(
192.
        [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$number
193.
    )   
194.
    $parameter = @{
195.
        'NewX_AVM-DE_PhoneNumber' = $number
196.
    }
197.
    $resp = New-Request -urn 'urn:dslforum-org:service:X_VoIP:1' -action 'X_AVM-DE_DialNumber' -parameter $parameter
198.
    return $resp.envelope.body
199.
}

Erläuterungen zum Skript

Variablen
Im Kopf gibt man entsprechen die Host-Adresse der Fritzbox, einen Benutzernamen und Passwort der Box an. Wenn man keinen Benutzer angelegt hat benutzt man als Benutzernamen admin.

Momentan umgesetzte Funktionen

FunktionsnameBeschreibung
Get-FBCallList Ruft die Anruferliste ab. Über die Funktionsparameter -days und -maxentries kann festgelegt werden wieviel oder bis wann die Einträge ausgelesen werden sollen
Get-FBInfoBasisinformationen und letzte Logeinträge abrufen
Get-FBWANDSLInterfaceConfigDSL Leitungsdaten abfragen
Get-FBWANDSLInterfaceStatisticsDSL Leitungsstatistik abfragen
Get-FBPortMappingsPortfreigaben auslesen
Add-FBPortMappingPortfreigabe erstellen. Beispiel: (Achtung, funktioniert wegen Bug nicht immer bzw. nur nach mehrfach wiederholtem Ausführen)
Add-FBPortmapping -ExternalPort 8080 -InternalClient '192.168.1.2' -InternalPort 8090 -Protocol TCP -Description 'Test-Beschreibung'
Delete-FBPortMappingPortfreigaben löschen. Beispiel:
Delete-FBPortMapping -ExternalPort 443 -Protocol TCP
Invoke-FBRebootFritzbox neu starten
Invoke-DSLDisconnectDSL-Verbindung trennen
Dial-FBNumberEine Rufnummer mit Hilfe der Wählhilfe anwählen (Hinweis: Die Wählhilfe muss in den Einstellungen der Fritzbox natürlich aktiviert sein!)
Beispiel: Dial-FBNumber -number '0123456789'

Dokumentation zur TR-064 Schnittstelle

Die Dokumentation zu der TR-064 Schnittstelle und die Dienstbeschreibungen mit den nötigen Parametern findet sich hier:
http://avm.de/service/schnittstellen/
Die XML-Datei welche die SOAP-Servicebescheibungen der eigenen Fritzbox auflistet kann man auf seiner eigenen Fritzbox unter http://fritz.box:49000/tr64desc.xml abrufen.

Dort finden sich dann Abschnitte mit dem XML-Tag Service.
Beispiel:
<service>
    <serviceType>urn:dslforum-org:service:DeviceConfig:1</serviceType>
    <serviceId>urn:DeviceConfig-com:serviceId:DeviceConfig1</serviceId>
    <controlURL>/upnp/control/deviceconfig</controlURL>
    <eventSubURL>/upnp/control/deviceconfig</eventSubURL>
    <SCPDURL>/deviceconfigSCPD.xml</SCPDURL>
</service>
Der ServiceType ist eine eindeutige Bezeichnung für den Abschnitt den man konfigurieren oder abfragen möchte. Welche Abschnitte es gibt und welche Aktionen es darin gibt lässt sich der oben verlinkten Dokumentation bei AVM entnehmen. Hat man den gewünschten Dienst gefunden findet man auf der selben Ebene der XML-Datei eine Sub-URL die unter SCPDURL steht. Diese kann man ebenfalls von der Fritzbox abrufen: http://fritz.box:49000/deviceconfigSCPD.xml , also immer die URL an http://fritz.box:49000 angehängt.
Ruft man diese XML-Datei ab, findet man darin die Aktionen die man für diese Kategorie ausführen kann.

Beispiel hier die Aktion zum Zurücksetzen auf die Werkseinstellungen:
<action>
    <name>FactoryReset</name>
</action>
Dieser Aktionsname landet dann bei meinen Funktionen immer in der Variablen $action wenn man sich mal eine der Funktionen im Skript anschaut. Je nachdem welche und ob die Funktion Übergabe-Parameter erwartet steht ebenfalls in der Doku zu den Funktionen bei AVM. Muss man Parameter im SOAP-Request mit übergeben sind diese mit [IN] gekennzeichnet. Parameter die mit [OUT] gekennzeichnet sind werden nur ausgegeben, diese muss man also nicht übergeben.

Mit diesen Infos ist also kein Hexenwerk mehr andere Funktionen der Fritzbox anzusprechen oder entsprechende Infos abzurufen.

Solltet Ihr Interesse an weiteren spezifischen Funktionen haben kann ich Zug um Zug weitere Funktionen nachreichen und ins Skript einbauen wenn Ihr mir dies mit einer Bitte in ein Kommentar schreibt. Ich werde diese dann Zeitnah nachreichen.

Hoffe das hilft dem ein oder anderen bei seinem Projekt.

Wie immer sind alle Angaben ohne Gewähr und die Benutzung geschieht auf eigene Gefahr.

Gruß @colinardo

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate

Updates:

DatumBeschreibung
20.11.2018 Korrektur einer Variablen in der Funktion Get-FBPortMappings
30.01.2018 Script optimiert umgeschrieben
20.02.2017 Funktion Dial-FBNumber hinzugefügt
37 Kommentare
Mitglied: aliate
25.05.2017 um 21:49 Uhr
Gibt es eine Möglichkeit die WLAN-Sendeleistung über einen TR064-Befehl einzustellen?
Bitte warten ..
Mitglied: colinardo
26.05.2017, aktualisiert um 09:00 Uhr
Servus @aliate .
Zitat von aliate:

Gibt es eine Möglichkeit die WLAN-Sendeleistung über einen TR064-Befehl einzustellen?
Nein. Dazu benötigst du Shellzugriff auf deine Box (bedeutet freetzen oder über Config Hacks ssh/telnet aktivieren)

Grüße Uwe
Bitte warten ..
Mitglied: TaurecTaurec
10.06.2017 um 19:30 Uhr
Hallo colinardo,
vielen dank für Deine Arbeit,
da ich mich mit Powershell nicht auskenne bekomme ich es auch leider nicht hin z.B. die FB info anzeigen zu lassen.
Wie oder was muss ich tun um die Infos anzuzeigen?

cu
Taurec
Bitte warten ..
Mitglied: colinardo
10.06.2017, aktualisiert um 19:54 Uhr
Zitat von TaurecTaurec:
Hallo colinardo,
vielen dank für Deine Arbeit,
Servus @TaurecTaurec , willkommen auf Administrator.de!
da ich mich mit Powershell nicht auskenne bekomme ich es auch leider nicht hin z.B. die FB info anzeigen zu lassen.
Wie oder was muss ich tun um die Infos anzuzeigen?
Du nimmst obigen Code (bitte nur über "Quelltext"-Link oben rechts kopieren), fügst diesen in eine Datei mit der Endung .ps1 ein. Dann fügst du unten in der Datei noch ein Get-FBInfo ein um die Funktion aufzurufen, passt ganz oben im Skript wie in der Anleitung beschrieben die Zugangsdaten deiner Fritzbox an und speicherst die Datei.
Dann führst du das Skript folgendermaßen z.B. in einer CMD aus:
01.
powershell -Executionpolicy ByPass -File "C:\Daten\scriptname.ps1"
Willst du in Zukunft Skripte ohne die Executionpolicy anzugeben ausführen musst du die Executionpolicy für deinen Rechner in einer "elevated" Powershell freischalten
Set-Executionpolicy RemoteSigned
Sollten noch Fragen offen sein, bitte PM. Merci.
Grüße Uwe
Hier noch ein wenig Background-Wissen zum Ausführen von Powershell-Skripten:

Anleitung: Wie starte ich Powershell-Scripte

  • Zuerst speichert man den Code in einer Textdatei mit der Endung .ps1.
  • Wenn man zum ersten mal Powershell-Scripte ausführt, musst man einmalig vorher noch das Ausführen von Scripten im User-Account freischalten. Dazu öffnet man eineadministrative Powershell-Konsole und gibt dort den Befehl Set-ExecutionPolicy RemoteSigned -Force ein. Um diese Policy für alle User auf dem Rechner zu setzen muss man diesen Befehl in einer Powershell-Konsole mit Admin-Rechten starten. Noch ein Hinweis für 64-Bit-Systeme: Hier sollte sowohl für die 32bit und 64Bit Variante der Powershell die Policy in einer Admin-Konsole gesetzt werden: Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
  • Jetzt kann das Powershell-Script wie weiter unten erläutert in einer Powershell-Konsole oder aus einer CMD-Fenster heraus ausgeführt werden. Wer lieber mit der Maus arbeitet macht einen Rechtsklick auf die Script-Datei und wählt: Mit Powershell ausführen.
  • Alternativ lässt sich ein Script auch ohne das globale Ändern der ExecutionPolicy ausführen indem man die Policy als Parameter auf der Kommandozeile mitgibt:
powershell.exe -ExecutionPolicy ByPass -File "C:\Pfad\Script.ps1"
Starten eines Scriptes in einer Powershell-Konsole
Immer den kompletten Pfad zum Script angeben, und wenn er Leerzeichen beinhaltet in Anführungszeichen einschließen:
"C:\Pfad\script.ps1"
Liegt das Script im selben Verzeichnis in dem man sich gerade befindet, kann man es auch so abkürzen:
.\script.ps1
Starten von PS-Scripten aus Batch und Kommandozeilen heraus:
Hier gibt es unterschiedliche Methoden, je nach Anforderungen gibt es hier einige Besonderheiten vor allem bei Leerzeichen in Pfaden zu beachten!
Der einfachste Aufruf sieht hier so aus:
powershell.exe -File "C:\Pfad\Script.ps1"
Wenn man dem Script Parameter übergeben möchte:
powershell.exe -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Wenn man "benannte" Parameter übergeben möchte (die einfachen Hochkommas um den Scriptpfad werden benötigt wenn er Leerzeichen beinhaltet):
powershell.exe -command "&'C:\Pfad\Script.ps1' -par1 'Wert1' -par2 'Wert2'"
Man kann auch mehrere Scripte hintereinander ausführen lassen:
powershell.exe -command "&'C:\Pfad\Script1.ps1';&'C:\Pfad\Script2.ps1'"
Weitere Parameter zeigt einem ein powershell -? in einer Konsole an.
Starten von PS-Scripten in der Aufgabenplanung (Taskplaner)
In der jeweiligen Aktion unter "Programm/Script" trägt man powershell.exe ein und unter "Argumente hinzufügen (optional)" trägt man wie oben geschrieben alles was hinter powershell.exe kommt ein - also z.B. -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Bitte warten ..
Mitglied: TaurecTaurec
10.06.2017 um 20:08 Uhr
Hallo Uwe,
vielen Dank für die Hilfe. (auch für die Infos)

Alles funktioniert für mich wie Du beschrieben hast
(für mich sind nur die get Funktionen interessant)

cu Taurec

P.S. wirklich gut gemacht
Bitte warten ..
Mitglied: colinardo
10.06.2017, aktualisiert um 21:59 Uhr
Freut mich.

Schönes Wochenende noch.
Uwe
Bitte warten ..
Mitglied: Selfer
11.08.2017 um 17:56 Uhr
Hallo Uwe,
auch ich kenne mich mit Powershell nicht aus, aber dank Deiner ausführlichen Darstellungen läuft Dein Script. Leider hat es keine Funktion, die eine Abfrage an die FB erlaubt, ob ein USB-Gerät (nicht über Fernanschluss) angeschlossen ist bzw. bereits ist. Ist sowas überhaupt machbar? Wenn ja, kann man die Infos in eine Datei schreiben lassen?
Bitte warten ..
Mitglied: colinardo
11.08.2017, aktualisiert um 19:48 Uhr
Servus Selfer, willkommen auf Administrator.de!
Freut mich zu hören das dir mein Skript bisher gute Dienste erwiesen hat .
Zitat von Selfer:
Leider hat es keine Funktion, die eine Abfrage an die FB erlaubt, ob ein USB-Gerät (nicht über Fernanschluss) angeschlossen ist bzw. bereits ist. Ist sowas überhaupt machbar?
Leider finde ich hierzu keine entsprechende Kategorie in den Klassen welche die Infos zu den angeschlossenen USB-Geräten kund tun würde.
Du könntest es aber immer noch alternativ über das Webinterface auslesen, s. Skript unten.
Wenn ja, kann man die Infos in eine Datei schreiben lassen?

Alternative über Auslesen des Webinterface (nur mit FW. 6.83 einer FB 7390 getestet, andere FW anderer HTML-Code!)
01.
$fboxurl = 'http://fritz.box'
02.
$username = ''
03.
$password = 'GanzGeheim'
04.

05.
# Helperfunctions
06.
function md5([string]$string){
07.
    [System.BitConverter]::ToString([System.Security.Cryptography.MD5]::Create().ComputeHash((new-object System.Text.UnicodeEncoding).GetBytes($string))).replace('-','').toLower()
08.
}
09.

10.
function Get-SessionID([string]$url,[string]$user,[string]$pass){
11.
    $xml = irm -Uri "$url/login_sid.lua" -SessionVariable sess -ContentType "application/xml"
12.
    $sid = $xml.SessionInfo.SID 
13.
    if ($sid -eq '0'*16){
14.
        $challenge = $xml.SessionInfo.Challenge
15.
        # Response berechnen
16.
        $response = "$challenge-$((md5 "$challenge-$password").Substring(0,32))"
17.
        $xml = irm -Uri "$url/login_sid.lua" -WebSession $sess -Body @{response=$response;username=$username}
18.
        $sid = $xml.SessionInfo.SID
19.
    }
20.
    return $sid
21.
}
22.

23.
function Get-PageData([string]$url,[string]$sid,[hashtable]$parameters = @{}){
24.
    $body = $parameters;$body.sid = $sid
25.
    $r = Invoke-WebRequest -Uri $url -Body $body -Method Get
26.
    return $r.Content
27.
}
28.

29.
# Login durchführen / SID holen
30.
$sid = Get-SessionID -url $fboxurl -user $username -pass $password
31.

32.
$data = Get-PageData "$fboxurl/data.lua" -parameters @{page='usbOv'} -sid $sid
33.
$table = [regex]::match($data,'(?is)<table.*?id="uiViewUsbDevTable".*?>.*?</table>').Value
34.
$dom = New-Object -Com htmlfile
35.
$dom.IHTMLDocument2_write($table)
36.
$dom.documentElement.InnerText
Das gibt den Inhalt der Tabelle wieder in der evt. angeschlossene Geräte erscheinen.

Hoffe ich konnte dir damit trotzdem weiterhelfen.

Grüße Uwe
Bitte warten ..
Mitglied: Selfer
12.08.2017 um 09:52 Uhr
Vielen Dank für Deine Mühen, leider funktioniert das Script nicht (löst einen Haufen Fehler aus:

powershell.exe : Invoke-WebRequest : FRITZ!BoxDie angegebene URL wurde nicht gefunden. Sie
In Zeile:1 Zeichen:1

powershell.exe -ExecutionPolicy Bypass -File C:\Users\Hubert\Desktop\nw-abfrage. ...

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (Invoke-WebReque... gefunden. Sie :String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

werden auf die Startseite der FRITZ!Box weitergeleitet.Falls Sie nicht
automatisch auf die Startseite der FRITZ!Box weitergeleitet werden, klicken
Sie hier.
In C:\Users\Hubert\Desktop\nw-abfrage.ps1:25 Zeichen:10

$r = Invoke-WebRequest -Uri $url -Body $body -Method Get

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:Htt
pWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShe
ll.Commands.InvokeWebRequestCommand
Fehler beim Aufrufen der Methode, da [System.__ComObject] keine Methode mit
dem Namen "IHTMLDocument2_write" enth„lt.
In C:\Users\Hubert\Desktop\nw-abfrage.ps1:35 Zeichen:1

$dom.IHTMLDocument2_write($table)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (IHTMLDocument2_write:String)
[], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

irm : Ungltiger URI: Der Hostname konnte nicht analysiert werden.
In C:\Users\Hubert\Desktop\nw-abfrage.ps1:11 Zeichen:12

$xml = irm -Uri "$url/login_sid.lua" -SessionVariable sess -ContentType

"app ...

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~
+ CategoryInfo : NotSpecified: ( [Invoke-RestMethod], UriFormat
Exception
+ FullyQualifiedErrorId : System.UriFormatException,Microsoft.PowerShell.C
ommands.InvokeRestMethodCommand

.... wobei ich als URL der FB die IP angegeben habe, weil auch in Firefox der Name nicht mehr aufgelöst wird seit Neuem. Dies klappt auch im ersten Script. Ich nutze die FB 7270 V2 (UI) mit der FW 54.06.06. Ich nehme an es liegt daran, wie Du auch angedeutet hast. Wo muss ich suchen, um den richtigen Code für meine Box zu finden.
Grüße
Selfer
Bitte warten ..
Mitglied: colinardo
12.08.2017, aktualisiert um 10:18 Uhr
Ich nutze die FB 7270 V2 (UI) mit der FW 54.06.06. Ich nehme an es liegt daran, wie Du auch angedeutet hast.
So ist es! Die Firmware ist viel zu alt. Bei den neuen Firmwares ab 6.50 hat sich zu viel geändert, als das der obige Code bei dir noch funktionieren könnte (WebIF und URLs komplett anders!).
Wo muss ich suchen, um den richtigen Code für meine Box zu finden.
Zum Auslesen der älteren Firmwares findest du hier im Forum von mir noch Quelltext für Bash-Skripte.
https://www.administrator.de/wissen/informationen-webinterface-fritzbox- ...
Bitte habe Verständnis das ich für die out of date Firmwares hier keinen kostenlosen Support bieten kann.
Bitte warten ..
Mitglied: Selfer
12.08.2017 um 16:55 Uhr
Klar, ist verständlich. Trotzdem vielen Dank.
Bitte warten ..
Mitglied: Lochkartenstanzer
12.08.2017 um 17:08 Uhr
Zitat von colinardo:

Bitte habe Verständnis das ich für die out of date Firmwares hier keinen kostenlosen Support bieten kann.

Selbst für aktuelle Firmwares kostenlosen Support zu erwarten ist etwas gewagt.

lks
Bitte warten ..
Mitglied: voumi70
24.08.2017 um 03:44 Uhr
Hallo colinardo
Seit längerer Zeit bin ich auf der Suche nach einer Möglichkeit, mit einem Script auf einem Windows-Rechner einen Telefonbeantworter auf der FritzBox beeinflussen zu können. Scripte im Zusammenhang mit der FritzBox habe ich schon einige gefunden. Bislang scheiterte es daran, dass ich nicht herausgefunden habe, was ich mit diesen wo anstellten sollte.....
Mit Deinem Script und den Tipps konnte ich zumindest bereits eine Reaktion erreichen.
Weisst Du, was ich an Deinem Script anpassen müsste, um die Delay-Zeit des Beantworters 1 beeinflussen zu können? Ich möchte zwischen 0 und 35 Sekunden wechseln können.
Besten Dank für Deinen Ratschlag schon im Voraus und liebe Grüsse aus der Schweiz.
voumi70
Bitte warten ..
Mitglied: colinardo
24.08.2017, aktualisiert um 13:01 Uhr
Gruezi voumi70, willkommen auf Administrator.de!
Über die API lässt es sich hier leider nicht ändern. Aber wie im letzten Beispiel in den Kommentaren geht dies über ein Web-GUI Skript bei dem man den Wert via Post an die /data.lua übermittelt.
Die nötigen Parameter bekommst du ganz leicht wenn du die Seite des Anrufbeantworters aufrufst, dann mit F12 die Browser-Developer Tools aktivierst auf den Netzwerk-Tab wechselst und dann die Einstellung des ABs änderst und auf Speichern klickst. Dann erscheinen die Ajax Posts in den Developer-Tools und dort sieht man welche Parameter für den manuellen Aufruf übermittelt werden müssen.
Da diese je nach Firmware unterschiedlich sind kann ich dir von meiner Seite aus nur Code für eine 7390 mit FW6.83 anbieten. Hast du eine andere Firmware kann ich dir nur anbieten gegen Aufwandsentschädigung deine Firmware zu analysieren und entsprechenden Code bereitzustellen.
Bei Interesse gerne PN.

Viele Grüße
Uwe
Bitte warten ..
Mitglied: existenz2
06.01.2018, aktualisiert um 14:59 Uhr
Sehr geiler Beitrag, ab neueren OS geht ja telnet so ohne weiteres nicht mehr, brauchte was um WLAN einzuschalten.

Ich habe den Aufruf etwas vereinfacht, so ist es m.E. einfacher mit der XML-Beschreibung von http://fritz.box:49000/tr64desc.xml bzw Unterseiten klarzukommen.

Die urn wird übergeben, die Action und die Argumente der Action als Hashtable.
Unten sind Beispiele für WLAN ein, WLAN aus und GetInfo

Bis die WLAN Befehle im UI sichtbar sind dauert es immer etwas (max 20 Sekunden).
Habe es mit der 7412 getestet.
Kann sein, dass es nicht mit allen Actions geht, habe nur die zwei getestet.

01.
function Get-Soaprequest {
02.
	Param ($urn,$action,$arguments = @{})
03.
	# Service auslesen
04.
	$service = $serviceinfo.SelectNodes('//ns:service',$ns)| ? {$_.ServiceType -eq $urn}
05.

06.
	# passenden Body Request-Tag ins XML einfügen
07.
	$actiontag = $script:request.CreateElement('u',$action,$service.serviceType)
08.
	foreach ($key in $arguments.keys) {
09.
		$parameter = $script:request.CreateElement($key)
10.
		$parameter.innerText = $arguments.$key
11.
		$actiontag.AppendChild($parameter) | out-null
12.
	}
13.
	$script:request.GetElementsByTagName('s:Body')[0].AppendChild($actiontag) | out-null
14.
	# Initialer Request
15.
	$resp = Execute-SOAPRequest $script:request "$($service.serviceType)#$($action)" "$($FB_URL):49000$($service.controlURL)"
16.
	# Authentifizierungsdaten setzen
17.
	SetAuthInfo $resp
18.

19.
	# Request mit Authentifizierung abschicken
20.
	$resp = Execute-SOAPRequest $script:request "$($service.serviceType)#$($action)" "$($FB_URL):49000$($service.controlURL)"
21.
	return $resp.Envelope.Body
22.
}
23.

24.
#$resp = Get-Soaprequest "urn:dslforum-org:service:WLANConfiguration:1" "SetEnable" @{NewEnable = 1}
25.
$resp = Get-Soaprequest "urn:dslforum-org:service:WLANConfiguration:1" "SetEnable" @{NewEnable = 0}
26.
#$resp = Get-Soaprequest "urn:dslforum-org:service:DeviceInfo:1" "GetInfo"
27.
$resp
28.
$resp.GetInfoResponse
29.
Bitte warten ..
Mitglied: Herbert
17.01.2018 um 21:17 Uhr
Hallo Colinardo,
vielen Dank für das umfangreiche Script und Deine Arbeit.

Ich möchte die Anrufliste aus der Fritzbox auslesen und alle Einträge dabei bekommen
(nicht die üblichen 400).

Obwohl in Deinem Script die erforderlichen Parameter stehen, kommen als Antwort immer
nur die letzten 400 Anrufe.

In der xml-Datei steht der Parameter calls:400. Wenn ich das als zusätzlichen Parameter
einfüge ändert sich nichts.

Weißt Du ob das das hart codiert ist oder wie man das ändern kann?
Danke
Bitte warten ..
Mitglied: Pjordorf
17.01.2018 um 21:47 Uhr
Hallo,

Zitat von Herbert:
Weißt Du ob das das hart codiert ist oder wie man das ändern kann?
Bau mehr RAM ein und erweiter die Firmware dann kannst du die 1200000 getätigten Anrufe auch im LOG sehen Oder AVM fragen warum die immer nur von max. 400 Einträge sprechen...

Gruß,
Peter
Bitte warten ..
Mitglied: colinardo
17.01.2018, aktualisiert um 23:44 Uhr
Zitat von Herbert:

Hallo Colinardo,
vielen Dank für das umfangreiche Script und Deine Arbeit.
Servus Herbert, keine Ursache.
Ich möchte die Anrufliste aus der Fritzbox auslesen und alle Einträge dabei bekommen
(nicht die üblichen 400).

Obwohl in Deinem Script die erforderlichen Parameter stehen, kommen als Antwort immer
nur die letzten 400 Anrufe.
Das ist normal, bitte lese dazu
https://avm.de/service/fritzbox/fritzbox-7490/wissensdatenbank/publicati ...

Die Anzahl der Einträge in der Anrufliste ist begrenzt. Die Anrufliste erfasst bis zu 399 Einträge (ein- und ausgehender Gespräche insgesamt). Kommen weitere Einträge hinzu, werden die ältesten Einträge automatisch gelöscht.
Regelmäßiges Auslesen ist also angesagt oder richtige Telefonanlage besorgen.

Grüße Uwe
Bitte warten ..
Mitglied: CAREOLINE
30.01.2018 um 15:50 Uhr
Hallo colinardo,
schönes Script. Danke.

Ich würde gerne mit dem Script eine Portweiterleitung einrichten. Leider waren wir bisher nicht erfolgreich.
Ich kann bei der Fritzbox 6490 (Cable) alles auslesen, aber nichts schreiben.
Es kommt immer die FM "Invalid Args"

<UPnPError xmlns="urn:dslforum-org:control-1-0">
<errorCode>402</errorCode>
<errorDescription>Invalid Args</errorDescription>
</UPnPError>

Was mache ich falsch?

PS:
Um das Script bequem mehrfach hintereinander aus der Powershell ISE ausführen zu können, habe ich die Funktion InitRequest() eingebaut und rufe sie vor jedem Kommando auf.

  1. Request XML vorbereiten
function InitRequest(){
[xml]$script:request = @"
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/;>"
<s:Header>
<h:ClientAuth xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">
<Nonce></Nonce>
<Auth></Auth>
<UserID></UserID>
<Realm></Realm>
</h:ClientAuth>
</s:Header>
<s:Body>
</s:Body>
</s:Envelope>
"@
}

Gruß CAREOLINE
Bitte warten ..
Mitglied: colinardo
31.01.2018, aktualisiert um 16:09 Uhr
Servus CAREOLINE,
das ist ein Bug der Fritzbox, wenn alle Parameter korrekt angegeben wurden die Portweiterleitung noch nicht existiert und man die Funktion mehrfach (ca. 10-15 mal) hintereinander aufruft akzeptiert sie den Request irgendwann. Auf den Fehler habe ich AVM schon vor einiger Zeit darauf aufmerksam gemacht, da ich hier nur eine 7390 zum Test habe die ja jetzt nicht mehr mit Updates versorgt wird kann ich nicht sagen ob es schon in neueren Firmware-Versionen gefixt wurde. In der 6.8 auf jeden Fall nicht.

Grüße Uwe
Bitte warten ..
Mitglied: Bugger
13.09.2018 um 12:42 Uhr
Hi,

gibt es das auch als bash script? Oder zumindest die Portfreigabe?
Ich hätte gerne ein Script das ich auf meiner NAS ausführen kann und einen Port öffnet bzw. wieder löscht. Habe leider nur das HIER gefunden aber das ist nur für einen reboot der Box und ich weiß nicht wie die Parameter angepasst werden müssten. Jemand eine Idee?
Bitte warten ..
Mitglied: colinardo
13.09.2018, aktualisiert um 12:56 Uhr
Zitat von Bugger:
gibt es das auch als bash script?
Servus,
klar, sind alles simple SOAP Requests die du mit curl absetzen kannst:
https://znil.net/index.php?title=FritzBox_Status_Informationen_per_Upnp_ ...
Die Parameter findest du ja oben in der verlinkten Doku von AVM und in meiner Funktion.
Gibt auch eine PHP Bibliothek die du nutzen kannst.
Bitte warten ..
Mitglied: Bugger
13.09.2018 um 13:38 Uhr
Hi,

danke. Und die Parameter habe ich gesehen und ich habe mir auch die Doku von AVM angeguckt aber nie ist irgendwo mal ein kompletter Link zur Portfreigabe zu finden. Wie hänge ich denn die einzelnen Parameter an den Link? Ich habe das Script schonmal angepasst, aber irgendwo muss ich ja jetzt die Parameter inzufügen mit tüttelchen und so^^

01.
###=======###
02.
# Variablen #
03.
###=======###
04.

05.
IPS="192.168.178.1"
06.

07.
FRITZUSER=""
08.
FRITZPW="geheim"
09.

10.

11.
###====###
12.
# Skript #
13.
###====###
14.

15.
location="/upnp/control/wanpppconn1"
16.
uri="dslforum-org:service:WANPPPConnection:1"
17.
action='AddPortMapping'
18.

19.
for IP in ${IPS}; do
20.
	curl -k -m 5 --anyauth -u "$FRITZUSER:$FRITZPW" http://$IP:49000$location -H 'Content-Type: text/xml; charset="utf-8"' -H "SoapAction:$uri#$action" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><u:$action xmlns:u='$uri'></u:$action></s:Body></s:Envelope>" -s > /dev/null
21.
done
Bitte warten ..
Mitglied: colinardo
13.09.2018, aktualisiert um 14:09 Uhr
Für ein Portmapping sieht der zu sendende SOAP-Request als Beispiel so aus:
<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:AddPortMapping xmlns:u="urn:dslforum-org:service:WANPPPConnection:1">
      <NewRemoteHost>0.0.0.0</NewRemoteHost>
      <NewLeaseDuration>0</NewLeaseDuration>
      <NewEnabled>1</NewEnabled>
      <NewInternalClient>192.168.1.10</NewInternalClient>
      <NewExternalPort>25000</NewExternalPort>
      <NewProtocol>TCP</NewProtocol>
      <NewInternalPort>25000</NewInternalPort>
      <NewPortMappingDescription>Testmapping</NewPortMappingDescription>
    </u:AddPortMapping>
  </s:Body>
</s:Envelope>
Die Parameter stehen so auch komplett in der Doku im Abschnitt zu der Funktion AddPortMapping ...
https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanip ...
https://avm.de/service/schnittstellen/

Ein testweise abgesetztes
01.
curl -k --anyauth -u "USER:PASS" "http://fritz.box:49000/upnp/control/wanpppconn1" -H 'Content-Type: text/xml; charset="utf-8"' -H 'SOAPAction:urn:dslforum-org:service:WANPPPConnection:1#AddPortMapping' --data-binary @request.xml
wurde hier auf einer 7590 erfolgreich abgesetzt.

Achtung Die interne IP für die Portweiterleitung muss an der Fritze als Client bereits bekannt sein, sonst gibt sie 'ungültiger Parameter' zurück.

Für die Zukunft nutze besser den https Port der Fritze sonst gehen die Credentials plaintext über die Leitung.
Bitte warten ..
Mitglied: Bugger
13.09.2018, aktualisiert um 14:48 Uhr
Super danke, allerdings bekomme ich diese Fehlermeldung:

01.
<?xml version="1.0"?>
02.
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
03.
<s:Body>
04.
<s:Fault>
05.
<faultcode>s:Client</faultcode>
06.
<faultstring>UPnPError</faultstring>
07.
<detail>
08.
<UPnPError xmlns="urn:schemas-upnp-org:control-1-0">
09.
<errorCode>401</errorCode>
10.
<errorDescription>Invalid Action</errorDescription>
11.
</UPnPError>
12.
</detail>
13.
</s:Fault>
14.
</s:Body>
Dachte es liegt an dem von dir beschriebenen Problem mit den Portfreigaben aber die Fehlermeldung ist anders als die weiter oben und es funktioniert auch nach 10-15 mal nicht. Das Standard Script mit dem Reboot funktioniert, also der Zugang funktioniert auf jeden Fall.

Hier das komplette script:

01.
###=======###
02.
# Variablen #
03.
###=======###
04.

05.
IPS="192.168.178.1"
06.

07.
FRITZUSER=""
08.
FRITZPW="geheim"
09.

10.

11.
###====###
12.
# Skript #
13.
###====###
14.

15.
location="/upnp/control/wanpppconn1"
16.
uri="dslforum-org:service:WANPPPConnection:1"
17.
action='AddPortMapping'
18.

19.
for IP in ${IPS}; do
20.
	curl -k -m 5 --anyauth -u "$FRITZUSER:$FRITZPW" http://$IP:49000$location -H 'Content-Type: text/xml; charset="utf-8"' -H "SoapAction:$uri#$action" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><u:$action xmlns:u='$uri'><NewRemoteHost>0.0.0.0</NewRemoteHost><NewLeaseDuration>0</NewLeaseDuration><NewEnabled>1</NewEnabled><NewInternalClient>192.168.178.100</NewInternalClient><NewExternalPort>54321</NewExternalPort><NewProtocol>TCP</NewProtocol><NewInternalPort>54321</NewInternalPort><NewPortMappingDescription>Testmapping</NewPortMappingDescription></u:$action></s:Body></s:Envelope>" -s
21.
done
Bitte warten ..
Mitglied: colinardo
13.09.2018, aktualisiert um 15:51 Uhr
Wunder mich nicht, die Fritte ist hier sehr penibel was Konventionen angeht du nutzt hier erstens Hochkommas statt Anführungszeichen in deinem Plaintextmails übermittelten XML und der SOAPaction header ist auch Casesensitive. Hier kommt es auf jede Kleinigkeit an. Also mach es so wie ich oben und du wirst sehen es geht.
Weitere Fragen bitte nur via PM, das gehört nicht mehr in diesen Thread. MERCI.
Bitte warten ..
Mitglied: Bugger
13.09.2018 um 16:25 Uhr
Ich poste hier nochmal abschließend, da es keine Frage ist und evtl. für andere interessant ist :

Habe es gemacht wie du aber bekomme jetzt den 402 Fehler wie oben. Habe eine 7390 und da funktioniert es wohl einfach nicht. Wird Zeit für was neues. ^^

Trotzdem vielen Dank für deine Unterstützung.
Bitte warten ..
Mitglied: colinardo
13.09.2018, aktualisiert um 16:58 Uhr
Habe eine 7390
Wird es vermutlich sein, habe meinen Testpark an Routern hier erst vor kurzem aktualisiert. Mit der 7390 gab es in dem Zusammenhang tatsächlich vermehrte Probleme die ist jetzt rausgeflogen, mit der neuen Fritte seither nicht mehr gesehen.
By the way, die ganz alten 7390er (SN beginnend mit A) bekommen seit einigen Monaten den Todesstoß an Telekom DSLAMs. Wenn die T-Com klamm heimlich Vectoring auf die DSLAMs prügelt wollen die alten Fritzen nur noch im Fallback-Modus synchronisieren obwohl vorher problemlos 50MBit/s möglich waren, das Modem der 7390 ist ja bekanntermaßen nicht das beste. Nur leider produziert das für viele neuen Elektroschrott, wenn sie die Dinger nicht als Repeater oder AP oder Telefonanlage an einem neuen Modem weiter nutzen, obwohl das Modem eigentlich noch in Ordnung ist.
Bitte warten ..
Mitglied: fenster3
05.10.2018 um 18:12 Uhr
Hallo ich würde gern das das Skript benutzen aber leider bekomme ich beim Ausführen schon eine Fehlermeldung kann mir jemand helfen?
fehler - Klicke auf das Bild, um es zu vergrößern
Bitte warten ..
Mitglied: Pjordorf
05.10.2018 um 18:57 Uhr
Hallo,

Zitat von fenster3:
Hallo ich würde gern das das Skript benutzen aber leider
Welches Skript denn nun ganz genau oder welche teile hast du in dein Unbenannt1.ps1 jetzt drinnen oder zusammenkopiert? Hier gibt es doch einiges an PS1 Skripten.
Welches OS verwendest du und welche Rechte?
Mit welcher Fritte soll zusammengearbeitet werden?
Ansonsten was steht in dein Skript in Zeile 48 denn an Stelle 13 drin?

Gruß,
Peter
Bitte warten ..
Mitglied: fenster3
05.10.2018 um 20:11 Uhr
Hallo ich hab das gesamte Skript: "Powershell Fritzbox über TR-064 steuern"von ganz am Anfang der Seite kopiert und Ausgeführt

48: throw $_.Exception.InnerException

Fritzbox 7390

OS Windows 7
Bitte warten ..
Mitglied: fenster3
08.10.2018 um 17:47 Uhr
So nun nochmal etwas genauer

OS Windows 7 Ultimate SP1
Fritzbox 7390 FritzOS 06.83


Ich hab ISE als Admin Ausgeführt

rechte im ISE hab ich wie beschrieben auf Set-ExecutionPolicy RemoteSigned -Force
Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32

Der Code sieht wie folgt aus:

01.
<#
02.
    Fritzbox via TR-064 (uPNP-SOAP) steuern und auslesen 
03.
      ------------ @colinardo https://www.administrator.de ---------------
04.
#>
05.
# ====== Variablen =========
06.
$FB_FQDN = "fritz.box"
07.
$USERNAME = 'admin'
08.
$PASSWORD = '123'
09.
# ====== ENDE Variablen ====
10.

11.
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
12.

13.
# XML Service-Beschreibungs XML abrufen und Namespace setzen
14.
[xml]$serviceinfo = Invoke-RestMethod -Method GET -Uri "http://$($FB_FQDN):49000/tr64desc.xml"
15.
[System.Xml.XmlNamespaceManager]$ns = new-Object System.Xml.XmlNamespaceManager $serviceinfo.NameTable
16.
$ns.AddNamespace("ns",$serviceinfo.DocumentElement.NamespaceURI)
17.
# Ignore Certificate Errors
18.
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
19.

20.

21.
# Funktion zum senden eines SOAP Requests
22.
function Execute-SOAPRequest {
23.
    param(
24.
        [Xml]$SOAPRequest,
25.
        [string]$soapactionheader,
26.
        [String]$URL
27.
    )
28.
    try{
29.
        $wr = [System.Net.WebRequest]::Create($URL)
30.
        $wr.Headers.Add('SOAPAction',$soapactionheader)
31.
        $wr.ContentType = 'text/xml; charset="utf-8"'
32.
        $wr.Accept      = 'text/xml'
33.
        $wr.Method      = 'POST'
34.
        $wr.Credentials = [System.Net.NetworkCredential]::new($USERNAME,$PASSWORD)
35.

36.
        $requestStream = $wr.GetRequestStream()
37.
        $SOAPRequest.Save($requestStream)
38.
        $requestStream.Close()
39.
        [System.Net.HttpWebResponse]$wresp = $wr.GetResponse()
40.
        $responseStream = $wresp.GetResponseStream()
41.
        $responseXML = [Xml]([System.IO.StreamReader]($responseStream)).ReadToEnd()
42.
        $responseStream.Close()
43.
        return $responseXML
44.
    }catch {
45.
        if ($_.Exception.InnerException.Response){
46.
            throw ([System.IO.StreamReader]($_.Exception.InnerException.Response.GetResponseStream())).ReadToEnd()
47.
        }else{
48.
            throw $_.Exception.InnerException
49.
        }
50.
    }
51.
}
52.

53.
function New-Request {
54.
    param(
55.
        [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$urn,
56.
        [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$action,
57.
        [hashtable]$parameter = @{},
58.
        $Protocol = 'https'
59.
    )
60.
        # SOAP Request Body Template
61.
        [xml]$request = @"
62.
<?xml version="1.0"?>
63.
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
64.
    <s:Body>
65.
    </s:Body>
66.
</s:Envelope>
67.
"@
68.
    # Service auslesen
69.
    $service = $serviceinfo.SelectNodes('//ns:service',$ns) | ?{$_.ServiceType -eq $URN}
70.
    if(!$service){throw "URN does not exist."}
71.
    # Action Element erstellen
72.
    $actiontag = $request.CreateElement('u',$action,$service.serviceType)
73.
    # Parameter erstellen
74.
    $parameter.GetEnumerator() | %{
75.
          $el = $request.CreateElement($_.Key)
76.
          $el.InnerText = $_.Value
77.
          $actiontag.AppendChild($el)| out-null
78.
    }
79.
    # Action Element einfügen
80.
    $request.GetElementsByTagName('s:Body')[0].AppendChild($actiontag) | out-null
81.
    # Send request
82.
    $resp = Execute-SOAPRequest $request "$($service.serviceType)#$($action)" "$($Protocol)://$($FB_FQDN):$(@{$true=$script:secport;$false=49000}[($Protocol -eq 'https')])$($service.controlURL)"
83.
    return $resp
84.
}
85.

86.
# Security-Port (https) abfragen
87.
$script:secport = (New-Request -urn "urn:dslforum-org:service:DeviceInfo:1" -action 'GetSecurityPort' -proto 'http').Envelope.Body.GetSecurityPortResponse.NewSecurityPort
88.

89.

90.
# Rufnummer mit der Wählhilfe wählen
91.
function Dial-FBNumber {
92.
    param(
93.
        [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$number
94.
    )   
95.
    $parameter = @{
96.
        'NewX_AVM-DE_PhoneNumber' = $number
97.
    }
98.
    $resp = New-Request -urn 'urn:dslforum-org:service:X_VoIP:1' -action 'X_AVM-DE_DialNumber' -parameter $parameter
99.
    return $resp.envelope.body
100.
}
Bitte warten ..
Mitglied: SamLowry
19.11.2018 um 21:20 Uhr
Hi,

kleiner Fehler in Zeile 134.

01.
$resp = New-Request -urn 'urn:dslforum-org:service:WANPPPConnection:1' -action 'GetPortMappingNumberOfEntries'  
02.
[int]$cnt = $result.Envelope.Body.GetPortMappingNumberOfEntriesResponse.NewPortMappingNumberOfEntries 
besser:

01.
$result = New-Request -urn 'urn:dslforum-org:service:WANPPPConnection:1' -action 'GetPortMappingNumberOfEntries' 
02.
[int]$cnt = $result.Envelope.Body.GetPortMappingNumberOfEntriesResponse.NewPortMappingNumberOfEntries

Ansonsten funktioniert das Script mit einer 7412 (1&1, FRITZ!OS 06.85) gut, Add-FBPortMapping funktioniert beim ersten Aufruf.

Gruß
Sam
Bitte warten ..
Mitglied: colinardo
20.11.2018, aktualisiert um 09:25 Uhr
Servus Sam,
vielen Dank für deine Rückmeldung, da hatte ich wohl bei der Umstellung die Variable vergessen. Fehler ist korrigiert. Merci.

Grüße Uwe
Bitte warten ..
Mitglied: Daimonion
22.12.2018 um 20:19 Uhr
Moin

Ist ja schön das hier in den Kommentaren immer noch so viel Aktivität ist, und das der Autor noch aktiv antwortet. Danke mal für das grundsätzliche Skript.

Ich wollte mal versuchen das ganze ein wenig für meine Fälle zu erweitern, habe aber ein syntaktisches Problem bei einem AVM spezifischen Value aus dem URN.

Rufe ich die http://fritz.box:49000//hostsSCPD.xml für die URN urn:dslforum-org:service:Hosts:1 ab, so kann ich z.B. die action X_AVM-DE_GetMeshListPath abfragen.

Blöderweise motzt mir das Skript dann rum wenn ich folgenden Request absetzen will:

01.
function Get-FBLanMesh(){
02.
    $resp = New-Request -urn 'urn:dslforum-org:service:Hosts:1' -action 'X_AVM-DE_GetMeshListPath'
03.
    return $resp.Envelope.body.X_AVM-DE_GetMeshListPathResponse
04.
}
Schon der Syntax von

01.
return $resp.Envelope.body.X_AVM-DE_GetMeshListPathResponse


wird mir in der IDE nicht korrekt angezeigt und das Skript bringt auch prompt einen Fehler.

In D:\Skripte_Programmierung\FB_Powershellzugriff.ps1:209 Zeichen:37

return $resp.Envelope.body.X_AVM-DE_GetMeshListPathResponse

~~~

Unerwartetes Token "-DE" in Ausdruck oder Anweisung.
In D:\Skripte_Programmierung\FB_Powershellzugriff.ps1:209 Zeichen:40

return $resp.Envelope.body.X_AVM-DE_GetMeshListPathResponse

~~~~~~~~~~~~~~~~~~~~~~~~

Unerwartetes Token "_GetMeshListPathResponse" in Ausdruck oder Anweisung.
+ CategoryInfo : ParserError: ( [], ParseException
+ FullyQualifiedErrorId : UnexpectedToken

Syntaktisch ist der Bindestrich wahrscheinlich eher der Powershell zuzurechnen, weswegen auch der Fehler kommt, aber wie könnte ich das beheben? in der Funktion New-Request sehe ich dafür auf die schnelle keine Möglichkeit.

Wäre cool, wenn da jemand einen Tipp dazu hätte.

Grüße
Daimonion
Bitte warten ..
Mitglied: colinardo
22.12.2018, aktualisiert um 22:03 Uhr
Servus @Daimonion , willkommen auf Administrator.de!
Syntaktisch ist der Bindestrich wahrscheinlich eher der Powershell zuzurechnen, weswegen auch der Fehler
Korrekt.
Ohne die spezielle AVM Funktion jetzt selbst getestet zu haben und nur um die Frage zu beantworten wie man Properties mit Sonderzeichen aufruft, das geht ganz einfach indem du die Property mit Anführungszeichen oder Hochkomma einschließt
01.
$resp.Envelope.body.'X_AVM-DE_GetMeshListPathResponse'
Frohes Fest
Grüße Uwe
Bitte warten ..
Mitglied: Daimonion
23.12.2018 um 09:59 Uhr
Super, danke dir.

So hat es nun auch geklappt. Jetzt mal schauen was die FB noch alles so Preis gibt.

Frohe Weihnachten
Daimonion
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Powershell elevated
Tipp von AnkhMorporkBatch & Shell2 Kommentare

Ein kleiner Tipp am Rande für alle PS-Novizen (ich wars einfach leid): Um eine Konsole mit elevated rights schnell ...

Batch & Shell

Powershell: Googlemail (GMail) nativ mit Powershell verwalten

Anleitung von colinardoBatch & Shell2 Kommentare

1. Vorwort Google bietet über die GMail-API die Voraussetzungen um sein Google-Mail-Konto über diverse Programmierschnittstellen (PHP/Javascript/etc. pp) zu verwalten. ...

Batch & Shell

Weiterentwicklung von Powershell

Information von Penny.CilinBatch & Shell

Anbei ein Artikel im Heise Newsticker bzgl. Powershell: Systemverwaltung: PowerShell goes Cross-Plattform

Windows 10

Powershell 5 BSOD

Tipp von agowa338Windows 108 Kommentare

Aktuell gibt es in PowerShell (Version 5.11.4393.206) einen sehr fiesen Bug. Wenn man die PowerShell "Als Administrator" startet und ...

Neue Wissensbeiträge
LAN, WAN, Wireless
Sophos RED50 stürzt ab und ist danach tot
Information von Ex0r2k16 vor 2 TagenLAN, WAN, Wireless3 Kommentare

Hey, nach meinem Thread bin ich durch Zufall auf das hier gestoßen: Also wenn ihr UTMs und RED50's im ...

Windows 10

Microsoft macht Bluetooth absichtlich kaputt: Windows 10 Update blockiert Bluetooth-Verbindungen zu Android

Tipp von 1Werner1 vor 2 TagenWindows 107 Kommentare

Moin, jetzt spinnt MS total , was muss ich da auf Chip.de lesen: Auch im Juni schließt Microsoft im ...

Soziale Netzwerke

Facebook - künftig ohne Account des Bundeslandes Sachsen-Anhalt

Information von VGem-e vor 3 TagenSoziale Netzwerke3 Kommentare

Servus, mal sehen, ob andere öffentliche Einrichtungen folgen wollen/können Gruß

Humor (lol)
Facebook Mailer auf NIX-Spamlist
Information von Henere vor 3 TagenHumor (lol)

Eben aus dem Log meines Postfix gefischt. Recht haben Sie. FB ist SPAM :-) lachende Grüße, Henere

Heiß diskutierte Inhalte
Router & Routing
Synology NAS in anderem Subnetz nicht erreichbar
Frage von Tech1KonniRouter & Routing24 Kommentare

Hallo Leute, ich bin Software-Entwickler und daher auch etwas bewandert in den Grundkenntnissen der Netzwerktechnik. Aktuell habe ich allerdings ...

Netzwerke
Zugriff auf mehrere Clients via RDP
Frage von xXMariusXxNetzwerke11 Kommentare

Moin, ich würde gerne auf mehrere Clients in einem Netzwerk via RDP zugreifen. Gibt es eine elegantere Lösung als ...

Windows 7
RDP funktioniert nur einmal
Frage von Sc0rc3dWindows 710 Kommentare

Hi, ich arbeite mittels Remote Desktop von zu Hause. Manchmal per VPN und manchmal direkt (Portfreigabe 3389 -> 46XXX). ...

Windows Server
Probleme Installation Windows Server 2019
Frage von AK-47.2Windows Server8 Kommentare

Hallo zusammen, ich habe das Problem einen Windows Server 2019 auf ein Testsystem zu bringen. Das Mainboard ist ein ...