Wie kann ich meine Batchdatei automatisch anheben, damit sie bei Bedarf von UAC-Administratorrechten angefordert wird?

209

Ich möchte, dass meine Batchdatei nur erhöht ausgeführt wird. Wenn nicht erhöht, bieten Sie dem Benutzer die Option, den Stapel als erhöht neu zu starten.

Ich schreibe eine Batchdatei, um eine Systemvariable festzulegen, zwei Dateien an einen Speicherort für Programmdateien zu kopieren und ein Treiberinstallationsprogramm zu starten. Wenn ein Windows 7 / Windows Vista-Benutzer ( UAC aktiviert und selbst wenn er ein lokaler Administrator ist) es ausführt, ohne mit der rechten Maustaste zu klicken und "Als Administrator ausführen" auszuwählen, wird ihm das Kopieren der beiden Dateien und das Schreiben der Systemvariablen "Zugriff verweigert" angezeigt .

Ich möchte einen Befehl verwenden, um den Stapel automatisch als erhöht neu zu starten, wenn der Benutzer tatsächlich ein Administrator ist. Andernfalls möchte ich ihnen mitteilen, dass sie Administratorrechte benötigen, um die Batchdatei auszuführen, wenn sie kein Administrator sind. Ich verwende xcopy zum Kopieren der Dateien und REG ADD zum Schreiben der Systemvariablen. Ich verwende diese Befehle, um mit möglichen Windows XP-Computern umzugehen. Ich habe ähnliche Fragen zu diesem Thema gefunden, aber nichts, was sich mit dem Neustart einer Batchdatei als erhöht befasst.

PDixon724
quelle
2
Überprüfen Sie, was ich gepostet habe - Sie benötigen kein externes Tool, das Skript prüft automatisch auf Administratorrechte und erhöht sich bei Bedarf automatisch.
Matt
1
Bitte überlegen Sie, ob Matts Antwort die angekreuzte wäre. Scheint mir so.
Akauppi
Beachten Sie die neuen Windows 10- Hinweise im Kommentarbereich des von mir veröffentlichten Batch-Skripts .
Matt
4
Von cmd : @powershell Start-Process cmd -Verb runas. Von Powershell einfach fallen lassen @powershell. Dies startet cmd mit erhöhten Rechten.
BrunoLM

Antworten:

20

Sie können das Skript selbst mit der Option von psexec aufrufen lassen , -herhöht auszuführen.

Ich bin mir nicht sicher, wie Sie erkennen würden, ob es bereits als erhöht ausgeführt wird oder nicht. Versuchen Sie es möglicherweise nur dann mit erhöhten Dauerwellen, wenn der Fehler "Zugriff verweigert" vorliegt.

Oder Sie könnten einfach die Befehle für das haben xcopyund reg.exeimmer mit ausgeführt werden psexec -h, aber es wäre für den Endbenutzer ärgerlich, wenn er jedes Mal sein Passwort eingeben muss (oder unsicher, wenn Sie das Passwort in das Skript aufgenommen haben) ...

ewall
quelle
10
Danke für die Antwort. Leider glaube ich nicht, dass ich etwas außerhalb der Standard-Windows Vista / 7-Tools verwenden kann, da dies an Kunden außerhalb meines Büros geht. Ich glaube nicht, dass ich PSExec legal vertreiben kann.
PDixon724
2
Ja, ich denke, Sie haben Recht damit - obwohl PSExec jetzt ein Microsoft-Tool ist (da sie die Sysinternals-Leute aufgekauft haben!), Verbietet die EULA die Verbreitung :(
ewall
2
Ich denke, meine Möglichkeiten sind ziemlich begrenzt. Wenn ich wüsste, wie man in VB codiert, könnte ich es zu einer Exe mit einem Admin-Manifest machen, aber ich würde nicht einmal wissen, wo ich anfangen soll. Ich denke, ich werde nur zu Beginn des Stapels warnen, als Administrator ausgeführt zu werden, wenn Windows Vista / 7 ausgeführt wird. Vielen Dank an alle.
PDixon724
1
Ein weiteres Tool von Drittanbietern, das frei weiterverteilbar und einfach zu integrieren und zu erlernen ist, ist AutoIt . Diese Seite zeigt, wie das Skript erhöhte Berechtigungen anfordert.
Ewall
4
psexec -hfunktioniert nicht: 'PSEXESVC-Dienst konnte nicht installiert werden: Zugriff verweigert.' Sie müssen bereits über die Administratorrechte verfügen, um psexec ausführen zu können.
Nicolas
319

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 1wenn 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 REMAnweisung 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 .vbsErweiterung 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 %~dp0wie 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 SHIFTdurch SHIFT /1, die den Dateinamen für die bewahrt %0Parameter

  • Zum Aufräumen del "%temp%\OEgetPrivileges_%batchName%.vbs"zum :gotPrivilegesAbschnitt 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 fordie erweiterten Zeichenfolgenfunktionen nutzen zu können, z. B. %%~nkdie nur den Dateinamen extrahieren.

  • Optimierte Skriptstruktur, Verbesserungen (hinzugefügte Variable, auf vbsGetPrivilegesdie jetzt überall verwiesen wird, sodass der Pfad oder Name der Datei leicht geändert werden kann, .vbsDatei 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=1und überprüfen Sie, ob das Problem dadurch bereits behoben ist. Es wird cmd.exedem Skript hinzugefügt , das die Erhebung durchführt.
    Oder versuchen Sie, den zweiten Parameter in zu ändern. winSysFolder=SysnativeDies 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 - //XParameter 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:

Matt
quelle
9
Tolle Antwort, obwohl es mich ein wenig erstaunt, dass Sie all das tun müssen, um etwas zu tun, das in einigen Fällen eindeutig notwendig ist.
Jcoder
50
In der Windows-Batch-Sprache fehlt ein Befehl wie ELEVATE eindeutig.
Matt
2
Vielleicht ist es einfacher mit Powershell, das die anerkannte Skript-Sprache für komplexere Dinge zu sein scheint, aber ich habe mich bisher nie darum
gekümmert
1
Die Syntax in Powershell ist völlig anders (Verb-Nomen-Syntax), aber Sie können .NET-Assemblys einfach aufrufen. Es ist jedoch etwas schwieriger, damit umzugehen (Signieren von Skripten usw.).
Matt
2
@Matt Können Sie überprüfen, ob Ihre abgelehnte Bearbeitung Ihrer Antwort etwas Wahres enthält ?
Artjom B.
41

Wie jcoder und Matt bereits erwähnt haben, hat PowerShell es einfach gemacht und kann sogar in das Batch-Skript eingebettet werden, ohne ein neues Skript zu erstellen.

Ich habe Matts Skript geändert:

:: Check privileges 
net file 1>NUL 2>NUL
if not '%errorlevel%' == '0' (
    powershell Start-Process -FilePath "%0" -ArgumentList "%cd%" -verb runas >NUL 2>&1
    exit /b
)

:: Change directory with passed argument. Processes started with
:: "runas" start with forced C:\Windows\System32 workdir
cd /d %1

:: Actual work
Ir Relevant
quelle
3
Sie haben Recht, wenn PowerShell installiert ist, können Sie damit die Batch-Datei mit Elevation ausführen (danke für das Code-Snippet!). Und ja, das Etikett wird nicht benötigt. Vielen Dank für die Hinweise, es ist eine +1 wert ... :-)
Matt
2
Beim Aufrufen von cmd verfügt Powershell.exe nicht über die Option -verb runas. Es ist vorhanden, wenn Sie sich bereits in PowerShell befinden.
Adil Hindistan
1
Ich mag diese Lösung wirklich, funktioniert großartig für mich. Unter Windows 8.1 benötigte ich das Label: gotPrivileges, damit es funktioniert.
ShaunO
Ich habe ein Problem, wenn diese Batchdatei auf einem UNC-Pfad entfernt ist.
Ryan Beesley
Ich habe beim Start das Änderungsverzeichnis hinzugefügt, den Ablauf vereinfacht und ein wenig bereinigt. Das Arbeitsverzeichnis kann aus Sicherheitsgründen in Prozessen nicht über den WorkingDirectoryParameter in geändert werdenStart-Processrunas
Ceztko
28

Ich verwende Matts ausgezeichnete Antwort, aber ich sehe einen Unterschied zwischen meinen Windows 7- und Windows 8-Systemen, wenn ich Skripts mit erhöhten Rechten ausführe.

Sobald das Skript unter Windows 8 erhöht ist, wird das aktuelle Verzeichnis auf festgelegt C:\Windows\system32. Glücklicherweise gibt es eine einfache Problemumgehung, indem Sie das aktuelle Verzeichnis in den Pfad des aktuellen Skripts ändern:

cd /d %~dp0

Hinweis: Verwenden Sie diese Option cd /d, um sicherzustellen, dass auch der Laufwerksbuchstabe geändert wird.

Um dies zu testen, können Sie Folgendes in ein Skript kopieren. Führen Sie beide Versionen normal aus, um das gleiche Ergebnis zu erzielen. Führen Sie als Administrator aus und sehen Sie den Unterschied in Windows 8:

@echo off
echo Current path is %cd%
echo Changing directory to the path of the current script
cd %~dp0
echo Current path is %cd%
pause
Stephen Klancher
quelle
1
Guter Hinweis, Stephen. Das Skript sollte also mit enden cd %~dp0, um seinen aktuellen Pfad beizubehalten (ich gehe davon aus, dass dies auch in Win7 funktioniert, sodass der gleiche Befehl verwendet werden kann, obwohl er nur für Win8 + benötigt wird). +1 dafür!
Matt
2
Zu beachten ist, dass dies auch auf meinem System unter Windows 7 erforderlich war.
meh-uk
1
oder pushd %~dp0stattdessen verwenden ... warum? weilpopd
Jaroslav Záruba
27

Ich mache es so:

NET SESSION
IF %ERRORLEVEL% NEQ 0 GOTO ELEVATE
GOTO ADMINTASKS

:ELEVATE
CD /d %~dp0
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 1);close();"
EXIT

:ADMINTASKS
(Do whatever you need to do here)
EXIT

Auf diese Weise ist es einfach und verwendet nur Windows-Standardbefehle. Es ist großartig, wenn Sie Ihre Batch-Datei neu verteilen müssen.

CD /d %~dp0 Setzt das aktuelle Verzeichnis auf das aktuelle Verzeichnis der Datei (falls noch nicht geschehen, unabhängig davon, auf welchem ​​Laufwerk sich die Datei befindet, dank der /d Option).

%~nx0 Gibt den aktuellen Dateinamen mit der Erweiterung zurück (Wenn Sie die Erweiterung nicht einschließen und eine exe mit demselben Namen im Ordner vorhanden ist, wird die exe aufgerufen).

Es gibt so viele Antworten auf diesen Beitrag, dass ich nicht einmal weiß, ob meine Antwort angezeigt wird.

Wie auch immer, ich finde diesen Weg einfacher als die anderen Lösungen, die für die anderen Antworten vorgeschlagen wurden. Ich hoffe, es hilft jemandem.

Matheus Rocha
quelle
4
cd% ~ dp0 funktioniert nicht auf Netzwerklaufwerken. Verwenden Sie stattdessen pushd% ~ dp0.
Stavm
1
Ich liebe die Einfachheit dieser Antwort. Und schließlich ein Grund, Jscript zu verwenden!
Joe Coder
1
Magie! Vielen Dank.
Daniele Orlando
1
@ Wolf Ich habe eine riesige Antwort geschrieben, nur um zu erkennen, dass ich dich falsch verstanden habe ... Ich habe verstanden, was du jetzt meinst. Ich werde es bearbeiten, um das einzuschließen/d . Danke Kumpel :) (PS: Pianist auch hier!)
Matheus Rocha
1
Dies funktioniert gut, aber es ist möglicherweise eine gute Idee, den cdBefehl an den Start zu verschieben (dies stellt sicher, dass der Pfad auch für das erhöhte Skript verfügbar ist - andernfalls wird das erhöhte Skript nur von system32 ausgeführt). Sie sollten auch den Befehl net nach nul umleiten, um die Ausgabe auszublenden:net session >nul 2>&1
Nulano
23

Matt hat eine großartige Antwort, aber sie entfernt alle Argumente, die an das Skript übergeben wurden. Hier ist meine Modifikation, die Argumente enthält. Ich habe auch Stephens Fix für das Arbeitsverzeichnisproblem in Windows 8 integriert.

@ECHO OFF
setlocal EnableDelayedExpansion

NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto START ) else ( goto getPrivileges ) 

:getPrivileges
if '%1'=='ELEV' ( goto START )

set "batchPath=%~f0"
set "batchArgs=ELEV"

::Add quotes to the batch path, if needed
set "script=%0"
set script=%script:"=%
IF '%0'=='!script!' ( GOTO PathQuotesDone )
    set "batchPath=""%batchPath%"""
:PathQuotesDone

::Add quotes to the arguments, if needed.
:ArgLoop
IF '%1'=='' ( GOTO EndArgLoop ) else ( GOTO AddArg )
    :AddArg
    set "arg=%1"
    set arg=%arg:"=%
    IF '%1'=='!arg!' ( GOTO NoQuotes )
        set "batchArgs=%batchArgs% "%1""
        GOTO QuotesDone
        :NoQuotes
        set "batchArgs=%batchArgs% %1"
    :QuotesDone
    shift
    GOTO ArgLoop
:EndArgLoop

::Create and run the vb script to elevate the batch file
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs"
ECHO UAC.ShellExecute "cmd", "/c ""!batchPath! !batchArgs!""", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs"
"%temp%\OEgetPrivileges.vbs" 
exit /B

:START
::Remove the elevation tag and set the correct working directory
IF '%1'=='ELEV' ( shift /1 )
cd /d %~dp0

::Do your adminy thing here...
jxmallett
quelle
1
Dies ist eine nützliche Antwort. In der ECHO UAC.ShellExecute....Zeile "batchArgs!"wird jedoch die Variable nicht erweitert. Verwenden Sie "!batchArgs!". Meine Bearbeitung wurde abgelehnt, daher kommentiere ich.
flog Zwiebel
1
@fliedonion gut entdeckt! Ich bin mir nicht sicher, warum Ihre Bearbeitung abgelehnt wurde, da es definitiv ein Tippfehler war und Ihr Fix funktioniert. Nehmen Sie die Änderung selbst vor und testen Sie sie unter Win 8.1. Nun finden Sie alle Skripte, in denen ich diesen Code verwende ....
jxmallett
2
Das Skript ist bei Verwendung von Argumenten in Anführungszeichen wie test.bat "a thing"oder fehlerhaft "test script.bat" arg1 arg2. Alles jetzt behoben.
jxmallett
Ich habe es geschafft, es zu brechen (aufgrund meines Fehlers: Ausführen eines Skripts vom zugeordneten Netzwerklaufwerk, da Administrator und normaler Benutzer nicht dieselbe Zuordnung haben). Trotzdem: Gibt es eine Möglichkeit, die Ausgabe zu sehen? Für mich musste ich die .vbs finden und die / c in a / K ändern und sie dann manuell sehen.
Andreas Reiff
21

Ich verwende PowerShell, um das Skript mit erhöhten Rechten neu zu starten, wenn dies nicht der Fall ist. Fügen Sie diese Zeilen ganz oben in Ihr Skript ein.

net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c %~fnx0 %*'"
goto :eof
:run
:: TODO: Put code here that needs elevation

Ich habe die 'net name'-Methode aus @ Matts Antwort kopiert. Seine Antwort ist viel besser dokumentiert und enthält Fehlermeldungen und dergleichen. Dieser hat den Vorteil, dass PowerShell bereits unter Windows 7 und höher installiert und verfügbar ist. Keine temporären VBScript-Dateien (* .vbs), und Sie müssen keine Tools herunterladen.

Diese Methode sollte ohne Konfiguration oder Einrichtung funktionieren, solange Ihre PowerShell-Ausführungsberechtigungen nicht gesperrt sind.

Ryan Bemrose
quelle
Wenn Sie eine Liste mit Leerzeichen und getrennten Argumenten bereitstellen, die von Anführungszeichen umgeben sind, um sie als eins zu behandeln, /c %~fnx0 %*'scheint der Teil jeden Teil außer dem ersten zu belassen. ZB wird test.bat "arg1 arg2 arg3"nur von arg1 weitergeleitet
Nicolas Mommaerts
Es scheint, dass, egal was
passiert
Funktioniert bei mir! Ich benutze es für netsh int set int %wifiname% Enable/Disable.
Marslo
2
Ich hatte das gleiche Problem wie Nicolas Mommaerts oben. Ich verstehe nicht, warum es funktioniert (die beste Art der Korrektur), aber das Folgende funktioniert wie es sollte (beachten Sie alle zusätzlichen Anführungszeichen am Ende): net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c ""%~fnx0""""'"
Beben
Ein weiteres Problem (Unannehmlichkeiten) besteht darin, dass das Skript angehalten wird (auf Benutzereingaben wartet), wenn der Serverdienst nicht ausgeführt wird (ich habe ihn aus Gründen deaktiviert). Normalerweise teste ich auf Administratorrechte, indem ich versuche, in den Speicherort der HOSTS- Datei zu schreiben , aber es ist vielleicht besser, den Powershell-Befehl -Verb runas aufzurufen , anstatt sich auf aktivierte Windows-Dienste zu verlassen oder zu versuchen, Dateien zu schreiben.
Script'n'Code
15

Für einige Programme , um das super - geheime Einstellung __COMPAT_LAYERauf Umgebungsvariable RunAsInvoker funktioniert .Kontrolle diese:

set "__COMPAT_LAYER=RunAsInvoker"
start regedit.exe

Auf diese Weise wird keine Benutzerkontensteuerung angezeigt, und der Benutzer wird ohne Administratorrechte fortfahren.

npocmaka
quelle
1
Der Link zur Microsoft-Site funktionierte nicht mehr, daher habe ich ihn in den Inhalt von archive.org geändert. Wenn jemand auf der Microsoft-Website einen funktionierenden Link zu den Inhalten finden kann, aktualisieren Sie ihn bitte auf diese Weise.
RockPaperLizard
1
Es ist immer noch in mittlerer Integrität nicht erhöht , so dass Sie HKLM nicht in bearbeiten können regedit. Es hat nur das UAC übersprungen.
HackingAddict1337
5

Ich habe dies am Anfang des Skripts eingefügt:

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\icacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo args = "" >> "%temp%\getadmin.vbs"
    echo For Each strArg in WScript.Arguments >> "%temp%\getadmin.vbs"
    echo args = args ^& strArg ^& " "  >> "%temp%\getadmin.vbs"
    echo Next >> "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", args, "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs" %*
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------
TanisDLJ
quelle
2
Ich mag die Arg-Verarbeitung in Ihrem Skript. Aber Notiz , die caclsin Windows 7 und neueren Windows - Versionen sind veraltet.
Matt
Fsutil schmutzig ist noch besser
Wolf
1
Wissen Sie, dass die Zeile pushd "%CD%"das aktuelle Arbeitsverzeichnis speichert und in das aktuelle Arbeitsverzeichnis wechselt?
Wolf
3

Es ist 2020 und warum hat Windows noch kein Sudo-Tool?

Also schrieb ich gsudo, a sudofür Windows : Es wird in der aktuellen Konsole erhöht (kein Kontextwechsel zu einem neuen Fenster), mit einem Cache für Anmeldeinformationen (reduzierte UAC-Popups) und es werden auch PowerShell-Befehle erhöht .

Sie können Befehle erhöhen, für die Administratorrechte erforderlich sind, oder den gesamten Stapel, wenn Sie Folgendes möchten:

Einfach voranstellen gsudo alles vor, was erhöht laufen muss.

Beispiel für eine Batch-Datei, die sich selbst erhöht:

@echo off
  rem Test if current context is already elevated:
  whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" 1> nul 2>nul && goto :isadministrator
  echo You are not admin. (yet)
  :: Use gsudo to launch this batch file elevated.
  gsudo "%~f0"
  goto end
:isadministrator
  echo You are admin.
  echo (Do admin stuff now).
:end

Sehen Sie gsudo in Aktion: gsudo Demo

Installieren:

Gerardo Grignoli
quelle
Cool. Vielen Dank. Unter welchen Windows-Versionen funktioniert es?
RockPaperLizard
Die Testsuite läuft auf Server 2019 und meine lokale Entwicklungsbox ist Windows 10 1909. Leider habe ich die Kompatibilität mit anderen älteren Betriebssystemen nicht getestet.
Gerardo Grignoli
Danke Gerardo. Wenn jemand es unter anderen Windows-Versionen versucht, veröffentlichen Sie bitte Ihre Ergebnisse.
RockPaperLizard
Ich habe gerade gsudo v0.7 unter Windows 8.1 getestet und funktioniert. Es ist nicht trivial, .Net Framework 4.6dort zu installieren . Zum Glück choco install dotnet4.6.2brachte einige schwer zu bekommende Abhängigkeiten. Dann wurde gsudo config Prompt "$p# "ein Problem behoben, bei ConHostdem eine falsche Eingabeaufforderung angezeigt wurde (Zeichen der Escape-Sequenz anstelle der roten Schärfe). @ RockPaperLizard
Gerardo Grignoli
Vielen Dank Gerardo. Könnte es neu kompiliert werden, um mit Versionen von .Net Framework vor 4.6 zu arbeiten, oder hängt es von einigen Funktionen ab, die für 4.6 spezifisch sind?
RockPaperLizard
2

Obwohl dies nicht direkt auf diese Frage anwendbar ist, da es einige Informationen für den Benutzer benötigt, hat mich Google hierher gebracht, als ich meine .bat-Datei ausführen wollte, die vom Taskplaner erhöht wurde.

Der einfachste Ansatz bestand darin, eine Verknüpfung zur .bat-Datei zu erstellen, da Sie eine Verknüpfung festlegen können Run as administrator direkt aus den erweiterten Eigenschaften können.

Wenn Sie die Verknüpfung über den Taskplaner ausführen, wird die .bat-Datei mit erhöhten Rechten ausgeführt.

Hugo Delsing
quelle
0

Powershell verwenden.

Wenn die cmd-Datei lang ist, verwende ich eine erste, um eine Erhöhung zu fordern, und rufe dann diejenige an, die die eigentliche Arbeit erledigt.

Wenn das Skript ein einfacher Befehl ist, passt möglicherweise alles in eine Cmd-Datei. Vergessen Sie nicht, den Pfad in die Skriptdateien aufzunehmen.

Vorlage:

@echo off
powershell -Command "Start-Process 'cmd' -Verb RunAs -ArgumentList '/c " comands or another script.cmd go here "'"

Beispiel 1:

@echo off
powershell -Command "Start-Process 'cmd' -Verb RunAs -ArgumentList '/c "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\BIN\x.ps1"'"

Beispiel 2:

@echo off
powershell -Command "Start-Process 'cmd' -Verb RunAs -ArgumentList '/c "c:\bin\myScript.cmd"'"
Manuel Alves
quelle
0

Versuche dies:

@echo off
CLS
: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 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)
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

Wenn Sie Informationen zu dieser Batchdatei benötigen, führen Sie das HTML / JS / CSS-Snippet aus:

document.getElementsByTagName("data")[0].innerHTML="ElevateBatch, version 4, release<br>Required Commands:<ul><li>CLS</li><li>SETLOCAL</li><li>SET</li><li>FOR</li><li>NET</li><li>IF</li><li>ECHO</li><li>GOTO</li><li>EXIT</li><li>DEL</li></ul>It auto-elevates the system and if the user presses No, it just doesn't do anything.<br>This CANNOT be used to create an Elevated Explorer.";
data{font-family:arial;text-decoration:none}
<data></data>


quelle
-3

Die folgende Lösung ist sauber und funktioniert einwandfrei.

  1. Laden Sie die Elevate-Zip-Datei von https://www.winability.com/download/Elevate.zip herunter

  2. In zip sollten sich zwei Dateien befinden: Elevate.exe und Elevate64.exe. (Letzteres ist eine native 64-Bit-Kompilierung, wenn Sie dies benötigen, obwohl die reguläre 32-Bit-Version Elevate.exe sowohl mit der 32- als auch mit der 64-Bit-Version von Windows problemlos funktionieren sollte.)

  3. Kopieren Sie die Datei Elevate.exe in einen Ordner, in dem Windows sie immer finden kann (z. B. C: / Windows). Oder Sie können besser in denselben Ordner kopieren, in dem Sie Ihre Fledermausdatei aufbewahren möchten.

  4. Um es in einer Batch-Datei zu verwenden, stellen Sie dem Befehl, den Sie als Administrator ausführen möchten, einfach den folgenden Befehl voran:

 elevate net start service ...
Vaibhav Jain
quelle
2
Dieser Befehl öffnet nur ein Dialogfenster, in dem der Benutzer gefragt wird, ob dieser Befehl ausgeführt werden darf. Sie können diesen Befehl also nicht in einer Batchdatei verwenden, die OHNE Benutzerinteraktionen ausgeführt werden soll.
Radon8472
Wenn es möglich wäre, OHNE Benutzerinteraktion zu erhöhen, wäre dies eine große Sicherheitslücke, nicht wahr? Jeder Virus würde diese Methode verwenden, um sich ohne Zustimmung des Benutzers zu erheben.
Andrei Belogortseff