evinben
Goto Top

Batch direkt mit UAC (Kontensteuerungsabfrage) und übergebenen Argumenten starten.

Die übergebenen Argumente mit dem momentanen Code-Stand gehen verloren.

Einen schönen Tag!

Mit dem Code unten ist es möglich den Batch direkt mit UAC zu starten, ohne den Umweg über das Kontextmenü "Als Administrator ausführen".
Da ich viele Batch-Dateien mit Argumente starte, ist der momentane Code-Aufbau halb so nützlich, da das übergebene Argument verloren geht.
Seit einiger Zeit habe ich viele Tricks ausprobiert, um das Argument an die sich neu öffnende CMC-Prozedur erzwungen weiterzuleiten aber leider schaffe ich es nicht alleine, komme nicht weiter und möchte euch um eure Hilfe bitten.
Das eigentliche Problem ist in diesem Code-Aufbau, dass die erste CMD-Prozedur geschlossen und eine neue CMD-Prozedur über VB-Skript aufgerufen wird und da ist die wesentliche Schwachstelle momentan.
Gibt es nun eine Möglichkeit zumindest die ersten fünf Argumente übergeben zu können?

So sieht der Code aus:

:Batch mit erhöhten Rechten (mit Kontensteuerungsabfrage) starten.
:Eine Alternative zur Auswahl der Kontextmenü-Option "Als Administrator ausführen" mit Rechtsklick über der Datei.   


@echo off
@prompt -$G
chcp 1252 >nul
echo.

:--------------------------------------
:Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"  
 
: If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (  
Echo Administrator-Rechte anfordern...
goto UACPrompt
) else (goto gotAdmin)
 
:UACPrompt
Echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"  
Echo UAC.ShellExecute %0, "", "", "runas", 1 >> "%temp%\getadmin.vbs"  
 
"%temp%\getadmin.vbs"  
call: Exit /b
 
:gotAdmin
if exist "%temp%\getadmin.vbs" (Del "%temp%\getadmin.vbs")  
Pushd "%CD%"  
CD /D "%~dp0"  
:--------------------------------------


:Code zum Ausführen.
:=================================

:Z. B.
takeown /f %1 && icacls %1 /grant Administratoren:F

pause >nul


Ich bedanke mich sehr für eure Ideen und Hilfe ganz herzlich!

Gruß
evinben

Content-ID: 183908

Url: https://administrator.de/contentid/183908

Ausgedruckt am: 22.11.2024 um 16:11 Uhr

Centauri
Centauri 22.04.2012 um 13:46:23 Uhr
Goto Top
Hallo evinben,

Vielleicht hilft dir das weiter.

Tschüss

Centauri
Dani
Dani 22.04.2012 um 13:53:08 Uhr
Goto Top
Moin,
Vielleicht hilft dir das weiter.
Und was genau?


Grüße,
Dani
Centauri
Centauri 22.04.2012 um 14:27:48 Uhr
Goto Top
bastla
bastla 22.04.2012 um 16:14:29 Uhr
Goto Top
Hallo evinben!

Rein "handwerklich" eher so:
:Batch mit erhöhten Rechten (mit Kontensteuerungsabfrage) starten.
:Eine Alternative zur Auswahl der Kontextmenü-Option "Als Administrator ausführen" mit Rechtsklick über der Datei.   
@echo off
prompt -$G
chcp 1252 >nul
echo.

:--------------------------------------
:Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" && goto :gotAdmin  

Echo Administrator-Rechte anfordern...
set "Params=%*"  
>"%temp%\getadmin.vbs" Echo CreateObject("Shell.Application").ShellExecute "%~f0","%Params:"=""%",,"runas",1  
"%temp%\getadmin.vbs"  
Exit /b
 
:gotAdmin
del "%temp%\getadmin.vbs" 2>nul  
Pushd "%~dp0"  
:--------------------------------------


:Code zum Ausführen.
:=================================

:Z. B.
takeown /f %1 && icacls "%ArgumentA%" /grant Administratoren:F  
popd
- wobei ich mich frage, woher "%ArgumentA%" kommen soll ...

Grüße
bastla
evinben
evinben 23.04.2012 um 14:49:22 Uhr
Goto Top
Hallo Centauri,

mit Argumenten kann ich bereits in vbs umgehen (von bastla gelernt face-smile. Das Problem hat daran bestanden die Argumente an die neue CMD-Prozedur zu übergeben…

Hallo bastla!
Wie immer erfüllst du meine Wünsche hier. DANKEEE!
Der Batch funktioniert mit Argumentübergaben endlich und der in ihm unten integrierte Code zum Ausführen wird tatsächlich mit erhöhten Rechten erfolgreich ausgeführt.

wobei ich mich frage, woher "%ArgumentA%" kommen soll ...
Das sind die verbliebenen Rest-Leichen aus meinen unzähligen Experimenten und dies habe ich oben auf %1 gleich korrigiert. Entschuldigung für die Verwirrung.

Nun kann ich über das Kontextmenü über einem Ordner oder über einer Datei den Besitz mal schnell übernehmen. 1. Projekt abgeschlossen.

Baue ich nun die UAC in jedem Batch ein (wie vom Anfang an geplant gehabt), welcher zur Ausführung unbedingt administrative Rechte erfordert, so erscheint zwar die UAC-Abfrage aber nach deren Bestätigung wird z. B. der nachfolgende Code dennoch nicht mit administrativen Rechten ausgeführt: “Zugriff verweigert“. Das ist mir nun wirklich ein Rätsel und komme schon den ganzen Vormittag von dem Problem nicht weg face-sad.
Hier sind die Schritte, die ich unternommen habe:
Der von dir getunte Code von 1. bis 26. Zeile 1:1 übernehmen und unter dem Namen „Batch mit Kontensteuerungsabfrage starten_Schablone.bat“ in einem beliebigen Verzeichnis abspeichern.
In einem neuen Verzeichnis eine Verknüpfung zu „Batch mit Kontensteuerungsabfrage starten_Schablone.bat“ erstellen und hier eine neue Batch mit einem beliebigen Namen, z. B. „Inastall“, wie folgt erstellen:
@echo off
@prompt -$G
chcp 1252 >nul
PushD %~dp0
echo.

:Als Administrator ausführen
call "Batch mit Kontensteuerungsabfrage starten_Schablone.bat.lnk" Parameter  

copy "Besitz übernehmen_mit Argument.bat" "%AppData%\Install"  
regedit /s "GotAdministratorsOwnership.reg"  

pause >nul


Hier sind zwei Probleme zu beobachten:
1. Die Datei "Besitz übernehmen_mit Argument.bat", deren Berechtigungen gezielt während des Testes nur der Benutzer-Gruppe „Administratoren“ zugeteilt ist, wird nicht kopiert (“Zugriff verweigert“), obwohl die UAC jeweils bestätigt wird. Führe ich allerdings die Install-Batch-Datei auf der konventionellen Art aus - gewöhnlich über Rechtsklick „Als Administrator ausführen“, dann ist es alles bestens und diese Datei, die nur auf Administratoren-Berechtigungen limitiert ist, wird brav dorthin kopiert - wie es sich gehört.
2. Beim Ausführen der Zeile mit regedit /s… kommt seltsamerweise erneute UAC Abfrage (also zweimal nacheinander bei jeder Batch-Ausführung). Beim Ausführen auf der konventionellen Art erscheint die UAC dagegen doch nur einmal.

Irgendwelche Ideen zur Behebung dieser Krankheit? Bzw. habe ich etwas falsch gemacht, was ich bei so einer Konstellation dazu noch unbedingt beachten muss?

Gruß
evinben
106009
106009 23.04.2012 um 14:57:39 Uhr
Goto Top
Hi,

probiere deine Batches doch ohne deinen ganzen Kram zur Rechtemanipulation aus:
Set  __COMPAT_LAYER=RunAsInvoker 
start "" {Pfad\}Programmname.exe Parameter  

Ob's funktioniert, wirst du sehen, keine Garantie.

http://technet.microsoft.com/de-de/library/dd638389(v=ws.10).aspx

Gruß
bastla
bastla 23.04.2012 um 15:00:48 Uhr
Goto Top
Hallo evinben!

Eigentlich dürfte das ja gar nicht funktionieren, da zwar der per "call" aufgerufene Batch mit Admin-Rechten läuft, aber danach ja wieder der ursprüngliche Batch (zB "Inastall") ausgeführt wird ...

Grüße
bastla
evinben
evinben 23.04.2012 um 18:49:23 Uhr
Goto Top
Hallo ollidolli!

die Zeile Set __COMPAT_LAYER=RunAsInvoker war mir neu und für einige Fälle (z. B. beim Kopieren wie oben erwähnt wurde) doch ausreichend! Das Bessere daran ist - neben dem simplen Aufbau, dass die UAC nicht erscheint ;). Allerdings so wie ich es verstanden habe werden nicht volle Administrator-Rechte, sondern eingeschränkte Rechte benutzt. Z. B. beim Starten von Registry-Editor (mit start regedit.exe) werden angeblich die Schlüssel nur im Lesemodus angezeigt. Ich werde auf jeden Fall diese Varianten in der nächsten Zeit ausgiebig testen und werde gerne berichten.


Hallo bastla!

Eigentlich dürfte das ja gar nicht funktionieren…
OK. Dann werde ich halt den Code in jeder Batch in der Kopfzeile einbauen müssen. Zwar wird in jeder Batch etwas unübersichtlicher und der Code ist kaum ausbaufähig (ich bin soweit es geht für mein Schablonen-System mit Verknüpfungen face-wink ), nur wenn es nicht anders geht, dann mit Einfügen&Kopieren ist es allermals bessere und vor allem auf Dauer gesehen "robuste Methode". Jedenfalls besser so, als ständig recht zu klicken und die Option „Als Administrator ausführen“ zu wählen. Hier ist es vor allem aus diesem Grund für mich als Anwender verwirrender, da die Hälfte meiner Batches auch ohne Administratorrechte laufen, ich als Anwender nicht jede Batch-Datei in der Beschriftung mit „RunAsAdmin…“ und sonstiges benennen möchte und so muss ich leider öfter zweimal eine Batch starten, für die doch erhöhte Rechte erforderlich sind.
Mit dem verbesserten Code von dir oder mit der Methode von ollidolli ist es mir nun möglich in einer Batch-Datei vom Anfang an fest zu definieren, dass diese immer mit erhöhten Rechten gestartet werden soll.
Schön!

Vielen – vielen Dank euch beide und insbesondere dir bastla für deine Mühe mir den großen Code da oben zu schreiben. Ohne deine Hilfe wäre ich sicherlich mit meinen momentanen Kenntnissen nicht weiter gekommen.

Projekt abgeschlossen!

Gruß
evinben.