Skip to content

Instantly share code, notes, and snippets.

@joasch
Last active April 14, 2023 10:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joasch/e48738417ec1efcc963a96bbb3f34cba to your computer and use it in GitHub Desktop.
Save joasch/e48738417ec1efcc963a96bbb3f34cba to your computer and use it in GitHub Desktop.
Powershell FritzBox Dialer
#IBJS.net 20160803, in Anlehnung an fb_dial.vbs von Michael Engelke 2012
#Fritz!Box Wählhilfe mit Powershell von Joachim Schubert ibjs.net 2016
#Der Fritz-Box Benutzername für diesen Konstellation lautet NAS-Read
#Das encrypted Fritz-Box Passwort ist vorher in einer Datei Securestring.fb abzulegen.
#ConvertFrom-SecureString (read-host -AsSecureString -Prompt "Passwort ") >SecureString.fb
#Als Default Rufnummer nehme ich hier die Zeitansage der Telekom, die aber kostenpflichtig ist
#Alternativ nehme ich zum Testen eine interne Nummer wie **610, damit kann ich es zwar klingeln lassen,
#kann aber bisher die internen Gespräche nicht an das Wahlgerät **613 übergeben, es legt sofort auf.
#Zum Aufbau einer Verbindung lege ich eine sonst unbenutzte Festnetznummer auf das Zielgerät.
#Erprobung an Windows 7/ Powershell 5/ Gigaset A415 **613, Gigaset SL1 **610/ FritzBox 6360/Unity Media VoIP
#Die Übergabe des Anrufs erfolgt so:
#Das Script baut die Verbindung auf und zeigt es mit einem Rufzeichen= 3x Kammerton an.
#Sobald zu hören, am Wahlgerät die grüne Rufannahmetaste solange drücken, bis Wählhilfe Nummer am Display erscheint (ca. 1s)
#Das Rufzeichen ist am Wählgerät zu hören.
#
#Einbindung als Telefondienst per Registry:
#HKEY_CLASSES_ROOT\tel\shell\open\command
#[Reg_SZ]: "C:\WINDOWS\System32\WScript.exe" "C:\Windows\fb_dial.vbs" '%1' # altes vbs script wird nun ersetzt:
#[Reg_SZ]: "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "C:\Windows\fb-dial.ps1" '%1'
#Dieses Script und SecureString.fb kommen nach C:\windows
#mit tel:01804100100 kann nun gewählt werden
#
Param([string]$Nummer="0180 4100100") #Zeitansage Telecom für 20 ct
#
function md5($text){
$md5 = New-Object System.Security.Cryptography.MD5CryptoServiceProvider
$md5.ComputeHash([Text.Encoding]::utf8.getbytes($text))|%{$HC=''}{$HC+=$_.tostring("x2")}{$HC}
}
#
#Achtung [string] im Parameter nicht vergessen sonst wird aus 0175… -> 175…
#und sie lernen einen Anschluss Ihrer Nachbarschaft kennen
#
Function dial([string]$Nummer){
if (!$Nummer){$Nummer="**610"}
#Nummernumwandlungfür Fritz in De, ohne Telefonanlage
$Nummer=([regex]::Replace($Nummer,"(?i)^tel:",""))
$Nummer=([regex]::Replace($Nummer,"^\+","00"))
$Nummer=[regex]::Replace($Nummer,"[^0-9*]","")
$Nummer=[regex]::Replace($Nummer,"0049","0")
$Password=get-content .\securestring.fb|ConvertTo-SecureString
$user="NAS-Read"
$hostfb="http://fritz.box" #$Host wird vom OS genutzt
$page_login= "/login_sid.lua"
$page_dial= "/fon_num/fonbook_list.lua?dial="+$Nummer+"&sid="
$page_logout="/fon_num/fonbook_list.lua?logout=1&sid="
$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password)
$pass=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($Ptr)
$R1 = Invoke-WebRequest ($hostfb+$page_login)
$Challenge=([xml]$R1).sessioninfo.challenge
$Code1=$Challenge+"-"+$Pass
$Code2=[char[]]$Code1|%{$Code2=""}{$Code2+=$_+[Char]0}{$Code2}
$Response= "response=" + $Challenge + "-" + $(md5($Code2))
$Response+="&username="+$user #Response ist die Antwort auf die Challenge
$R2=Invoke-WebRequest -Uri ($hostfb+$page_login) -Method Post -Body $Response
$SID=([xml]($R2.Content)).ChildNodes.sid
$URiDial= $hostfb+$page_dial+$SID
$URILogout=$hostfb+$page_logout+$SID
$RequestCall=Invoke-WebRequest -Uri $URIDial
$RequestLogout=Invoke-WebRequest -Uri $URILogout
1..3|%{[console]::beep(440,1000);start-sleep(1)}
}
dial $Nummer
@enorm1
Copy link

enorm1 commented Oct 19, 2022

Das Script ist Gold wert. Danke an Joasch und Engelke !

Hi, nach Anpassungen in Win 11 (Verknüpfungen Registry) und für die Fritzbox 7490 (Version 7.29) läuft es wunderbar. Auch ohne beim Wählen abzuheben am Telefon. Dann klingelt das eigene Telefon, wenn die Verbindung aufgebaut wurde.

  1. #IBJS.net 20160803, in Anlehnung an fb_dial.vbs von Michael Engelke 2012
  2. #Fritz!Box Wählhilfe mit Powershell von Joachim Schubert ibjs.net 2016
  3. #Der Fritz-Box Benutzername für diesen Konstellation lautet NAS-Read
  4. #Das encrypted Fritz-Box Passwort ist vorher in einer Datei Securestring.fb abzulegen.
  5. #ConvertFrom-SecureString (read-host -AsSecureString -Prompt "Passwort ") >SecureString.fb
  6. #++ andere Weise um den SecureString zu erstellen
  7. #++ es hat bei mir einfach nicht klappen wollen, also:
  8. #++ $Secure = Read-Host -AsSecureString
  9. #++ $Secure
  10. #++ System.Security.SecureString
  11. #++ $Encrypted = ConvertFrom-SecureString -SecureString $Secure
  12. #++ $Encrypted
  13. #++ 01aaa000d08c9ddf0115d1118c7a00c04fc297eb010000001a114d45b8dd3f4aa11ad7c0abdae9800000000002000000000003660000a8000000100000005df63cea84bfb7d70bd6842e7efa79820000000004800000a000000010000000f10cd0f4a99a8d5814d94e0687d7430b100000008bf11f1960158405b2779613e9352c6d14000000e6b7bf46a9d485ff211b9b2a2df3bd6eb67aae41
  14. #++ einfach die Ausgabe des $Encrypted kopieren und in SecureString.fb hinein paste.
  15. #Als Default Rufnummer nehme ich hier die Zeitansage der Telekom, die aber kostenpflichtig ist
  16. #Alternativ nehme ich zum Testen eine interne Nummer wie **610, damit kann ich es zwar klingeln lassen,
  17. #kann aber bisher die internen Gespräche nicht an das Wahlgerät **613 übergeben, es legt sofort auf.
  18. #Zum Aufbau einer Verbindung lege ich eine sonst unbenutzte Festnetznummer auf das Zielgerät.
  19. #Erprobung an Windows 7/ Powershell 5/ Gigaset A415 **613, Gigaset SL1 **610/ FritzBox 6360/Unity Media VoIP
  20. #Die Übergabe des Anrufs erfolgt so:
  21. #Das Script baut die Verbindung auf und zeigt es mit einem Rufzeichen= 3x Kammerton an.
  22. #Sobald zu hören, am Wahlgerät die grüne Rufannahmetaste solange drücken, bis Wählhilfe Nummer am Display erscheint (ca. 1s)
  23. #Das Rufzeichen ist am Wählgerät zu hören.
  24. #Einbindung als Telefondienst per Registry:
  25. #--HKEY_CLASSES_ROOT\tel\shell\open\command
  26. #-- [Reg_SZ]: "C:\WINDOWS\System32\WScript.exe" "C:\Windows\fb_dial.vbs" '%1' # altes vbs script wird nun ersetzt:
  27. #--"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "C:\Windows\fb-dial.ps1" '%1'
  28. #-- [Reg_SZ]:
  29. ##++ ich habe mir erst den TAPICall (findet man bei google) installiert und den dann umgebogen. Vorher habe ich es nicht geschafft URL:tel zuzuweisen.
  30. #++ registry bei Computer\HKEY_CLASSES_ROOT\TAPICall.tel\shell\open\command
  31. #++ als standard wert das hier eintragen:
  32. #++ powershell.exe -noprofile -executionpolicy bypass -file c:\windows\fb-dial.ps1 '%1'
  33. #Dieses Script und SecureString.fb kommen nach C:\windows
  34. #mit tel:01804100100 kann nun gewählt werden
  35. #++ ich habe einen Benutzer in der Fritz box erstellt, dieser muss Zugriff auf die Einstellungen haben. (FRITZ!Box Settings Users with this right can view and edit all FRITZ!Box settings.)
  36. #++ Parameter wird bei mir aus einem Programm mit .tel: übergeben, somit ist die Nummer der 2. Übergabestring
  37. Param([string]$A="Tel",[string]$Nummer="01804100100") #Zeitansage Telecom für 20 ct
  38. #++Ausgabe der Telefonnummer und Meldung
  39. #write-host $Nummer
  40. write-host "Bitte grüne Ruftaste lange drücken" #oder warten bis das eigene Telefon die Verbindung aufgebaut hat und selbst klingelt.
  41. function md5($text){
  42. $md5 = New-Object System.Security.Cryptography.MD5CryptoServiceProvider
  43. $md5.ComputeHash([Text.Encoding]::utf8.getbytes($text))|%{$HC=''}{$HC+=$_.tostring("x2")}{$HC}
  44. }
  45. #Achtung [string] im Parameter nicht vergessen sonst wird aus 0175… -> 175…
  46. #und sie lernen einen Anschluss Ihrer Nachbarschaft kennen
  47. Function dial([string]$Nummer){
  48. if (!$Nummer){$Nummer="**610"}
  49. #Nummernumwandlungfür Fritz in De, ohne Telefonanlage
  50. $Nummer=([regex]::Replace($Nummer,"(?i)^tel:",""))
  51. $Nummer=([regex]::Replace($Nummer,"^+","00"))
  52. $Nummer=[regex]::Replace($Nummer,"[^0-9*]","")
  53. $Nummer=[regex]::Replace($Nummer,"0049","0")
  54. #-- $Password=get-content .\securestring.fb|ConvertTo-SecureString
  55. #++ aus einem Programm heraus brauche ich den Pfad direkt
  56. $Password=get-content C:\windows\securestring.fb|ConvertTo-SecureString
  57. $user="NAS-Read"
  58. $hostfb="http://fritz.box" #$Host wird vom OS genutzt
  59. $page_login= "/login_sid.lua"
  60. #-- $page_dial= "/fon_num/fonbook_list.lua?dial="+$Nummer+"&sid="
  61. #++
  62. $page_dial= "/fon_num/foncalls_list.lua?dial="+$Nummer+"&sid="
  63. #-- $page_logout="/fon_num/fonbook_list.lua?logout=1&sid="
  64. #++
  65. $page_logout="/home/home.lua?logout=1&sid="
  66. $Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password)
  67. $pass=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($Ptr)
  68. $R1 = Invoke-WebRequest ($hostfb+$page_login)
  69. $Challenge=([xml]$R1).sessioninfo.challenge
  70. $Code1=$Challenge+"-"+$Pass
  71. $Code2=[char[]]$Code1|%{$Code2=""}{$Code2+=$_+[Char]0}{$Code2}
  72. $Response= "response=" + $Challenge + "-" + $(md5($Code2))
  73. $Response+="&username="+$user #Response ist die Antwort auf die Challenge
  74. $R2=Invoke-WebRequest -Uri ($hostfb+$page_login) -Method Post -Body $Response
  75. $SID=(xml).ChildNodes.sid
  76. $URiDial= $hostfb+$page_dial+$SID
  77. $URILogout=$hostfb+$page_logout+$SID
  78. $RequestCall=Invoke-WebRequest -Uri $URIDial
  79. $RequestLogout=Invoke-WebRequest -Uri $URILogout
  80. 1..3|%{[console]::beep(440,1000);start-sleep(1)}
  81. }
  82. dial $Nummer

@enorm1
Copy link

enorm1 commented Oct 20, 2022

Ich habe es geschafft fb-dial in der Registry einzubinden: , somit keine Installation des TAPICALL notwendig!
Die Registry Einträge von Hand, wie oben beschrieben, kann man dann weg lassen.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\fb-dial.callto]

#[HKEY_CURRENT_USER\Software\Classes\fb-dial.callto\DefaultIcon]
#@="C:\Users\Phone_43546.ico"

[HKEY_CURRENT_USER\Software\Classes\fb-dial.callto\Shell]

[HKEY_CURRENT_USER\Software\Classes\fb-dial.callto\Shell\Open]

[HKEY_CURRENT_USER\Software\Classes\fb-dial.callto\Shell\Open\Command]
@="powershell.exe -noprofile -executionpolicy bypass -file c:\windows\fb-dial.ps1 '%1'"

[HKEY_CURRENT_USER\SOFTWARE\fb-dial]
[HKEY_CURRENT_USER\SOFTWARE\fb-dial\Capabilities]
"ApplicationDescription"="fb-dial"
"ApplicationName"="fb-dial"
[HKEY_CURRENT_USER\SOFTWARE\fb-dial\Capabilities\URLAssociations]
"callto"="fb-dial.callto"
"tel"="fb-dial.callto"
[HKEY_CURRENT_USER\SOFTWARE\RegisteredApplications]
"fb-dial"="Software\fb-dial\Capabilities"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment