Mircosoft Endpoint Manager SW-Verteilung 3CX Win Desktop Client

Gmue28

Free User
Mitglied seit
17. August 2022
Beiträge
2
Hallo zusammen,

hat jemand Erfahrungen mit der Windows 3CX Desktop App via Microsoft Endpoint-Manager?
Gibt es irgendwelche Berechtigungen, die zusätzlich zu setzen sind, z.B. in der Befehlszeile?
Bei uns schlägt die Installation mit diesen Paketeinstellungen immer fehl:
1667489449345.png
 
Ich arbeite mit den MSI-Parametern "/qn ALLUSERS=1" für install und uninstall.
Der User sollte im Anschluss neu starten oder die Software beenden (da die Installation ja nicht mit dem betroffenen Benutzer durchgeführt wurde)

Die Provisionierung ist dann allerdings ein manueller Schritt. Dieser kann aber der Benutzer berechtigungstechnisch alleine ausführen.
 
Ich arbeite mit den MSI-Parametern "/qn ALLUSERS=1" für install und uninstall.
Der User sollte im Anschluss neu starten oder die Software beenden (da die Installation ja nicht mit dem betroffenen Benutzer durchgeführt wurde)

Die Provisionierung ist dann allerdings ein manueller Schritt. Dieser kann aber der Benutzer berechtigungstechnisch alleine ausführen.
Automatische Updates der App scheinen dann nicht mehr zu gehen. Man darf dann wieder manuell updaten.
 
Die 3CX-DesktopApp-Software ist leider Wildwuchs und neben der administrativen Vorgabe kann ein User auch diverse Änderungen generieren und man hat dann zig Einträge der installierten 3CX-Software. Bei den doppelten Einträge teilweise auch die gleiche Version.

Wenn ich mich richtig erinnere...
konnte ein Benutzer nicht von Version 18.8 auf 18.10 selbst updaten
konnte ein Benutzer von Version 18.9 auf Version 18.10 selbst updaten.
Hat der Benutzer Version 18.10 installiert und dann kam noch meine Administrative Installation, dann war die Software 2x in den Einträgen.

Deshalb ist mein Deployment wie folgt und seit dem habe ich eigentlich Ruhe weil es funktioniert:
Execute-MSI -Action 'Uninstall' -Path '3CXDesktopApp-18.8.508.msi' -Parameters '/qn ALLUSERS=1'
Execute-MSI -Action 'Uninstall' -Path '3CXDesktopApp-18.9.933.msi' -Parameters '/qn ALLUSERS=1'
Execute-MSI -Action 'Uninstall' -Path '3CXDesktopApp-18.10.461.msi' -Parameters '/qn ALLUSERS=1'
Execute-MSI -Action 'Install' -Path '3CXDesktopApp-18.10.461.msi' -Parameters '/qn ALLUSERS=1'

Mein Deployment mache ich nicht mit dem MS-Endpoint-Manager.
Aber die Logik der MSIs sollte klar sein ;-)
 
Danke für Eure Rückmeldungen, nach vielen Tests habe ich es jetzt geschafft die Anwendung überhaupt einmal via Endpoint-Manager zu installieren, allerdings nur als "System" mit den genannten Parameter ALLUSERS=1

Jetzt stellt sich mir die Frage, wie ich dem User die Möglichkeit geben kann den 3CX Desktop Client (optional) aus dem Autostart herauszunehmen?

Der Haken "Bei Anmeldung starten" ist nicht gesetzt, trotzdem startet die App nach jedem Reboot automatisch.
1668779186398.png


Im Taskmanager läst sich der Autostart ebenfalls nicht deaktivieren:
1668779371882.png


Hat jemand eine Idee, wie sich das Problem beheben lässt?
 
Jetzt stellt sich mir die Frage, wie ich dem User die Möglichkeit geben kann den 3CX Desktop Client (optional) aus dem Autostart herauszunehmen?
Eventuell gar nicht. Der (einzige) Starteintrag steht unter HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run für alle Benutzer des System. Da kommt ein Benutzer ohne entspr. Berechtigungen nicht heran.
 
Das 3CX deployment. Ein nerv raubendes Thema für sich. Ich habe hier mein Test-Provisionierungs-Script. Das AD-Feld "ipPhone" hat bei den Benutzern die Nebenstellnummer stehen. Die exe wird als Logonscript aufgerufen.

Mit dem Benutzernamen "Environment.UserName" prüfe ich die Nebenstellennummern im AD-Feld "ipPhone" und hole den passenden Link aus dem Dictionary, welche ich vom QR Code von der Mgmt-Console habe. Ist wirklich nicht schön gelöst, aber ich sehe zurzeit keine andere "sichere" Methode. Wobei auch diese Methode nicht sehr "sicher" ist. Alternativ könnte man die Links in einer DB speichern.

Das Script ist in der Testphase und nicht für den produktiven Einsatz gedacht. Vielleicht gibt es einen Denkanstoss für eine bessere Variante.​


C#:
namespace _3CX_Prov
{
    class Program
    {

        private static readonly Dictionary<string, string> PhoneProvisioning
           = new Dictionary<string, string>
           {
               { "503", "HTTPS://QRCODELINK503" },
               { "504", "HTTPS://QRCODELINK504" },
               { "505", "HTTPS://QRCODELINK505" }

           };


        static void Main(string[] args)
        {

#if !DEBUG
                string username = Environment.UserName;
#endif

#if DEBUG
                string username = "max.mustermann";
#endif

            try
            {

                DirectoryEntry myLdapConnection = createDirectoryEntry();
                DirectorySearcher search = new DirectorySearcher(myLdapConnection);
                search.Filter = "(sAMAccountName=" + username + ")";

                // create results objects from search object

                SearchResult result = search.FindOne();

                if (result != null)
                {

                    DirectoryEntry user = result.GetDirectoryEntry();
                    string pager = user.Properties["ipPhone"].Value?.ToString();

                    if (pager != null)
                    {
                        Console.WriteLine(pager);
                        string PhoneUrl = GetPhoneLink(pager);
                        Process.Start(@"C:\Program Files (x86)\3CX\3CXDesktopApp.exe tcx+app:" + PhoneUrl);
                    }
                    else
                    {

                        Console.WriteLine("no ipPhone");
                    }

                }

                else
                {
                    Console.WriteLine("User not found!");
                }
            }

            catch (Exception e)
            {
                Console.WriteLine("Exception caught:\n\n" + e.ToString());
            }
        }

        static string GetPhoneLink(string key)
        {
            string returnValue;
            if (!PhoneProvisioning.TryGetValue(key, out returnValue))
            {
                returnValue = string.Empty;
            }
            return returnValue;
        }

        static DirectoryEntry createDirectoryEntry()
        {
            // create and return new LDAP connection with desired settings

            DirectoryEntry ldapConnection = new DirectoryEntry("LDAP://RootDSE")
            {
                Path = "LDAP://<DEIN OU PFAD ZU DEN BENUTZERN>",
                AuthenticationType = AuthenticationTypes.Secure
            };

            return ldapConnection;
        }
    }
}
 
Zuletzt bearbeitet:
Update. Ich habe das so ausgerollt und scheint zu funktionieren. Bin kein Programmierer, daher wird es nicht Best Practices oder so sein XD

C#:
                if (result != null)
                {

                    DirectoryEntry user = result.GetDirectoryEntry();
                    string pager = user.Properties["ipPhone"].Value?.ToString();

                    if (pager != null)
                    {
                        Console.WriteLine(pager);
                        string PhoneUrl = GetPhoneLink(pager);

                        string DesktopApp = string.Empty;

                        string DesktopApp32bit = @"C:\Program Files (x86)\3CX\3CXDesktopApp.exe";
                        string DesktopApp64bit = @"C:\Program Files\3CX\3CXDesktopApp.exe";

                        if (File.Exists(DesktopApp32bit))
                        {
                            DesktopApp = DesktopApp32bit;
                        }
                        else if (File.Exists(DesktopApp64bit))
                        {
                            DesktopApp = DesktopApp64bit;
                        }

                        ProcessStartInfo AppProvision = new ProcessStartInfo
                        {
                            FileName = Path.GetFileName(DesktopApp),
                            WorkingDirectory = Path.GetDirectoryName(DesktopApp),
                            Arguments = " \"tcx+app: " + PhoneUrl + "\""
                        };
                        Process.Start(AppProvision);
                    }
                    else
                    {
                        Console.WriteLine("no ipPhone");
                    }

                }

                else
                {
                    Console.WriteLine("User not found!");
                }
            }

            catch (Exception e)
            {
                Console.WriteLine("Exception caught:\n\n" + e.ToString());
            }
        }
 
  • Like
Reaktionen: MarcosV__3CX
Liebe Alle,

Installationspfad mit "ALLUSERS=1". Ich rolle per MECM aus. Auf den Clients schaut es dann so aus (Siehe Bild). Ist das ein gewünschtes Verhalten? Was für einen Grund gibt es dafür? Es ist ein wenig lästig, dass ich die exe "doppelt" auf jedem System habe (Was sie ja nicht ist, man beachte die Dateigröße).

1683038553415.png
 

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
44.313
Beiträge
232.387
Mitglieder
78.275
Neuestes Mitglied
Norbert Schütze