3CX V16 3CX V18 3CX V20 Call Control API PowerShell 6.2 .Net Core
Update 16.06.2024: Dank des Hinweises von "ddthom", dass das Skript unter V20 nicht mehr funktioniert, habe ich eine Korrektur für V20 eingearbeitet. Offensichtlich MUSS man nun über PhoneSystem Reset arbeiten.
Die dll liegt unter Debian übrigens unter: /usr/lib/3cxpbx/3cxpscomcpp2.dll
Die ini-Datei unter Debian: /var/lib/3cxpbx/Bin/3CXPhoneSystem.ini
PowerShell Core lässt sich unter der Debian VM mittels den folgenden Befehlen installieren: wget https://github.com/PowerShell/PowerShell/releases/download/v7.4.2/powershell_7.4.2-1.deb_amd64.deb sudo dpkg -i powershell_7.4.2-1.deb_amd64.deb sudo apt-get install -f
Alter Beitrag: Da 3CX in der V16 auf .NET Core umgestellt hat, kann man nicht mehr nativ mit der PowerShell an die API herantreten. Hierfür muss zunächst PowerShell Core installiert werden.
Die Call Control API war in der Vergangenheit immer erst ab der PRO-Version nutzbar. Ob das mit der V16 immer noch erst ab der PRO-Edition möglich, konnte ich leider noch nicht testen.
Nach der Installation von PowerShell Core lässt sich diese dann über pswh.exe starten. Die Umgebung wird standardmäßig unter C:\Program Files\PowerShell\6\pwsh.exe installiert.
Die Zugangsdaten für die Call Control API befinden sich in der Windows Installation unter: C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini In dem Abschnitt "ConfService" findet man die relevanten Parameter zum Verbindungsaufbau zur Call Control API.
Die Initialisierung ist immer noch über denselben Weg wie über V15 möglich, auch wenn nun wohl ein anderer Weg über PhoneSystem Reset empfohlen wird. Da der alte Weg aber noch funktinioniert und für mich nachvollziehbarer ist, verwende ich noch diesen.
Auf Basis dieses Codes habe ich den nachfolgenden PowerShell-Code geschrieben um PhoneBook-Kontakte zu löschen bzw. anzulegen:
Add-Type -Path "C:\Program files\3CX Phone System\Bin\3cxpscomcpp2.dll" $PS = [TCX.Configuration.PhoneSystem] $PS::CfgServerHost = "127.0.0.1" $PS::CfgServerPort = 5485 $PS::CfgServerUser = "Username aus der INI-Datei" $PS::CfgServerPassword = 'Passwort aus der INI-Datei' $PS::ApplicationName = "ContactApp"
#until includung V18 the above worked #$t = ($PS::Root)
#beginning with v20 we need to use Reset $t = $PS::Reset($PS::ApplicationName, $PS::CfgServerHost, $PS::CfgServerPort, $PS::CfgServerUser, $PS::CfgServerPassword)
$t.WaitForConnect((New-TimeSpan -Seconds 30)) if ($t.Connected) { Write-Host "connection to call api established" $3CXTenant = $t.GetTenant() $PhoneBookEntries = $3CXTenant.GetPhoneBookEntries() Write-Host "Search for Entries being tagged with CustomContact" $OurTaggedPBEntries = $PhoneBookEntries | ? {$_.Tag -eq "CustomContact"} Write-Host "Found $($OurTaggedPBEntries.Count) Entries" if ($($OurTaggedPBEntries.Count) -gt 0) { Write-Host "Remove Entries beging tagged with LDAP" foreach ($OurTaggedPBEntry in $OurTaggedPBEntries) { $ContactDetail = "$($OurTaggedPBEntry.Firstname) $($OurTaggedPBEntry.Lastname) $($OurTaggedPBEntry.CompanyName)" try { Write-Host "Successfully removed Contact $ContactDetail" $OurTaggedPBEntry.Delete() } catch { Write-Error "Failed to remove Contact $ContactDetail" } } }
Write-Host "Creating new Contacts" while ($x -le 50) { try { $NewContact = $3CXTenant.CreatePhoneBookEntry() $NewContact.Firstname = "Herrmann$($x)" $NewContact.Lastname = "Mustermann$($x)" $NewContact.Phonenumber = "004444$($x)" $NewContact.Tag = "CustomContact" $NewContact.Save() $x++ } catch { Write-Error "Failed to Add Contact. $($_.Exception.Message)" } } $t.Disconnect() } else { Write-Error "connection to call api failed" }
Das Skript lädt die Bibliothek 3cxpscomcpp2.dll und baut initialisiert dann die Verbindung ($PS::Root) unter Verwendung der Verbindungsparameter. Die PowerShell muss hierfür privilegiert gestartet werden.
Über das Attribut "Connected" wird der erfolgreiche Verbindungsaufbau geprüft, anschließend werden zunächst alle Kontakte mit dem definierten Tag "CustomContact" ermittelt und anschließend in der foreach-Schleife einzeln entfernt. Dies erspart das updaten der Kontakte, welches aber natürlich auch möglich ist.
Anschließend werden beispielhaft mehrere Kontakte über die While-Schleife angelegt.
Über den Autor
Thomas Windscheif arbeitet bei excITe Consulting und ist langjähriger Berater im Bereich IT-Infrastruktur und Groupware. Sowohl Kleinunternehmen z. B. im Handwerk als auch der größere fertigende Mittelstand gehören zu seinem Projektumfeld. Im Wesentlichen gehören die Planung von Infrastruktur-Migrationen, Cloud-Lösungen (Microsoft 365), Groupware-Umgebungen (z. B. Exchange) und deren Umsetzung zu seinen Aufgaben. Insbesondere im Umfeld hybrider Identitätsumgebungen mit Entra Connect und den Möglichkeiten zur Härtung der IT-Landschaft konnte er in vielen Projekten Erfahrungen sammeln. Neues begeistert ihn aber ebenso und so unterstützt Thomas Windscheif auch bei themenfremden IT-Systemen, überall da wo er helfen kann.
Sein Ziel: Die Mehrwerte der heutigen IT-Lösungen für einfacheres und modernes Arbeiten beim Kunden einbringen.
Login
Sie haben ein ungelöstes Problem in Ihrer Exchange Server/Microsoft-Infrastruktur oder unter Microsoft 365? Treten Sie gerne mit mir in Kontakt.
Sowohl bei einfachen Umgebungen, als auch bei komplexen Multisite/Cloud-Topologien
unterstütze ich Sie -auch kurzfristig- sehr gerne.
- Spontaner Administrationsverlust unter Exchange Online - Und wie man es behebt! -
Zweimal in diesem Jahr hatte ich bei Kunden das Phänonem, dass spontan bestimmte Administrationsrechte unter Exchange Online fehlten, trotz der Rollenmitgliedschaft "Globaler Administrator" bzw. "Exchange Administrator".
Aus ungeklärten Gründen waren verschiedene RBAC-Rechte unter Exchange Online für "Organization Management" spontan verschwunden.
Im folgenden Artikel löse ich das Problem mit Skripten und erläutere das Vorgehen