Fremdes Program starten mit Adminrechten, aber ohne UAC-Abfrage

  • Ein fremdes Programm soll mit meinem Script gestartet werden. Das fremde Programm (Macrium Reflect) benötigt Admin-Rechte und bringt deshalb bei jedem Start die Abfrage der Benutzerkontensteuerung. Das ist aus mehreren Gründen nicht gewollt.


    Wie kann man ein fremdes Programm mit Admin-Rechten starten, ohne dass diese UAC-Abfrage erfolgt?


    Edit zum besseren Verständnis:


    Das Script wird per Win-Autostart aufgerufen und alles soll "silent" ablaufen, ohne dass vom eigenen Script oder vom fremden Programm eine UAC-Abfrage erfolgt. (Eine hoffentlich bessere Beschreibung ist im Posting #8 zu finden.)

    Als Lösung habe ich bisher gefunden, dass man die Windows-Aufgabenplanung nutzen kann. Dadurch wird jedoch der Programm-Aufruf noch weiter "verzweigt": Mein Script wird aufgerufen -> damit wird die Aufgabenplanung aufgerufen -> damit wird das Backup-Programm aufgerufen -> damit wird die Backup-Konifurationsdatei aufgerufen.


    Gibt es vielleicht eine einfachere Lösung?



    Über Ideen und Vorschläge würde ich mich freuen. :)

  • Bei der AutoIt Funktion RunAs kannst Du Userid/Passwort mit angeben. Daher ist kein Dialog notwendig. Nachteil: Userid/Passwort stehen im Skript im Klartext.

    Die Speicherung der Daten ist mir nicht bekannt und wäre erst recht ein Sicherheitsproblem. In der Doku steht auch nix.

  • Bisher habe ich von Versuchen mit RunAs abgesehen, da ich mir über die Auswirkungen nicht im Klaren bin. Vielleicht kannst du mir folgende Fragen beantworten.


    - Wird mit RunAs etwas bleibend gesetzt, das nicht rückgängig gemacht werden kann?

    - Wirkt sich RunAs nur auf das aufgerufene Programm aus, oder auch auf andere?

    - Wird die UAC dadurch beeinflußt, vielleicht sogar ausgeschaltet?


    Mein Testaufruf sah so aus

    RunAs("UserName", @ComputerName, "Passwort", 2, "C:\Program Files\Macrium\Reflect\Reflect.exe")

    Das habe ich aus einem INet-Posting entnommen. Mir ist aber der Parameter logon_flag nicht ganz klar:


    Funktion RunAs

    logon_flag

    $RUN_LOGON_NOPROFILE (0) - Interaktives Logon ohne Profil.
    $RUN_LOGON_PROFILE (1) - Interaktives Logon mit Profil.
    $RUN_LOGON_NETWORK (2) - Nur Netzwerk-Authentifizierung.
    $RUN_LOGON_INHERIT (4) - Übernehme die Umgebung des aufrufenden Prozesses statt der Umgebung des Benutzers.


    Edit wg Verwechselung (1) mit (2):

    Die Werte (0,) und (4) kann ich wahrscheinlich ignorieren, oder? Zu (2): Script läuf lokal, kein Netzwerk. Zu (4) Es gibt nur einen Benutzer.

    Die Werte (0), (1) und (4) kann ich wahrscheinlich ignorieren, oder? Bei allen kommt der normale UAC-Dialog. Lediglich bei (2) (Netzwerk-Authentifizierung) kommt ein größerer UAC-Dialog mit Passwort-Abfrage.

    Ich würde ja gerne Screenshots posten, aber leider geht das bei den UAC-Dialogen nicht

  • Vielleicht nochmal genauer beschreiben was du erreichen willst bzw. wie dein Wunschablauf ist.


    Grundsätzlich hilft dir runas denke ich soweiso nicht, denn mit runas wird lediglich der Benutzer definiert unter dessen Account das Script ausgeführt wird, das hat erstmal nichts mit erhöhten (Admin-)Rechten zu tun.


    Standardmässig arbeite seit Windows Vista nämlich jeder Benutzeraccount mit normalen Benutzer Privilegien. Werden Adminprivilegien benötigt erscheint der UAC Dialog, welcher dir erlaubt mit erhöhten Rechten weiterzuarbeiten.


    Ob der UAC Dialog eine Angabe von Username und Passwort, einfach nur einen Klick auf JA erfordert oder garnicht erscheint hängt von mehreren Gegebenheiten bzw. den Einstellungen von UAC ab.


    Also kurz nochmal:

    Selbst wenn du bei runas Administratordaten angibst startet der Prozess nur im Benutzermodus, siehe auch deine Beobachtungen.


    ---------


    Das ganze funktioniert über die Windowsaufgabenplannung, wenn dort der Haken "Mit höchsten Privilegien ausführen" gesetzt wird und sich der dort hinterlegte Account in der Administratorgruppe befindet. In diesem Fall wird UAC tatsächlich automatisiert.


    Um Aufgaben in der Aufgabenplannung anzulegen werden allerdings ebenfalls Administratorprivilegien benötigt. Du müsstest also zumindestens für die Installation deiner "Hintertür" einmalig diese Privilegien durch Benutzerinteraktion mit UAC erhalten.


    --------


    Sofern es für dich kein Problem ist bei jedem Script Start einmalig UAC zu bestätigen kannst du dir auch die Vererbung der Berechtigungen zu Nutze machen.


    Jeder Prozess, der mit erhöhten Privilegien arbeitet gibt diese auch an Prozesse weiter, welche er aufruft. Du kannst also dein Script nutzen um die Berechtigungen anzufordern und danach über das Script z.B. 10 andere Programm mit erhöhten Privilegien starten ohne weitere Angabe von Benutzerdaten oder Bestätigung von UAC Dialogen.


    Diese Lösung erfordert zwar Benutzerinteraktion, dafür werden aber keine Zugangsdaten irgendwo gespeichert.

  • Ahja eine Lösung wäre auch noch die Nutzung von runas und die Angabe eines Benutzeraccounts mit deaktivierten UAC Prompts (kann man per Registry oder Gruppenrichtlinie deaktivieren).


    Der Superadministrator Account "Administrator", welcher standardmässig deaktiviert ist hat diese UAC Einstellung normalerweise.


    Die Angabe von solchen Zugangsdaten in deinem Script ist aber nicht wirklich "sicher" und nicht zu empfehlen.

  • Über Ideen und Vorschläge würde ich mich freuen. :)

    Ich habe mit Autoit z.B. einen Uninstaller (kompiliertes AutoIt-Skript) für eine Software geschrieben.

    Gestartet wird das Programm über -> Explorer -> rechte Maustaste -> Als Administrator ausführen (das kennst Du sicher).

    Falls Du Adminrechte hast, wird der Uninstaller nach einer allgemeinen JA/NEIN Abfrage gestartet (in diesem Zusammenhang auch mal die Hilfe zu #RequireAdmin bemühen).

    Ansonsten müssen die Zugangsdaten eines Adminkontos eingegeben werden, stehen aber im Gegensatz zu RunAs nicht im Skript. Diese Sicherheitsproblematik hat water ja bereits erwähnt.


    Ob die erforderlichen Rechte vorliegen, kann man im Skript z.B. mittels :

    Python
    1. If Not IsAdmin() Then
    2. MsgBox(16, "Meldung !", "Fehlende Benutzerrechte")
    3. Exit
    4. EndIf

    prüfen.


    Externe Programme können nun über Run / RunWait im Kontext des Admins gestartet werden.

    Gleiches gilt auch für CMD-Befehle, welche Adminrechte benötigen, also Dinge wie z.B. :

    $sDOSCommand = "net user username1 /delete"

    RunWait(@ComSpec & " /c " & $sDOSCommand, "", @SW_HIDE)


    Auf RunAs / RunAsWait kann daher verzichtet werden.


    - Wird mit RunAs etwas bleibend gesetzt, das nicht rückgängig gemacht werden kann?

    - Wirkt sich RunAs nur auf das aufgerufene Programm aus, oder auch auf andere?

    - Wird die UAC dadurch beeinflußt, vielleicht sogar ausgeschaltet?

    Da ich kein ausgewiesener Systemadministrator bin, kann ich Dir diese Fragen nicht mit ruhigem Gewissen beantworten. Ich habe vor einiger Zeit ein Insider-Tutorial gelesen, mit welchen Tricks man sich Adminrechte 'erschleichen' kann. Darauf möchte ich aber nicht näher eingehen.

    Meines Wissens soll RunAs nur ermöglichen, aus dem Skript heraus Programme/Befehle aufzurufen, die im Rechtekontext eines anderen Users liegen. Die Rechte des aufrufenden AutoIt-Skriptes selbst werden dabei nicht verändert.


    Nur kurz überflogen habe ich diesen Thread - ev. findest Du hier auch Nützliches (ohne Gewähr ;)) :

    Frage zu #RequireAdmin


    EDIT :

    Ich sehe gerade, dass misterspeed zwischenzeitlich (und detaillierter/qualifizierter) geantwortet hat.


    Na ja, zumindest hast Du jetzt reichlich Input :P.


    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."


    Einmal editiert, zuletzt von Musashi () aus folgendem Grund: Tippfehler beseitigt

  • Oder du benutzt die RunAs.exe... was die kann bzw. anders als die AutoIt-Funktion macht, erfährst du in der Eingabeaufforderung mit RunAs /?


    So mache ich es z.B. wenn ich die hosts editieren will:

    runas.exe /profile /env /savecred /user:administrator "c:\Program Files (x86)\TC UP\Plugins\Media\Notepad++\notepad++.exe c:\Windows\SYSTEM32\drivers\etc\hosts"

  • Wirklich viel Input! :P Bitte entschuldigt, da habe ich mich wohl schlecht ausgedrückt, somit können die bisherigen Vorschläge nicht funktionieren. Wenn man voll in einem Thema drin ist, vergißt man leider oft, dass andere keine Glaskugel :Glaskugel:haben, um zu erfahren, wie man etwas meint. Deshalb:

    Vielleicht nochmal genauer beschreiben was du erreichen willst bzw. wie dein Wunschablauf ist.

    Das ist eine gute Idee!


    Kurz: Ein Script wird per Autostart ausgeführt und ruft externe Programme auf. Der Vorgang soll komplett silent ablaufen, also KEINE UAC-Abfrage, weder beim Aufrufen eines externen Programms, noch für das Script selbst.


    Details


    Ein AutoIt-Script steuert die Ausführung meiner täglichen Backups. Das Script wird bei jedem UswLogin per Autostart aufgerufen. Es prüft ob die Ausführung an diesem Tag schon stattgefunden hat -> falls ja: Ende, falls nein: Backup-Programme der Reihe nach starten.


    Eines der Backup-Programme ist "Macrium Reflect Free", das differentielle Backups (Images der System-HDD) erstellt. Es ist das einzige meiner Programme, das Admin-Rechte braucht, da es Windows im laufenden Betrieb sichert. Da es System-Snapshots per Volumenschattenkopie erstellt, dürfen die Admin-Rechte nicht ausgehebelt werden.


    Ansätze


    Die Windows-Aufgabenplanung - Ich bin mir sicher, dass das funktioniert, leider hat es ein paar Nachteile, die misterspeed und ich schon erwähnt haben. Falls sich nicht anderes findet, gehört das zu den Top Ten.



    Ich hoffe, dass ich es jetzt ein wenig besser beschrieben habe. :)


    Nachwort (scherzhaft "Disclamer")


    Alles findet nur auf meinem eigenen lokalen Rechner statt, keine Firma, kein Netzwerk, keine Software-Verteilung/Weitergabe, kein Erschleichen von Adminrechten, keine Hintertür, es ist meine eigene Win-Aufgabenplanung, und ich bin mir sicher, dass ich mich da selbst was anlegen lasse. :P

    Bernd.

    7 Mal editiert, zuletzt von Professor Bernd () aus folgendem Grund: Edit: Falschen Parameter bei 'RunAs' angegeben. Richtig ist "$RUN_LOGON_NETWORK (2) - Nur Netzwerk-Authentifizierung"

  • Ja also bei der Beschreibung ist definitiv die Windows Aufgabenplanung die erste Wahl. Als Trigger kann dort auch die Benutzeranmeldung gewählt werden, dann wird dein Script wie gewünscht ausgeführt und du benötigst nicht mal Einträge im Autostart des Users.


    Davon mal abgesehen... ich kenne deine Backuplösung nicht, aber alle Backuplösungen die ich so kenne arbeiten ihre angelegten Backupjobs voll automatisch nach definiertem Zeitplan ab. Die Backup Software installiert dafür einen Dienst der immer aktiv ist und ausreichend Rechte besitzt. Kann mir kaum vorstellen, dass das bei deiner Software nicht der Fall ist.

  • Die Win-Aufgabenplanung habe ich jetzt getestet. Eigentlich funktioniert sie, aber ich kann in meinem Script nicht mehr feststellen, wann das Backup-Programm läuft, bzw. beendet ist. Das Script ist zur Steuerung der Backups da und soll natürlich auch die Ausführung und Dauer in ein LogFile schreiben. Das geht aber nicht, wenn ich wegen der Aufgabenplanung keine Infos mehr bekomme.


    Eine andere Lösung dachte ich, wäre wenn ich stattdessen mein (kompiliertes) Script in die Aufgabenplanung setzte. Dann wären aber alle Programme im Admin-Modus, die von meinen Script aufgerufen werden. ... Mal sehen.


    ... alle Backuplösungen die ich so kenne arbeiten ihre angelegten Backupjobs voll automatisch nach definiertem Zeitplan ab.

    Meine Backups werden von verschiedenen Programmen durchgeführt. Den Desktop sichert 7-Zip in Archive, meine Hauptdaten werden mit FreeFileSync auf eine Bak-HDD gespiegelt, und wegen neuerlichen Vorkommnissen wird nun auch meine System-Festplatte täglich als diff. / incr. Image gesichert (evtl. mit Macrium Reflect).


    Edit: Habe vergessen: Da es mehrere Programme sind, steuere ich sie mit meinem Script, damit sie nicht alle auf einmal loslegen, sondern nacheinander gestartet werden.

    Die Backup Software installiert dafür einen Dienst der immer aktiv ist

    Genau das will ich nicht. Deshalb die verschiedenen Programme. Ein einzelenes zu finden, das alles erledigt und sich dann beedet, ist mir noch nicht gelungen. Mit den oben genannten ist das machbar. Alle (bis auf Macrium) starten, erledigen ihren Job und beenden sich dann. Ich denke, warum soll ein Programm den ganzen Tag laufen, wenn es nur 15 Minuten gebraucht wird!?

  • Aber so ein Dienst frisst doch kein Heu :) Schau Dir mal an, wieviele Dienste in WIndows laufen.

    Ist es die Zeit tatsächlich wert, die man für eine "Lösung" bräuchte? Wieviel wird dadurch eingespart (Memory, CPU ...)?

  • Folgendes hat bei Tests funktioniert:


    Mein (kompiliertes) Script sitzt in der Windows-Aufgabenplanung, höchste Berechtigungen, Ausführung beim Benutzer-Anmeldung. Die Programme innerhalb meines Scripts werden eins nach dem anderen "ganz normal" aufgerufen (RunWait) und erben die Admin-Rechte. Der komplette Vorgang läuft nun "silent" ab, bis auf die gewollten Indikatoren wie TrayIcons und eine Stoppuhr, die als Zeitanzeige in der Taskbar mitläuft.


    Für den Moment habe werde ich es so handhaben und danke euch allen für die rege Beteiligung. :thumbup: