Geschäftszeiten anhand eines Kalenders steuern

voipsonic-graz

Forum User
Basic Certified
Mitglied seit
19. November 2022
Beiträge
132
Hallo,

mein Vorhaben/meine Idee:
Ist es mit der 3CX möglich, die Geschäftszeiten anhand eines Kalenders oder auch einer Datenbank einzustellen?
Ein Kunde von mir (Apotheke) ist in einem Vertretungsrad mit anderen Apotheken und mit Nachtdienst in regelmäßigen Abständen (aktuell alle 12 Tage).
Die Apotheke hat auch einen Infoscreen vorne draußen und eine Sprechstelle für den Nachtdienst.

Das bedeutet:
Die Apotheke hat alle 12 Tage Nachtdienst, da soll die TK dann auf das Nachttelefon, oder was auch immer umstellen und am Infoscreen steht dann "Wir haben Bereitschaftsdienst" oder so.
Der Infoscreen und die Sprechstelle ist hier mal nicht relevant. Mir geht es darum, dass eben die TK automatisiert zu diesen bestimmten Tagen auch Anrufe durch lässt.

Ich weiß, dass aktuell viele Apotheken mit einer Elmeg-TK ausgestattet sind und darauf die Öffnungszeiten mittels Kalender gesteuert werden.

Alternativ wäre es auch denkbar, einen speziellen Dienst zu installieren (was und wie genau weiß ich noch nicht), der anhand eines Kalenders, oder Datenbankeintrag eine bestimmte Rufnummer beim Kunden (Apotheke) anruft - zB. einen CFD und so die Anlage umgestellt wird.

Hat hier irgendjemand schon etwas ähnliches realisiert und wenn ja, wie genau?
Es gibt entsprechend Anbieter, die das speziell für Apotheken machen, aber ich kenne Apotheken, die damit nicht zufrieden sind.

Danke
 
Hallo,

es gibt sehr viele sehr unterschiedliche Ansätze für so etwas. Der einfachste Weg: die Anrufe an die Notfallnummer laufen alle über eine Dummy Nebenstelle, an der manuell oder halbautomatisch (eingie Wenige Tage im Voraus) umgeschaltet (Verfügbar / DND mit verschiedenen Weiterleitungen je nach Status) wird. Man kann diese Verfügbarkeit dieser Dummy NSt. auch über ein MS Konto (Exchange online) und dessen Kalender steuern. Man kann, statt der Dummy NSt., eine CFA benutzen und dann nach Belieben externe Datenquellen (Kalender, Datenbanken, was auch immer) abfragen und danach die Weiterleitugn gestalten.

Die Fragen die sich mir stellen:
  1. Ist dieser Zyklus von 12 Tagen und festen geänderten Geschäftszeiten ab einem Stichtag dauerhaft / sehr langlebig?
  2. Ist manuelles Eingreifen gewünscht? Wenn ja: wie kurzfristig soll das möglich sein? Wenn ja: wie unkompliziert sol ldas möglich sein?
  3. Ist die Umschaltung per Webclient für eine Dummy NSt. eine Option? Eventuell auch zur nachträglichen Steuerung (separates Ein / Aus) der Dummy NSt.?
  4. Gibt es schon externe Datenquellen (irgendeiner Art), die relativ einfach abgefragt werden können, ob nun gerade so ein Tag mit Nachtdienst ist oder nicht bzw. ob die Filiale noch geöffnet hat oder nicht?
 
Hallo @fxbastler,

  1. Ist dieser Zyklus von 12 Tagen und festen geänderten Geschäftszeiten ab einem Stichtag dauerhaft / sehr langlebig?
  2. Ist manuelles Eingreifen gewünscht? Wenn ja: wie kurzfristig soll das möglich sein? Wenn ja: wie unkompliziert sol ldas möglich sein?
  3. Ist die Umschaltung per Webclient für eine Dummy NSt. eine Option? Eventuell auch zur nachträglichen Steuerung (separates Ein / Aus) der Dummy NSt.?
  4. Gibt es schon externe Datenquellen (irgendeiner Art), die relativ einfach abgefragt werden können, ob nun gerade so ein Tag mit Nachtdienst ist oder nicht bzw. ob die Filiale noch geöffnet hat oder nicht?
zu 1:
In meinem Fall ist der Zyklus von 12 Tagen immer der Selbe. Dieser wird von der Apothekerkammer für diese Region festgelegt und ändert sich idR. erst dann, wenn eine Apotheke mal dazu kommt. Aber da kommt dann in den meisten Fällen die Apotheke einfach zu einer Gruppe dazu 1-12. Dass sich die Gruppenanzahl 12 ändern, glaub ich jetzt mal nicht so schnell.

zu 2:
eher weniger. Die ApothekerInnen mit denen ich gesprochen haben, wollen eher alles automatisch haben und nichts selber tun.
Natürlich wäre die Option super, wenn man via Status einer Dummy-Nst. das auf die Schnelle umschalten kann.

zu 3:
über eine Dummy-Nst. ja mit CFD (da habe ich bereits passende CFD für ein anderes Vorhaben

zu 4:
Anbei habe ich einen alten Bereitschaftskalender, den man so von den Apotheken bekommt. Diese Daten sind in noch keiner Datenbank oder Kalender oder ähnlichem, da ich noch nicht genau weiß, ob und wie ich diese Daten wie in die 3CX bekomme.
 

Anhänge

Dann per CFA oder Powershell Skript eine NSt. alle 12 Tage auf das Nachttelefon umschalten lassen (per Statuswechsel die Weiterleitung ändern bzw. an der NSt. annehmen).
Anbei habe ich einen alten Bereitschaftskalender, den man so von den Apotheken bekommt. Diese Daten sind in noch keiner Datenbank oder Kalender oder ähnlichem, da ich noch nicht genau weiß, ob und wie ich diese Daten wie in die 3CX bekomme.
Woher kommt der Kalender, per Post? Wird die Zählung über den Jahreswechsel hinaus fortgeführt?
 
OK. Hast du so ein Powershell Skript?
Kann der CFA auch automatisch was machen, oder nur wenn man diesen anruft? Hab da leider noch keine Erfahrungen.

Diesen Kalender/Zettel kann man sich bei der Apotheke holen, bzw. mittlerweile auch aus dem Internet herunterladen (sofern eine Apotheke diesen veröffentlicht).

Ich habe von der Apothekerkammer ein Mail soeben bekommen, wo sie mir ein json-File zur Verfügung stellen. Da ich nicht weiß, ob diese Anleitung öffentlich ist, sende ich dir diese bitte via PN. Dort können die Öffnungszeiten und weitere Daten mittels GET abgerufen werden (für mich Neuland).
 
Hast du so ein Powershell Skript?
ja

Ist das eine Windows 3CX? Dann wird Powershell zwangsweise unterstützt.
Ist das eine Debian 3CX, dann muss man das nachinstallieren und das ist wieder unsupported - aber funktioniert.
Kann der CFA auch automatisch was machen, oder nur wenn man diesen anruft?
Die CFA macht prinzipiell immer nur dann etwas, wenn man die anruft. Die macht nie etwas allein. Aber: man kann mit einer CFA einen sog. Dialer erstellen, der dann wartet, Aufräge sammelt und zeitgesteuert usw. abarbeitet. Das ist dann eine CFA die nur 1x angerufen wird (das kann ein Problem sein) und sehr lange bis quasi dauerhaft läuft.
 
  • Like
Reaktionen: voipsonic-graz
Ich nutze Windows 10 und Windows 11 Rechner.
 
Dann ist Powershell Support voll integriert. Dann könnte man z.B. mit dem Windows Taskplaner den 12 Tage Rhythmus vorab einstellen. Das Skript läuft immer kurz an und schaltet den Status einer bestimmten NSt. um.
Der Skriptrahmen ist im Prinzip wie hier im Spoiler.

Sonst hier:
Bash:
$tcxappname="StatusUmschaltung"     # script name, must be unique at runtime
$extnumber="211"                    # customize: extension number for status change

$osname=[System.Environment]::OSVersion.Platform
if( $osname -match "win" ) {
    $tcxdllfilelocation="C:\Program files\3CX Phone System\Bin\3cxpscomcpp2.dll"
    $tcxinifilelocation="C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini"
} else {
    $tcxdllfilelocation="/usr/lib/3cxpbx/3cxpscomcpp2.dll"
    $tcxinifilelocation="/var/lib/3cxpbx/Bin/3CXPhoneSystem.ini"
}

Add-Type -Path $tcxdllfilelocation  # Debian "/usr/lib/3cxpbx/3cxpscomcpp2.dll", Windows "C:\Program files\3CX Phone System\Bin\3cxpscomcpp2.dll"

Function ReadConfiguration() {
    $CurrentSectionName=$null
    foreach($striline in ([System.IO.File]::ReadLines($tcxinifilelocation).Trim())) {  # Debian "/var/lib/3cxpbx/Bin/3CXPhoneSystem.ini", Windows "C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini"
        $delim="[","]"
        if ($striline.StartsWith("[")) {
            if( $CurrentSectionName -notmatch "ConfService" ) {
                $CurrentSectionName = ($striline -Split {$delim -contains $_}).Where({$_ -ne "" })
            } else {
                break
            }
        }
        elseif( ($CurrentSectionName -ne $null) -and (-not ([string]::IsNullOrEmpty($striline))) -and (-not ($striline.StartsWith("#"))) -and (-not ($striline.StartsWith(";")))) {
            if( $CurrentSectionName -match "ConfService" ) {
                $param=$striline.split("=")[0].Trim()
                $value=$striline.split("=")[1].Trim()
                switch( $param ) {
                    "confNIC"  { $PS::CfgServerHost=$value }
                    "ConfPort" { $PS::CfgServerPort=$value }
                    "confUser" { $PS::CfgServerUser=$value }
                    "confPass" { $PS::CfgServerPassword=$value }
                }
            }
        }
    }
}

$PS = [TCX.Configuration.PhoneSystem]
ReadConfiguration
$PS::ApplicationName = $tcxappname

$TCXConn = ($PS::Root)
$TCXConn.WaitForConnect((New-TimeSpan -Seconds 30)) | Out-Null   # wait for connection to 3CX
if( $TCXConn.Connected ) {
    # Write-Host "connection to call api established"
    $TCXExtension = $TCXConn.GetDNByNumber($extnumber)
    $TCXExtension.CurrentProfile = $TCXExtension.FwdProfiles | where{ $_.Name -match "Away"} # possible: "Available", "Away", "Out of Office", "Custom 1", "Custom 2"
    $TCXExtension.Save()
    $TCXConn.Disconnect()
}
else {
    # Write-Error "connection to call api failed"
}
Eintrag im Windows Taskplaner:
  • auszuführendes Programm: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  • Parameter: -ExecutionPolicy bypass -Command "& <Laufwerk>:\<Pfad>\skript.ps1"
Suchstichwort: Powershell Schnipsel Status Umschaltung
 
Zuletzt bearbeitet:
  • Like
Reaktionen: voipsonic-graz
Ich habe von der Apothekerkammer ein Mail soeben bekommen, wo sie mir ein json-File zur Verfügung stellen.
Das könnte man dann durchgehend mit einer CFA lösen. Die CFA bekommt den Anruf, sucht per per API im Portal nach der Bereitschaft und abhängig davon wird weitergeleitet. Das ist im CFD als Block enthalten: API und JSON Abfragen.
 
  • Like
Reaktionen: voipsonic-graz
Perfekt. Vielen Dank für deinen input. Ich werde mich da jetzt mal durchackern und berichten.
 
Die CFA bekommt den Anruf, sucht per per API im Portal nach der Bereitschaft und abhängig davon wird weitergeleitet. Das ist im CFD als Block enthalten: API und JSON Abfragen.
Siehe auch hier als Beispiel: Authentifizierung an einer API, speichern des Auth Cookie, Ausführen der Abfrage usw.. In diesem speziellen Fall ist die Website die 3CX selber ;)
 
  • Like
Reaktionen: MarcosV__3CX
Da ich nicht weiß, ob diese Anleitung öffentlich ist, sende ich dir diese bitte via PN. Dort können die Öffnungszeiten und weitere Daten mittels GET abgerufen werden (für mich Neuland).
Ich habe mir das eben anschauen wollen. Das erste, was mir unangenehm in's Auge springt, ist der eklatante Zertifikatfehler. Das wird immer Probleme geben. Der Anbieter ist so überhaupt nicht überprüfbar. Das lädt zu MITM Übernahmen ein. Zumal die Laufzeit auch so lang ist, dass einige Systeme sich auch dagegen verwehren.

Konnten die sich denn bei dem Hoster - ipax - kein für die Domain passendes Zertifikat erstellen lassen (z.B. LE) oder kaufen? Ist die Apo Kammer in AT so arm dran?
 
Konnten die sich denn bei dem Hoster - ipax - kein für die Domain passendes Zertifikat erstellen lassen (z.B. LE) oder kaufen? Ist die Apo Kammer in AT so arm dran?
das kann ich dir leider nicht beantworten XD
 
Dann könnte man z.B. mit dem Windows Taskplaner den 12 Tage Rhythmus vorab einstellen. Das Skript läuft immer kurz an und schaltet den Status einer bestimmten NSt. um.
Das geht auch im Powershell selber. Füge einfach noch etwas Code im o.g. Skript hinzu, um alle 12 Tage die Bereitschaft automatisch (ohne externe Abfrage) einzuschalten, z.B.:
Bash:
$startday=10;               # adjust to start duty on the right day
$cycledays=12;              # duty cycle days
if( [int]((Get-Date).Ticks/10000000/86400 + $startday) % $cycledays -eq 0 ) {
    Write-Host "duty on"    # and change status ...
} else {
    Write-Host "duty off"   # and change status ...
}

Powershell Get-Date Ticks ist das aktuelle Datum bzw. die vergangene Zeit seit dem 1.1.1 0:00 in 100 ns Schritten. Daher Division durch 10 Mio. = Sekunden, dann durch 86400 (Sekunden) ergibt Tage, das als Ganzzahl mit [int] und das Modulo der Zahl des Zyklus der Bereitschaftstage $cycledays (bei euch 12).

Der Versatz $startday wird als Justage dauerhaft hinzugerechnet. Der muss einmalig ermittelt werden (ich glaube nicht, dass die 12tägige Bereitschaft eurer Apotheken am Beginn der Zeitrechnung startete). Wenn in einer Powershell bei
[int]((Get-Date).Ticks/10000000/86400)%12 als Ergebnis 0 am Tag der echten Bereitschaft kommt, dann ist
startday = 0. Sonst so lange die Zahl erhöhen, bis am Tag der Bereitschaft da eine Null als Ergebnis erscheint.

Beispiel: wenn am heutigen Tag Bereitschaft für diese Apo ist, dann wäre heute $startday=10 und bei
[int]((Get-Date).Ticks/10000000/86400+10)%12 kommt 0 heraus.

Das Skript z.B. jeden Abend 18 Uhr laufen lassen und das stellt alle 12 Tage eine bestimmte NSt. um -> Bereitschaft bis zum nächsten Tag um diese Uhrzeit.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: voipsonic-graz
Vielen Dank für deinen Beitrag.

Es ist leider bei Apotheken etwas komplizierter, deshalb bevorzuge ich den Kalender/die externe Abfrage.
Ein großer Anbieter in AT (der sich auf TK-Anlagen, Infoscreen und Nachtausgabe/Portal für Apotheken spezialisiert hat) spielt hier bei Apotheken jede Woche den Kalender für eine Woche ein (das möchte ich vermeiden und umgehen mittels automatisiertem Abruf).

Apotheken haben Bereitschaft alle 12 Tage (in meinem Fall, bzw. diese Region, die ich jetzt mal testen möchte). Wenn die Bereitschaft auf ein Wochenende fällt, dann hat die Apotheke von Samstag 12h bis 8h Montags Bereitschaft.

Und es wird noch komplizierter:
Wenn eine Apotheke über Mittag regulär geschlossen hat (Mo-Fr), zB. von 12:30 bis 14:30 und diese hat an diesem Abend Bereitschaft, so hat diese Apotheke auch von 12:30 bis 14:30 Bereitschaft.
 
Apotheken haben Bereitschaft alle 12 Tage (in meinem Fall, bzw. diese Region, die ich jetzt mal testen möchte). Wenn die Bereitschaft auf ein Wochenende fällt, dann hat die Apotheke von Samstag 12h bis 8h Montags Bereitschaft.

Und es wird noch komplizierter:
Wenn eine Apotheke über Mittag regulär geschlossen hat (Mo-Fr), zB. von 12:30 bis 14:30 und diese hat an diesem Abend Bereitschaft, so hat diese Apotheke auch von 12:30 bis 14:30 Bereitschaft.
Das Skript mit der Erweiterung von oben, evtl. noch weitere Entscheidungen auf Grund des Wochentages und der Uhrzeit, das alles im Taskplaner und damit eine Dummy NSt. umstellen - so dass man immer auch mal manuell eingreifen kann.
 
  • Like
Reaktionen: voipsonic-graz
Habe zum Testen dein Schnipsel (https://www.3cx.de/forum/threads/geschäftszeiten-anhand-eines-kalenders-steuern.114149/post-401462) im Notepad++ als ".ps1" gespeichert und die Nebenstelle und die Zwei Parameter für Windows angepasst. Das Schnipsel sieht bei mir jetzt so aus:

Code:
$tcxappname="StatusUmschaltung"     # script name, must be unique at runtime
$extnumber="35"                    # customize: extension number for status change

# $startday=10;               # adjust to start duty on the right day
# $cycledays=1;              # duty cycle days
# if( [int]((Get-Date).Ticks/10000000/86400 + $startday) % $cycledays -eq 0 ) {
#     Write-Host "duty on"    # and change status ...
# } else {
#     Write-Host "duty off"   # and change status ...
# }

$osname=[System.Environment]::OSVersion.Platform
if( $osname -match "win" ) {
    $tcxdllfilelocation="C:\Program files\3CX Phone System\Bin\3cxpscomcpp2.dll"
    $tcxinifilelocation="C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini"
} else {
    $tcxdllfilelocation="/usr/lib/3cxpbx/3cxpscomcpp2.dll"
    $tcxinifilelocation="/var/lib/3cxpbx/Bin/3CXPhoneSystem.ini"
}

Add-Type -Path $tcxdllfilelocation "C:\Program Files\3CX Phone System\Bin\3cxpscomcpp2.dll" # Debian "/usr/lib/3cxpbx/3cxpscomcpp2.dll", Windows "C:\Program files\3CX Phone System\Bin\3cxpscomcpp2.dll"

Function ReadConfiguration() {
    $CurrentSectionName=$null
    foreach($striline in ([System.IO.File]::ReadLines($tcxinifilelocation).Trim())) { "C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini" # Debian "/var/lib/3cxpbx/Bin/3CXPhoneSystem.ini", Windows "C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini"
        $delim="[","]"
        if ($striline.StartsWith("[")) {
            if( $CurrentSectionName -notmatch "ConfService" ) {
                $CurrentSectionName = ($striline -Split {$delim -contains $_}).Where({$_ -ne "" })
            } else {
                break
            }
        }
        elseif( ($CurrentSectionName -ne $null) -and (-not ([string]::IsNullOrEmpty($striline))) -and (-not ($striline.StartsWith("#"))) -and (-not ($striline.StartsWith(";")))) {
            if( $CurrentSectionName -match "ConfService" ) {
                $param=$striline.split("=")[0].Trim()
                $value=$striline.split("=")[1].Trim()
                switch( $param ) {
                    "confNIC"  { $PS::CfgServerHost=$value }
                    "ConfPort" { $PS::CfgServerPort=$value }
                    "confUser" { $PS::CfgServerUser=$value }
                    "confPass" { $PS::CfgServerPassword=$value }
                }
            }
        }
    }
}

$PS = [TCX.Configuration.PhoneSystem]
ReadConfiguration
$PS::ApplicationName = $tcxappname

$TCXConn = ($PS::Root)
$TCXConn.WaitForConnect((New-TimeSpan -Seconds 30)) | Out-Null   # wait for connection to 3CX
if( $TCXConn.Connected ) {
    # Write-Host "connection to call api established"
    $TCXExtension = $TCXConn.GetDNByNumber($extnumber)
    $TCXExtension.CurrentProfile = $TCXExtension.FwdProfiles | where{ $_.Name -match "Away"} # possible: "Available", "Away", "Out of Office", "Custom 1", "Custom 2"
    $TCXExtension.Save()
    $TCXConn.Disconnect()
}
else {
    # Write-Error "connection to call api failed"
}

Beim Ausführen bekomme ich in der PowerShell ISE folgende Meldungen:

Code:
PS C:\Users\VOIPsonic-Labor> C:\Users\VOIPsonic-Labor\Desktop\skript.ps1
Add-Type : Es wurde kein Positionsparameter gefunden, der das Argument "C:\Program Files\3CX Phone
System\Bin\3cxpscomcpp2.dll" akzeptiert.
In C:\Users\VOIPsonic-Labor\Desktop\skript.ps1:21 Zeichen:1
+ Add-Type -Path $tcxdllfilelocation "C:\Program Files\3CX Phone System ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Add-Type], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.AddTypeCommand
 
Der Typ [TCX.Configuration.PhoneSystem] wurde nicht gefunden.
In C:\Users\VOIPsonic-Labor\Desktop\skript.ps1:49 Zeichen:7
+ $PS = [TCX.Configuration.PhoneSystem]
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (TCX.Configuration.PhoneSystem:TypeName) [], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound
 
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
Die Eigenschaft "CfgServerHost" wurde für dieses Objekt nicht gefunden. Vergewissern Sie sich, dass die
Eigenschaft vorhanden ist und festgelegt werden kann.
In C:\Users\VOIPsonic-Labor\Desktop\skript.ps1:39 Zeichen:34
+                     "confNIC"  { $PS::CfgServerHost=$value }
+                                  ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound
 
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
Die Eigenschaft "CfgServerPort" wurde für dieses Objekt nicht gefunden. Vergewissern Sie sich, dass die
Eigenschaft vorhanden ist und festgelegt werden kann.
In C:\Users\VOIPsonic-Labor\Desktop\skript.ps1:40 Zeichen:34
+                     "ConfPort" { $PS::CfgServerPort=$value }
+                                  ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound
 
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
Die Eigenschaft "CfgServerUser" wurde für dieses Objekt nicht gefunden. Vergewissern Sie sich, dass die
Eigenschaft vorhanden ist und festgelegt werden kann.
In C:\Users\VOIPsonic-Labor\Desktop\skript.ps1:41 Zeichen:34
+                     "confUser" { $PS::CfgServerUser=$value }
+                                  ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound
 
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
Die Eigenschaft "CfgServerPassword" wurde für dieses Objekt nicht gefunden. Vergewissern Sie sich, dass die
Eigenschaft vorhanden ist und festgelegt werden kann.
In C:\Users\VOIPsonic-Labor\Desktop\skript.ps1:42 Zeichen:34
+                     "confPass" { $PS::CfgServerPassword=$value }
+                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound
 
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
C:\Program Files\3CX Phone System\Bin\3CXPhoneSystem.ini
Die Eigenschaft "ApplicationName" wurde für dieses Objekt nicht gefunden. Vergewissern Sie sich, dass die
Eigenschaft vorhanden ist und festgelegt werden kann.
In C:\Users\VOIPsonic-Labor\Desktop\skript.ps1:51 Zeichen:1
+ $PS::ApplicationName = $tcxappname
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound
 
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\Users\VOIPsonic-Labor\Desktop\skript.ps1:54 Zeichen:1
+ $TCXConn.WaitForConnect((New-TimeSpan -Seconds 30)) | Out-Null   # wa ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Habe ich etwas falsch gemacht oder übersehen?
 
Die Datei 3cxpscomcpp2.dll ist bei meinen Windows Installationen immer im Ordner
C:\Program files\3CX Phone System\Bin. Such die dir mal. Ansonsten ist die Powershell Version zu alt. Was wird bei $PSVersionTable angezeigt? Wenn die separat installiert wurde / werden wird (weil mind. v6 / core noch nicht drauf), dann auch den Pfad im Task Scheduler entspr. anpassen.

Die Parameter müssen nicht angepasst werden. Das Skript erkennt ob Windows oder Linux und setzt die Variablen entsprechend. Aber mit dem Ersetzen hast du extra einen Typo in Zeile 25 produziert.
 
Ich habe jetzt PowerShell Version 7 installiert (zuvor war es V5 - Standard Windows 11). Bin über die Microsoft Seite auf github gelandet und hab dort die aktuellste Version 7.3.2 installiert.

Nun habe ich jetzt nochmals dein Schnipsel 1:1 kopiert und nur die Nebenstelle von 211 auf 35 geändert, sonst nichts.

Der Fehler jetzt:
1676659056848.png

Kann leider nur einen Screenshot posten, da das Fenster gleich wieder zu geht, trotz -noexit in der Verknüpfung, die jetzt so aussieht unter Eigenschaften -> Ziel: C:\Program Files (x86)\PowerShell\7\pwsh.exe -ExecutionPolicy bypass -Command "& C:\Users\VOIPsonic-Labor\Desktop\skript.ps1"
 
Das Fenster geht gleich wieder zu, da in Command ein & davor steht ;)
 

Statistik des Forums

Themen
44.414
Beiträge
232.716
Mitglieder
78.330
Neuestes Mitglied
uvitas