Workaround PWA vom Schliessen verhindern

mr412

Silver Partner
Mitglied seit
5. November 2020
Beiträge
98
Hallo Zusammen,

Mit dem V20 Zwangsupdate habe ich die gewöhnliche Desktop App durch die PWA ersetzt. Eine Anleitung für den Deploy über Intune findet ihr hier: https://www.3cx.de/forum/threads/intune-verteilung-pwa-app-inkl-autostart.120668/

Nun hat es mich aber genervt, dass es keine Lösung gibt zu verhindert, dass wenn man die PWA schliesst keine Anrufe mehr erhält. Man ist von der Desktop App gewohnt, dass diese im Hintergrund weiterläuft. Dieses Verhalten scheint bei der PWA irgendwie nicht zu funktionieren. Zumindest wenn man auf Microsoft Edge setzt.

Dazu habe ich mir in C# eine "unschöne" aber funktionierende Lösung gebastelt, welche ich gerne hier zur Verfügung stelle. Die App läuft "unsichtbar" im Hintergrund und der User bekommt davon nichts mit. Diese Zeile ist anzupassen: Arguments = "--profile-directory=Default --app-id=mhokpjdmecpbncgffbhlfpgjmpakpfik --app-url=https://deineurl.3cx.ch:5001/ --app-launch-source=4",
Wenn ihr chrome anstatt edge verwendet entsprechend auch das anpassen:
var processName = "msedge";
durch Chrome ersetzt werden. Ausserdem muss auch pwahelper.exe angepasst werden.



C#:
using System;
using System.Diagnostics;
using System.Management;
using System.Timers;
using System.Runtime.InteropServices;

class Program
{
    private static Timer checkTimer;
    [DllImport("kernel32.dll")]
    static extern IntPtr GetConsoleWindow();

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    const int SW_HIDE = 0;
    const int SW_SHOW = 5;


    static void Main(string[] args)
    {
var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);
        checkTimer = new Timer(2000);
        checkTimer.Elapsed += CheckAndStartPwa;
        checkTimer.AutoReset = true;
        checkTimer.Enabled = true;

      // Console am laufen halten
        Console.WriteLine("Die Anwendung überwacht die PWA im Hintergrund.");
        Console.ReadLine();
    }

    private static void CheckAndStartPwa(object sender, ElapsedEventArgs e)
    {
        if (!IsPwaRunning())
        {
            StartPwa();
        }
    }

    static bool IsPwaRunning()
    {
        var processName = "pwahelper";
        var pwaIdentifier = "--app-id=mhokpjdmecpbncgffbhlfpgjmpakpfik"; // Die spezifische PWA-ID

        var query = $"SELECT CommandLine FROM Win32_Process WHERE Name='{processName}.exe'";
        using (var searcher = new ManagementObjectSearcher(query))
        {
            foreach (var process in searcher.Get())
            {
                var commandLine = process["CommandLine"]?.ToString();
                if (!string.IsNullOrEmpty(commandLine) && commandLine.Contains(pwaIdentifier))
                {
                    return true; // PWA läuft
                }
            }
        }

        return false; // PWA läuft nicht
    }

    static void StartPwa()
    {
        try
        {

            Process.Start(new ProcessStartInfo
            {
                FileName = @"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe",
                Arguments = "--profile-directory=Default --app-id=mhokpjdmecpbncgffbhlfpgjmpakpfik --app-url=https://deineurl.3cx.ch:5001/ --app-launch-source=4",
                UseShellExecute = true
            });
            Console.WriteLine("3CX (PWA) gestartet.");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Fehler beim Starten der PWA: {ex.Message}");
        }
    }
}
 
Zuletzt bearbeitet:
Ich habe bemerkt, dass die "Unsichtbarkeit" des Tools nicht auf allen Clients zuverlässig funktioniert. Die Console App muss daher in eine Windows Forms App umgewandelt werden. Hier das Code Update:

Code:
using System;
using System.Diagnostics;
using System.Management;
using System.Windows.Forms;
using System.Timers;


class Program
{
    private static System.Timers.Timer checkTimer;

    [STAThread]
    static void Main(string[] args)
    {
      

        checkTimer = new System.Timers.Timer(2000);
        checkTimer.Elapsed += CheckAndStartPwa;
        checkTimer.AutoReset = true;
        checkTimer.Enabled = true;

    
        Application.Run(); 
    }

    private static void CheckAndStartPwa(object sender, ElapsedEventArgs e)
    {
        if (!IsPwaRunning())
        {
            StartPwa();
        }
    }

    static bool IsPwaRunning()
    {
        var processName = "pwahelper";
        var pwaIdentifier = "--app-id=mhokpjdmecpbncgffbhlfpgjmpakpfik";

        var query = $"SELECT CommandLine FROM Win32_Process WHERE Name='{processName}.exe'";
        using (var searcher = new ManagementObjectSearcher(query))
        {
            foreach (var process in searcher.Get())
            {
                var commandLine = process["CommandLine"]?.ToString();
                if (!string.IsNullOrEmpty(commandLine) && commandLine.Contains(pwaIdentifier))
                {
                    return true; // PWA läuft
                }
            }
        }

        return false; // PWA läuft nicht
    }

    static void StartPwa()
    {
        try
        {
            Process.Start(new ProcessStartInfo
            {
                FileName = @"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe",
                Arguments = "--profile-directory=Default --app-id=mhokpjdmecpbncgffbhlfpgjmpakpfik --app-url=https://deine3cxurl.3cx.ch:5001/ --app-launch-source=4",
                UseShellExecute = true
            });
            Console.WriteLine("3CX (PWA) gestartet.");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Fehler beim Starten der PWA: {ex.Message}");
        }
    }
}


Hier noch das Install Script für Intune. Ich habe diese Anwendung als Intune Win32 App "gepackt"

InstallScript.ps1

Code:
# PowerShell-Skript zum Beenden von 3cxbw.exe und Kopieren der Datei in den globalen Startup-Ordner für alle Benutzer

# Name des Prozesses, der beendet werden soll
$processName = "3cxbw"

# Überprüfen, ob der Prozess läuft, und ihn beenden
$process = Get-Process -Name $processName -ErrorAction SilentlyContinue

if ($process) {
    Write-Host "Beende den Prozess $processName..."
    Stop-Process -Name $processName -Force
    Start-Sleep -Seconds 2  # Optional: Warte 2 Sekunden, um sicherzustellen, dass der Prozess vollständig beendet wurde
}

# Zielpfad im globalen Benutzer-Startup-Ordner
$globalStartupFolder = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp"
$targetPath = Join-Path -Path $globalStartupFolder -ChildPath "3cxbw.exe"

# Quelle der Datei, normalerweise im Verzeichnis des Skripts
$sourcePath = Join-Path -Path (Get-Location) -ChildPath "3cxbw.exe"

# Kopiere die Datei in den globalen Startup-Ordner
Write-Host "Kopiere 3cxbw.exe in den globalen Startup-Ordner..."
Copy-Item -Path $sourcePath -Destination $targetPath -Force

# Optional: Überprüfen, ob die Datei erfolgreich kopiert wurde
if (Test-Path $targetPath) {
    Write-Host "Die Datei wurde erfolgreich in den globalen Startup-Ordner kopiert."
} else {
    Write-Host "Fehler: Die Datei konnte nicht kopiert werden."
}

UninstallScript.ps1

Code:
# Beenden des Prozesses 3cxbw.exe, falls dieser läuft
$processName = "3cxbw"
$process = Get-Process -Name $processName -ErrorAction SilentlyContinue

if ($process) {
    Stop-Process -Name $processName -Force
    Write-Host "Der Prozess 3cxbw.exe wurde erfolgreich beendet."
} else {
    Write-Host "Der Prozess 3cxbw.exe läuft nicht."
}

# Zielpfad im globalen Benutzer-Startup-Ordner
$globalStartupFolder = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp"
$targetPath = Join-Path -Path $globalStartupFolder -ChildPath "3cxbw.exe"

# Entferne die Datei, falls sie existiert
if (Test-Path $targetPath) {
    Remove-Item -Path $targetPath -Force
    Write-Host "Die Datei wurde erfolgreich aus dem globalen Startup-Ordner entfernt."
} else {
    Write-Host "Die Datei wurde im globalen Startup-Ordner nicht gefunden."
}
 
  • Like
Reaktionen: Road69 und fxbastler

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
44.307
Beiträge
232.350
Mitglieder
78.272
Neuestes Mitglied
25710