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.
quelle
@powershell Start-Process cmd -Verb runas
. Von Powershell einfach fallen lassen@powershell
. Dies startet cmd mit erhöhten Rechten.Antworten:
Sie können das Skript selbst mit der Option von psexec aufrufen lassen ,
-h
erhö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
xcopy
undreg.exe
immer mit ausgeführt werdenpsexec -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) ...quelle
psexec -h
funktioniert 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.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):
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). ::
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:
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ötigenPAUSE
, 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 ):
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
Ü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
durchSHIFT /1
, die den Dateinamen für die bewahrt%0
ParameterZum 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, umfor
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 wirdcmd.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:
Anführungszeichen (") , Bang (!) , Caret (^) , kaufmännisches Und (&) , andere Sonderzeichen
quelle
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:
quelle
WorkingDirectory
Parameter in geändert werdenStart-Process
runas
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: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:
quelle
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!pushd %~dp0
stattdessen verwenden ... warum? weilpopd
Ich mache es so:
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.
quelle
/d
. Danke Kumpel :) (PS: Pianist auch hier!)cd
Befehl 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
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.
quelle
ECHO UAC.ShellExecute....
Zeile"batchArgs!"
wird jedoch die Variable nicht erweitert. Verwenden Sie"!batchArgs!"
. Meine Bearbeitung wurde abgelehnt, daher kommentiere ich.test.bat "a thing"
oder fehlerhaft"test script.bat" arg1 arg2
. Alles jetzt behoben.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.
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.
quelle
/c %~fnx0 %*'
scheint der Teil jeden Teil außer dem ersten zu belassen. ZB wirdtest.bat "arg1 arg2 arg3"
nur von arg1 weitergeleitetnetsh int set int %wifiname% Enable/Disable
.net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c ""%~fnx0""""'"
Für einige Programme , um das super - geheime Einstellung
__COMPAT_LAYER
auf UmgebungsvariableRunAsInvoker
funktioniert .Kontrolle diese:Auf diese Weise wird keine Benutzerkontensteuerung angezeigt, und der Benutzer wird ohne Administratorrechte fortfahren.
quelle
regedit
. Es hat nur das UAC übersprungen.Ich habe dies am Anfang des Skripts eingefügt:
quelle
cacls
in Windows 7 und neueren Windows - Versionen sind veraltet.pushd "%CD%"
das aktuelle Arbeitsverzeichnis speichert und in das aktuelle Arbeitsverzeichnis wechselt?Es ist 2020 und warum hat Windows noch kein Sudo-Tool?
Also schrieb ich
gsudo
, asudo
fü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:
Sehen Sie gsudo in Aktion:
Installieren:
choco install gsudo
scoop install gsudo
quelle
.Net Framework 4.6
dort zu installieren . Zum Glückchoco install dotnet4.6.2
brachte einige schwer zu bekommende Abhängigkeiten. Dann wurdegsudo config Prompt "$p# "
ein Problem behoben, beiConHost
dem eine falsche Eingabeaufforderung angezeigt wurde (Zeichen der Escape-Sequenz anstelle der roten Schärfe). @ RockPaperLizardObwohl 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.
quelle
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:
Beispiel 1:
Beispiel 2:
quelle
Versuche dies:
Wenn Sie Informationen zu dieser Batchdatei benötigen, führen Sie das HTML / JS / CSS-Snippet aus:
quelle
Die folgende Lösung ist sauber und funktioniert einwandfrei.
Laden Sie die Elevate-Zip-Datei von https://www.winability.com/download/Elevate.zip herunter
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.)
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.
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:
quelle