Original-User bei administrativer Ausführung

  • Hallo,

    die Ausführung eines compilierten Scriptes unter Vista erfordert Administratorrechte. Ein Anwender mit zu schwachen Rechten muss das Programm mit einem Administrator-Passwort starten. Das funktioniert problemlos. Allerdings liefert @AppDataDir dann das Anwendungsverzeichnis des Admin und nicht des ursprünglich angemeldeten Users.

    Wie bekomme ich den ursprünglichen User und sein AppDataDir heraus? Und wie kann ich lesend und schreibend auf die CurrentUser-Registry des ursprünglichen User zugreifen?

    Hang loose, haklesoft

    Einmal editiert, zuletzt von haklesoft (18. November 2008 um 12:27)

  • Die einzige Idee die ich gerade hätte: Übergib die Umgebungsvariable als Parameter beim Start.

    Im compilierten Script dann prüfen ob ein Parameter übergeben wurde und wenn ja anstatt des
    Standard-Macros benutzen.

    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"

  • Unmittelbar nach dem Start der compilierten Exe liefern auch die Environment-Variablen schon die Admindaten.

    Da brauche ich also so etwas wie einen Aufrufbatch, der seinerseits keine Adminrechte erfordert und meine Exe mit Parametern aufruft.

    Ich bastele morgen mal. Einstweilen vielen Dank für die Anregung.

    Hang loose, haklesoft

  • Ich weiß nicht wie das bei euch ist, aber so haut das schon hin:

    Diese Script kompiliert als Test-Exe:

    Spoiler anzeigen
    [autoit]

    If $CmdLine[0] > 0 Then
    $appdir = $cmdline[1]
    Else
    $appdir = @AppDataDir
    EndIf
    Msgbox(0,"AppDir des Starter's",$appdir)

    [/autoit]

    Jetzt kann diese Exe mittels folgendem Script gestartet werden...

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    GUICreate("Ausführen als...",380,150)
    GUICtrlCreateLabel("Admin-Kennwort:",45,43)
    $Kennwort=GUICtrlCreateInput('',130,40,150,22, $ES_PASSWORD)
    $Login=GUICtrlCreateButton("Start",160,100,60,22,$BS_DEFPUSHBUTTON)
    GUISetState(@SW_SHOW)
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Login
    $UserAppDir = @AppDataDir
    RunAsSet()
    RunAsSet("Administrator","",GUICtrlRead($Kennwort))
    Run(@scriptdir & '\IchAdmin.exe "' & $UserAppDir & '"')
    RunAsSet()
    Exit
    EndSwitch
    Wend

    [/autoit]

    oder mit folgender Befehlszeile (z.B. über eine Desktop-Verknüpfung)...

    Code
    runas /noprofile /user:Administrator "IchAdmin.exe """%appdata%"""

    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"


  • #RequireAdmin hilft dir evtl, bzw. Prüfungen mit IsAdmin, oder auch RunAs...


    Hallo peethebee,

    #RequireAdmin hatte ich drin. Führt aber dazu, dass in jedem Falle ein Adminkonto aktiviert werden muss und dann bekommt meine ScriptExe immer den falschen Anwenderpfad.

    Mit IsAdmin kann ich feststellen, ob der gerade aktuelle User Admin ist. Wenn beim Start schon Adminrechte erforderlich sind, liefert das also immer 1 zurück.

    RunAs könnte helfen, wenn die Exe selbst keine Adminrechte erfordert und nur für einzelne Aktionen mehr Rechte gebraucht werden. In meinem Falle ist das die Registrierung einer DLL.

    Hang loose, haklesoft

  • Jetzt kann diese Exe mittels folgendem Script gestartet werden...
    [spoiler][autoit]#include <GUIConstants.au3>

    GUICreate("Ausführen als...",380,150)
    GUICtrlCreateLabel("Admin-Kennwort:",45,43)
    $Kennwort=GUICtrlCreateInput('',130,40,150,22, $ES_PASSWORD)
    $Login=GUICtrlCreateButton("Start",160,100,60,22,$BS_DEFPUSHBUTTON)
    ...

    Hallo Micha_he,

    meine GUIConstants.au3 verweisen auf die GUIConstantsEx.au3 und in der finde ich die Definitionen für $ES_PASSWORD und $BS_DEFPUSHBUTTON nicht. Wie sind die definiert?

    Hang loose, haklesoft

    Ganz abgesehen davon, dass RunAsSet() in meiner AutoIt-Version nicht enthalten ist.

    Einmal editiert, zuletzt von haklesoft (12. November 2008 um 09:30)

  • $ES_PASSWORD steht in der EditConstants.au3 und $BS_DEFPUSHBUTTON in der ButtonConstants.au3.
    Beider werden bei mir in der GUIConstants.au3 eingebunden.

    Ich nutze noch die ältere Version 3.2.10.0 !

    Aber ich wüsste nicht, das sich dort etwas groß geändert hat.

    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"

  • $ES_PASSWORD steht in der EditConstants.au3 und $BS_DEFPUSHBUTTON in der ButtonConstants.au3.
    Beider werden bei mir in der GUIConstants.au3 eingebunden.

    Ich nutze noch die ältere Version 3.2.10.0 !

    Aber ich wüsste nicht, das sich dort etwas groß geändert hat.


    Nun ja. Die 3.2.12.1 hot offenbar mehr Neues zu bieten, als erwartet. Wie gesagt, auch RunAsSet() iss nich mehr.

    Ich habe inzwischen festgestellt, dass Vista den vorherigen User in einem Registry-Eintrag festhält. Wenn es da einen Unterschied zum aktuellen User gibt, kann ich also entsprechend reagieren.

    Hang loose, haklesoft

  • Du versteifst Dich so auf das fehlende RunAsSet(). Das ist doch nicht unbedingt nötig.
    Erstmal schrieb ich Dir auch wie es mit einer Batch funktioniert und unter der neueren AutoIT-Version sollte es auch mit RunAs() klappen.
    Versuch es z.B.so... (ohne Gewähr, denn RunAs() gibts bei mir nicht)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    GUICreate("Ausführen als...",380,150)
    GUICtrlCreateLabel("Admin-Kennwort:",45,43)
    $Kennwort=GUICtrlCreateInput('',130,40,150,22, $ES_PASSWORD)
    $Login=GUICtrlCreateButton("Start",160,100,60,22,$BS_DEFPUSHBUTTON)
    GUISetState(@SW_SHOW)
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Login
    $UserAppDir = @AppDataDir
    RunAs("Administrator","",GUICtrlRead($Kennwort),0,@scriptdir & '\IchAdmin.exe "' & $UserAppDir & '"')
    Exit
    EndSwitch
    Wend

    [/autoit]

    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"

  • Ih Micha,
    ja so sollte es klappen (habe gerade festgestellt habe ja noch die 3.2.10.0) egal.

    Das Script von Micha einfach vor deine Exe-Datei hängen, prüfen ob der User Admin ist
    If isAdmin then
    starte Skript
    Else
    Passwort eingeben und im RunAs aufruf (gleich nach dem RunAs aber die gestartete Exe schiessen) dann einfach wieder deine eben schonmal aufgerufene Exe ausführen.
    und der User führt das Programm als Admin aus. beim schliessen gehen auch die Rechte wieder verloren.
    Endif

    Sollte das jetzt net so ganz klar geworden sein, poste ich morgen mal ein Beispiel ;)

    MfG
    Der_Doc