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?

    'RunAs' funktioniert nicht.

    Durch Test konnte ich ermitteln, dass RunAs keine Lösung ist. Hier die somit hinfälligen Gedanken dazu.

    RunAs - Hierzu habe ich Unmengen an Infos gefunden, die teils schwammig, teils widersprüchlich sind. (Das Meiste war in englisch.) Für mich hat sich folgendes herauskristalliesiert. Mit RunAs erscheint ein Dialog, der Benutzername, Passwort, usw. abfragt. Das soll einmalig erfolgen, die Daten werden dann gespeichert und bei weiteren Aufrufen automatisch verwendet. Ich nenne das jetzt mal "Admin-Freischalten" Wie ist das denn wirklich, stimmt davon etwas?

    Sollte es so sein, dass sich das Admin-Freischalten isoliert auf das gewünschte fremde Programm bezieht, wäre das ein Volltreffer! Das wäre genau richtig und in der Praxis akzeptabel.

    Nicht akzeptabel wäe es, wenn es sich auf das AutoIt-Script bezieht, oder noch schlimmer, wenn es sich auf ALLE Programme bezieht, also quasi die UAC aushebelt/ausschaltet.

    Bei meinen Recherchen wurde da oft etwas in der Art geschrieben, aber ich konnte nicht die genauen Zusammenhänge erfahren.

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

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    10 Mal editiert, zuletzt von Professor Bernd (15. August 2019 um 00:20)

  • 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

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    Einmal editiert, zuletzt von Professor Bernd (14. August 2019 um 23:29)

  • 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
    If Not IsAdmin() Then
       MsgBox(16, "Meldung !", "Fehlende Benutzerrechte")
       Exit
    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 (14. August 2019 um 21:22) 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.

    Unnötiger Text zu 'RunAs'

    Edit: Nachdem ich meine Verwechselung der Parameter bemerkt habe und bei RunAs also nur ein Netzwerk bezogener Dialog aufgerufen wird, habe ich die Eingabe nun probiert. Es tut sich dann aber rein gar nichts! Somit fällt RunAs komplett weg.

    Verwechselt hatte ich die Parameter

    Falsch: $RUN_LOGON_PROFILE (1) - Interaktives Logon mit Profil.

    Richtig: $RUN_LOGON_NETWORK (2) - Nur Netzwerk-Authentifizierung.


    RunAs - Bisher einzige mögliche Alternative. Um auch das kurz zu halten: Alle Informationen von euch, vom INet und von eigenen Tests, darunter auch die Hilfe zur runas.exe in der Konsole (Tip von Bitnugger), weißen auf folgendes hin: Nur der Aufruf mit "$RUN_LOGON_NETWORK (2) - Nur Netzwerk-Authentifizierung" könnte noch eine mögliche Lösung sein. Kann jemand darüber genauere Infos machen?

    Bei meinen Tests wurde ein UAC-Dialog aufgerufen, in dem man das Passwort eingeben soll, das ich aber beim Aufruf von RunAs schon übergeben habe. Das deutet darauf hin, dass an den INet-Infos was dran sein könnte, die sagen, dass das Passwort nach einmaliger Eingabe gespeichert und beim nächsten Mal nicht mehr abgefragt wird. Das habe ich aber NICHT ausprobiert! Da ich nicht abschätzen kann, ob das dann nur für das eine Programm gilt, oder die ganze UAC aushebelt, habe ich an der Stelle immer abgebrochen. Bevor ich das probiere: Kann jemand darüber was genaues sagen?

    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

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    7 Mal editiert, zuletzt von Professor Bernd (15. August 2019 um 00:04) 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!?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • 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 ...)?

  • Weiß zufällig jemand, wie man Macrium Reflect abgewöhnt, SysTray-Infos aufpoppen zu lassen? Die kommen bei JEDEM Backup, 1x vorher, 1x nachher, + Ding-Dong Ding-Dong = nervt.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • 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:

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.