Hallo Gemeinde,
ich glaube ich sehe den Wald vor lauter Bäumen nicht: Ich starte mein Programm mit #requireAdmin da es für einige Funktionen Admin-Rechte benötigt.
Dadurch läuft das Proggi aber auch im UserContext des Adminaccounts, der aber kein Zugriff auf die (Netz-)Laufwerke des aufrufenden Users hat.
Gibt es die Möglichkeit das Proggi trotz #requireAdmin, im Context des aufrufenden Users laufen zu lassen, damit ich die Netzlaufwerke desselben benutzen kann?
kompiliertes Autoit Script mit #require Admin aber im Usercontext starten
-
hipfzwirgel -
12. August 2020 um 10:58 -
Erledigt
-
-
Du könntest auch die entsprechenden Teile in ein eigenes Programm auslagern und dann mit entsprechenden Rechten bzw. als entsprechender User starten.
Ob das möglich ist, ergibt sich jedoch aus deinem Programm.
-
Eine dynamische Anpassung des Sicherheitskontexts (Admin/User) ist meines Wissens nach leider nicht möglich. Dies geht nur durch Starten eines neuen Prozesses, siehe dazu auch das Codebeispiel zu _Security__CreateProcessWithToken oder die folgende Diskussion: UAC Elevate and DeElevate Scripts.
Dementsprechend sind mindestens zwei Prozesse nötig, daher ist die Vorgehensweise von Moombas sinnvoll. Ein ganz einfaches Beispiel sähe so aus:
AutoIt: program.au3
Alles anzeigen; Hauptskript im nicht-privilegierten Modus ; Hier die eigentliche Programmlogik mit Netzlaufwerkzugriff & co. MsgBox(64, "", "Befehl ausgeführt. IsAdmin: " & IsAdmin()) ; Hier werden Admin-Rechte benötigt _RunAsAdmin('ACTION1') Func _RunAsAdmin($sAction) ShellExecute(@ScriptDir & "\admin.au3", $sAction) ; für nicht kompilierte Skripte - sonst hier entsprechend anpassen EndFunc
AutoIt: admin.au3
Alles anzeigen#RequireAdmin ; Dieses Skript führt nur Admin-Aktionen aus ; Wir bekommen die gewünschte Aktion als Kommandozeilenparameter If $CmdLine[0] <> 1 Then Exit Switch $CmdLine[1] Case "ACTION1" _Action1() Case "ACTION2" _Action2() EndSwitch Func _Action1() MsgBox(64, "", "Aktion 1 aufgerufen. IsAdmin: " & IsAdmin()) EndFunc Func _Action2() MsgBox(64, "", "Aktion 2 aufgerufen. IsAdmin: " & IsAdmin()) EndFunc
Der Nachteil dieser Methode ist, dass für jede Admin-Aktion die UAC-Abfrage erneut angezeigt wird, da ein neuer Prozess gestartet wird. Das kann ganz schön nervig werden.
Je nach deinem konkreten Anwendungsfall kann es daher mehr Sinn ergeben, auf eines von meinen oben verlinkten Beispielen zurückzugreifen. Alternativ könnte man auch das Admin-Skript nur einmal starten und dann über Interprozesskommunikation die auszuführenden Aktionen übermitteln.
-
Alternativ könnte man auch das Admin-Skript nur einmal starten und dann über Interprozesskommunikation die auszuführenden Aktionen übermitteln.
Genau so würd ich das machen.User Programm ohne Privilegien startet automatisch einen Admin Prozess, welcher unsichtbar im Hintergrund auf Befehle des User Programms wartet. Eine UAC Abfrage und fertig.