Es gibt einen einfachen Weg, ohne ein externes Tool verwenden zu müssen - es läuft gut mit Windows 7, 8, 8.1 und 10 und ist auch abwärtskompatibel (Windows XP hat keine Benutzerkontensteuerung, daher ist keine Erhöhung erforderlich - falls das Skript gerade fortfährt).
Schauen Sie sich diesen Code an (ich wurde von dem Code von NIronwolf inspiriert, der im Thread veröffentlicht wurde Batch File - "Zugriff verweigert" unter Windows 7? ) Veröffentlicht wurde, aber ich habe ihn verbessert - in meiner Version wurde kein Verzeichnis erstellt und entfernt auf Administratorrechte prüfen):
::::::::::::::::::::::::::::::::::::::::::::
:: Elevate.cmd - Version 4
:: Automatically check & get admin rights
:: see "https://stackoverflow.com/a/12264592/1016343" for description
::::::::::::::::::::::::::::::::::::::::::::
@echo off
CLS
ECHO.
ECHO =============================
ECHO Running Admin shell
ECHO =============================
:init
setlocal DisableDelayedExpansion
set cmdInvoke=1
set winSysFolder=System32
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation
ECHO **************************************
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
if '%cmdInvoke%'=='1' goto InvokeCmd
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
goto ExecElevation
:InvokeCmd
ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"
:ExecElevation
"%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul & shift /1)
::::::::::::::::::::::::::::
::START
::::::::::::::::::::::::::::
REM Run shell as admin (example) - put here code as you like
ECHO %batchName% Arguments: P1=%1 P2=%2 P3=%3 P4=%4 P5=%5 P6=%6 P7=%7 P8=%8 P9=%9
cmd /k
Das Skript nutzt die Tatsache, dass NET FILE
dass Administratorrechte erforderlich sind, und kehrt zurück, errorlevel 1
wenn Sie diese nicht haben. Die Erhöhung wird erreicht, indem ein Skript erstellt wird, das die Batchdatei neu startet, um Berechtigungen zu erhalten. Dadurch zeigt Windows das UAC-Dialogfeld an und fragt Sie nach dem Administratorkonto und dem Kennwort.
Ich habe es mit Windows 7, 8, 8.1, 10 und mit Windows XP getestet - es funktioniert für alle. Der Vorteil besteht darin, dass Sie nach dem Startpunkt alles platzieren können, was Systemadministratorrechte erfordert, z. B. wenn Sie beabsichtigen, einen Windows-Dienst zu Debugging-Zwecken neu zu installieren und erneut auszuführen (vorausgesetzt, mypackage.msi ist ein Dienstinstallationspaket). ::
msiexec /passive /x mypackage.msi
msiexec /passive /i mypackage.msi
net start myservice
Ohne dieses Skript zur Erhöhung von Berechtigungen würde die Benutzerkontensteuerung Sie dreimal nach Ihrem Administratorbenutzer und Kennwort fragen - jetzt werden Sie zu Beginn nur noch einmal und nur bei Bedarf gefragt.
Wenn Ihr Skript nur eine Fehlermeldung anzeigen und beenden muss, wenn keine Administratorrechte vorhanden sind, anstatt automatisch zu erhöhen, ist dies noch einfacher: Sie können dies erreichen, indem Sie am Anfang Ihres Skripts Folgendes hinzufügen:
@ECHO OFF & CLS & ECHO.
NET FILE 1>NUL 2>NUL & IF ERRORLEVEL 1 (ECHO You must right-click and select &
ECHO "RUN AS ADMINISTRATOR" to run this batch. Exiting... & ECHO. &
PAUSE & EXIT /D)
REM ... proceed here with admin rights ...
Auf diese Weise muss der Benutzer mit der rechten Maustaste klicken und "Als Administrator ausführen " auswählen . Das Skript wird nach der REM
Anweisung fortgesetzt, wenn Administratorrechte erkannt werden. Andernfalls wird das Skript mit einem Fehler beendet. Wenn Sie das nicht benötigen PAUSE
, entfernen Sie es einfach.
Wichtig: NET FILE [...] EXIT /D)
muss sich in derselben Zeile befinden. Es wird hier zur besseren Lesbarkeit in mehreren Zeilen angezeigt!
Auf einigen Maschinen Probleme aufgetreten, die in der oben genannten neuen Version bereits behoben wurden. Eines war auf die unterschiedliche Behandlung von doppelten Anführungszeichen zurückzuführen, und das andere Problem war auf die Tatsache zurückzuführen, dass die Benutzerkontensteuerung auf einem Windows 7-Computer deaktiviert (auf die niedrigste Ebene eingestellt) war, sodass sich das Skript immer wieder selbst aufruft.
Ich habe dies jetzt behoben, indem ich die Anführungszeichen im Pfad entfernt und später erneut hinzugefügt habe. Außerdem habe ich einen zusätzlichen Parameter hinzugefügt, der hinzugefügt wird, wenn das Skript mit erhöhten Rechten neu gestartet wird.
Die doppelten Anführungszeichen werden wie folgt entfernt (Details finden Sie hier ):
setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion
Sie können dann mit auf den Pfad zugreifen !batchPath!
. Es enthält keine doppelten Anführungszeichen, daher kann man es "!batchPath!"
später im Skript sicher sagen .
Die Linie
if '%1'=='ELEV' (shift & goto gotPrivileges)
Überprüft, ob das Skript bereits vom VBScript- Skript aufgerufen wurde , um die Rechte zu erhöhen, und vermeidet so endlose Rekursionen. Es entfernt den Parameter mit shift
.
Aktualisieren:
Um zu vermeiden, die registrieren .vbs
Erweiterung in Windows - 10 , habe ich die Linie ersetzt
"%temp%\OEgetPrivileges.vbs"
durch
"%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
im Skript oben; wird ebenfalls hinzugefügt, cd /d %~dp0
wie von Stephen (separate Antwort) und von Tomáš Zato (Kommentar) vorgeschlagen, um das Skriptverzeichnis als Standard festzulegen.
Jetzt berücksichtigt das Skript die Befehlszeilenparameter, die an das Skript übergeben werden. Vielen Dank an jxmallet, TanisDLJ und Peter Mortensen für Beobachtungen und Inspirationen.
Nach Artjom B. der Hinweis, analysierte ich es und ersetzt SHIFT
durch SHIFT /1
, die den Dateinamen für die bewahrt %0
Parameter
Zum Aufräumen del "%temp%\OEgetPrivileges_%batchName%.vbs"
zum :gotPrivileges
Abschnitt hinzugefügt (wie von mlt vorgeschlagen). Hinzugefügt %batchName%
, um Auswirkungen zu vermeiden, wenn Sie verschiedene Stapel parallel ausführen. Beachten Sie, dass Sie verwenden müssen, um for
die erweiterten Zeichenfolgenfunktionen nutzen zu können, z. B. %%~nk
die nur den Dateinamen extrahieren.
Optimierte Skriptstruktur, Verbesserungen (hinzugefügte Variable, auf vbsGetPrivileges
die jetzt überall verwiesen wird, sodass der Pfad oder Name der Datei leicht geändert werden kann, .vbs
Datei nur löschen , wenn der Stapel erhöht werden musste)
In einigen Fällen war eine andere Aufrufsyntax für die Erhöhung erforderlich. Wenn das Skript nicht funktioniert, überprüfen Sie die folgenden Parameter:
set cmdInvoke=0
set winSysFolder=System32
Ändern Sie entweder den ersten Parameter in set cmdInvoke=1
und überprüfen Sie, ob das Problem dadurch bereits behoben ist. Es wird cmd.exe
dem Skript hinzugefügt , das die Erhebung durchführt.
Oder versuchen Sie, den zweiten Parameter in zu ändern. winSysFolder=Sysnative
Dies kann auf 64-Bit-Systemen hilfreich sein (ist jedoch in den meisten Fällen nicht erforderlich). (ADBailey hat dies gemeldet). "Sysnative" ist nur zum Starten von 64-Bit-Anwendungen von einem 32-Bit-Skripthost erforderlich (z. B. ein Visual Studio-Erstellungsprozess oder ein Skriptaufruf von einer anderen 32-Bit-Anwendung).
Um klarer zu machen, wie die Parameter interpretiert werden, zeige ich es jetzt wie folgt an P1=value1 P2=value2 ... P9=value9
. Dies ist besonders nützlich, wenn Sie Parameter wie Pfade in doppelte Anführungszeichen setzen müssen, z "C:\Program Files"
.
Wenn Sie den VBS - Skript debuggen wollen, können Sie die Add - //X
Parameter auf WScript.exe als erste Parameter, wie vorgeschlagen hier (es für CScript.exe beschrieben wird, funktioniert aber für WScript.exe auch).
Nützliche Links: