AutoIt Programm Teile als Admin ausführen

  • Guten Abend liebe Community,


    ich bin gerade dabei ein Script zu Programmieren, dass dann auf knapp 800 Rechnern ausgerollt werden soll.

    Ich schildere kurz was dieses machen soll:

    Aktuell ist es so dass wir 2 Verknüpfungen auf dem Desktop liegen haben, "Citrix Start" und "Citrix Ende" diese verweißen auf eine lokale CMD Datei. Die CMD Dateien öffnen eine exe mit und es werden verschiedene Parameter mitgegeben. Nun haben wir aber das Problem das Citrix so 10 Sekunden brauch bis es wirklich disconnected und beendet ist, und die User drücken dann wieder auf Citrix Start und es gibt doppelte Sitzungen usw... Wenn ich jetzt mein Programm aufrufe wird geprüft ob Citrix gestartet oder gestoppt werden muss. Wenn es gestartet ist wird es gestoppt, und halt andersrum.
    Wenn das Script aufgerufen wird erstellt es eine Verknüpfung auf dem Desktop diese heißt "Citrix Start" bzw. "Citrix Ende". Also es gibt dann nur die Verknüpfung die auch ausgewählt werden kann. Also wenn Citrix läuft gibt es nur eine Citrix Ende Verknüpfung auf dem Desktop. Das Programm macht noch 3-4 andere Sachen aber sind jetzt hier unwichtig.

    Ich hoffe ich konnte es bisschen erklären.


    Ich habe jetzt 2 Probleme.


    1. Das Script muss wenn wir es ausrollen einmal gestartet werden dass die Verknüpfungen angelegt werden. Was an sich kein Problem ist. Jetzt kann es nur sein das der User die Verknüpfung löscht, dann ruft er bei uns an und die Verknüpfung fehlt. Aktuell ist es so die 2 Verknüpfungen liegen im Öffentlichen Desktop und deshalb kann der User diese nicht löschen. Ich könnte in Autoit ja auch einfach als Speicherort @DesktopCommonDir angeben dann brauch ich aber Admin rechte und das will ich ja nicht. Jetzt komm ich zu meinem 2ten Problem und ich habe mir auch schon eine lösung überlegt.

    2. Wenn der User Citrix im Autostart hat dann Stimmt ja die Verknüpfung auf dem Desktop nicht da diese ja Citrix Start heißt aber Citrix ja schon läuft .. Zwar ist es so wenn man die Verknüpfung anklickt wird mein Programm aufgerufen und dieses weiß das Citrix läuft und beendet es, aber der User wäre verwirt.

    Deswegen habe ich mir etwas überlegt


    1. Gibt es die Möglichkeit ein zweites Programm zu schreiben dass im Autostart liegt und beim Start prüft ob Citrix läuft und dann die richtige Verknüpfung anlegt. Und dass ich dann mit meinem zweiten Programm den Programm im Autostart sag wann es Verknüpfungen anlegen soll und das Programm dann auch die Rechte hat in den @DesktopCommonDir zu schreiben, ohne dass der User beim anmelden irgendwelche Admin Daten eingeben muss? ..


    2. Das Problem dasd am Anfang das falsche Icon da ist wäre nicht so schlimm .. Mein Problem aktuell wäre eher dass ich Schreibrechte auf dem @DesktopCommonDir brauch ohne das die User Admin Daten eingeben müssen.

    Wer den Source des aktuellen Programm brauch kann mir bescheid geben.

    Hoffe jemand kann mir helfen ..

    Mit freundlichen Grüßen,
    Daniel Ehrhardt :)

  • Heyho,
    wir nutzen ebenfalls Citrix im Unternehmen...

    Warum soll jeweils ein Programm auf den Desktop gelegt werden, ist das nicht ein wenig umständlich?
    Warum werden nicht beide Verknüpfungen aus dem Desktop gelöscht, und mit einer allgemeinen Citrix.exe ausgetauscht. Die Exe überprüft dann nach dem Start ob Citrix gestartet ist oder ob Citrix gestartet werden soll. Je nachdem was zutrifft wird dann das entsprechende ausgeführt.

    Habt ihr im Unternehmen eine Softwareverteilung? Bei 800 Clients wäre dies ja durchaus Sinnvoll. Einige dieser Programme bieten es an, dass ein Paket oder eine Exe als Domänenadministrator ausgeführt wird. Somit kannst du dein Programm an alle mit wenigen Mausklicks verteilen.
    Ob es dafür aber auch kostenlose Unternehmenslösungen gibt, kann ich dir auf Anhieb nicht sagen...

    LG

  • Genau so läuft es ;) .. es geht soweit auch alles.
    Ich will jetzt nur das die Verknüpfung:

    PHP
    FileCreateShortcut(@ScriptFullPath, $Citrix_Start_lnk, $Citrix_Path, "", _
                $D_Citrix_Start_Icon, @SystemDir & "\shell32.dll", "", $Citrix_Start_Icon_Number, @SW_SHOWNORMAL)

    auf dem Öffentlichen Desktop erstellt wird .. Mein Programm darf kann Admin Rechte haben ich weiß nur nicht wie ich die bekomme .. die User sollen die Verknüpfung halt nicht löschen können und dass können sie nicht wenn die Verknüpfung im Öffentliche Desktop erstellt wird. Wenn ich meinem Programm sag #RequireAdmin dann müssen die User bei jedem Klick auf die Verknüpfung Admin Daten eingeben und dass wollen wir nicht.

    Also wenn es in Windows eine Liste für Programme gibt die Admin rechte haben sollen ohne Abfrage das wäre die Lösung für meine Probleme.

    Einmal editiert, zuletzt von daniii_e (15. April 2014 um 15:49)

  • Verstehe hier das Problem nicht so recht.


    Aktuell ist es so dass wir 2 Verknüpfungen auf dem Desktop liegen haben, "Citrix Start" und "Citrix Ende" diese verweißen auf eine lokale CMD Datei. Die CMD Dateien öffnen eine exe mit und es werden verschiedene Parameter mitgegeben. Nun haben wir aber das Problem das Citrix so 10 Sekunden brauch bis es wirklich disconnected und beendet ist, und die User drücken dann wieder auf Citrix Start und es gibt doppelte Sitzungen usw... Wenn ich jetzt mein Programm aufrufe wird geprüft ob Citrix gestartet oder gestoppt werden muss. Wenn es gestartet ist wird es gestoppt, und halt andersrum.

    Dein eigentliches Problem ist also nur, dass dein Programm gestartet werden kann obwohl eine vorherige Instanz seine Arbeit noch nicht vollständig erledigt hat (citrix starten oder beenden). Ich habe dein Script jetzt nicht angesehen, daher kenne ich die Ursache dafür nicht. Prinzipiell gibt es aber nur zwei mögliche Ursachen. Entweder prüfst du nicht ob noch eine Instanz deines Scriptes läuft oder aber dein Script wartet nicht bis citrix wirklich beendet oder gestartet wurde bevor es sich selbst beendet.

    Hier mal ein vereinfachtes Beispiel wie du ein Script gestalten könntest damit der User sieht, dass noch etwas passiert:


    Aufruf: "test.exe -start" oder "test.exe -stop"

    Spoiler anzeigen
    [autoit]


    #include <Misc.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    if $cmdline[0] = 0 then Exit msgbox(0,"Fehler","ungültiger programmaufruf, bitte parameter -start oder -stop verwenden")

    [/autoit] [autoit][/autoit] [autoit]

    if _Singleton(@ScriptName,1) = 0 Then
    Exit msgbox(0,"Fehler","eine andere Instanz des citrix loaders läuft noch!")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $citrixCheck = checkCitrix() ; ermittelt den Zustand von citrix, true wenn gestartet, false wenn nicht gestartet

    [/autoit] [autoit][/autoit] [autoit]

    If $cmdline[1] = "-start" Then
    If $citrixCheck = False Then
    SplashTextOn("Citrix Loader","Citrix wird gestartet, bitte warten...",Default,Default,Default,Default,2+16+32)
    citrixStart()
    SplashOff()
    Else
    Exit MsgBox(0,"Fehler","Citrix läuft bereits!")
    EndIf
    Else
    If $citrixCheck = True Then
    SplashTextOn("Citrix Loader","Citrix wird gestopt, bitte warten...",Default,Default,Default,Default,2+16+32)
    citrixStop()
    SplashOff()
    Else
    Exit MsgBox(0,"Fehler","Citrix läuft doch garnicht!")
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    func checkCitrix()
    return Random(0,1,1) ; reiner zufall zum testen...
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func citrixStart()
    #cs citrix starten
    diese Funktion darf erst verlassen werden wenn citrix wirklich gestartet wurde, prüfbar mit:

    [/autoit] [autoit][/autoit] [autoit]

    WinExists(...)
    ProcessExists(...)
    usw.
    #ce
    Local $randomWait = Random(10000,15000,1)
    Sleep($randomWait)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func citrixStop()
    #cs citrix stoppen
    diese Funktion darf erst verlassen werden wenn citrix wirklich gestoppt wurde, prüfbar mit:

    [/autoit] [autoit][/autoit] [autoit]

    WinExists(...)
    ProcessExists(...)
    usw.
    #ce
    Local $randomWait = Random(10000,15000,1)
    Sleep($randomWait)
    EndFunc

    [/autoit]

    Das sollte dein Problem doch eigentlich lösen. Du könntest wie bisher zwei Verknüpfungen im Public Desktop bei der Installation erstellen. Der Anwender selbst braucht keine Admin Rechte weil die Verknüpfungen nie wieder angefasst werden.

    Einmal editiert, zuletzt von misterspeed (13. April 2014 um 10:11)

  • Folgende Lösungen stehen Dir meiner Meinung nach zur Verfügung:

    • Softwareverteilung mittels SCCM o.ä., wenn ihr habt.
    • Softwareverteilung mit GPO (habe ich noch nicht genutzt).
    • Softwareverteilung mit einem GPO-Startskript (einfach und läuft unter 'Lokal System').
      Setzen wir für fast alle Installationen ein ! Mein Favorit !
      Setzt aber vorraus, das das Konto 'Local System' auf den Pfad mit dem AutoIt-Skript zugreifen darf.
    • Skript zum Anlegen des Icon's im 'öffentlichen Desktop', mit einkompilierten Admin-Kennwort, was ich aber, der Sicherheit wegen, ablehnen würde.
      Dieses muss aber ja nur einmal als Benutzer ausgeführt werden, z.B. als Loginskript (welches unter Benutzerrechten läuft).

    Gruß
    Micha

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"