Wie kann ich auto-erhöhen meine batch-Datei, so dass Sie Anfragen von UAC Administratorrechte, falls erforderlich?
Ich möchte, dass meine batch-Datei zum ausführen nur erhöhte. Wenn Sie nicht erhöht sind, stellen eine option für die user zum relaunch batch-als erhöht.
Schreibe ich eine batch-Datei um eine system-variable, kopieren Sie zwei Dateien auf eine Program Files Speicherort, und starten Sie eine Treiber-installer. Wenn ein Windows 7/Windows Vista-Benutzer (UAC aktiviert und auch wenn Sie eine lokale admin) läuft es ohne der rechten Maustaste und wählen "als Administrator Ausführen", Sie bekommen "Zugriff Verweigert" kopieren Sie die beiden Dateien und das schreiben der system-Variablen.
Ich würde gerne einen Befehl verwenden, um automatisch starten Sie den batch als hoch, wenn der Benutzer ist in der Tat ein administrator. Andernfalls, wenn Sie kein administrator sind, will ich Ihnen sagen, dass Sie Administratorrechte benötigen, um die batch-Datei auszuführen. Ich bin mit xcopy um die Dateien zu kopieren und REG ADD schreiben der system-Variablen. Ich verwende diese Befehle befassen sich mit möglichen Windows XP-Maschinen. Ich habe festgestellt, ähnliche Fragen zu diesem Thema, aber nichts, das sich mit der Wiederbelebung einer batch-Datei als erhöht.
Bitte überlegen Sie, ob Matt ' s Antwort wäre das abgehakt? Scheint so zu mir.
möglich, Duplikat der Wie auf Anfrage Administrator-Zugriff innerhalb einer batch-Datei
Bitte betrachten Sie das neue Windows 10 - Hinweise in den Kommentaren-Abschnitt des batch-Skript habe ich geschrieben.
Von cmd:
@powershell Start-Process cmd -Verb runas
. Aus der Powershell einfach @powershell
. Dies startet cmd mit erhöhten rechten.InformationsquelleAutor PDixon724 | 2011-08-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie das Skript ruft sich selbst mit psexec's
-h
Ausführung der option erhöht.Ich bin mir nicht sicher, wie Sie Sie erkennen würde, wenn er schon läuft, so wie erhöhte oder nicht... vielleicht versuchen Sie es erneut mit erhöhten Berechtigungen nur, wenn es einen Zugriff Verweigert Fehler?
Oder, man könnte einfach die Befehle für die
xcopy
undreg.exe
immer ausgeführt werden, mitpsexec -h
, aber es wäre ärgerlich für den end-user brauchen, wenn Sie zur Eingabe Ihres Kennworts jedes mal (oder unsicher sein, wenn Sie das Kennwort im Skript)...Yup, ich denke, Sie sind Recht--obwohl PSExec ist jetzt ein tool von Microsoft (weil Sie kaufte sich der Sysinternals Jungs!) die EULA nicht verbieten Verteilung 🙁
Ich denke, meine Möglichkeiten sind ziemlich begrenzt. Wenn ich wüsste wie der code in VB, ich könnte es machen, eine exe-Datei mit admin-manifest, aber ich würde nicht einmal wissen, wo zu beginnen. Ich denke, ich werde nur warnen, am Anfang der batch als admin ausführen, wenn Sie mit Windows Vista/7. Vielen Dank an alle.
Ein weiteres 3rd-party-tool, das möglicherweise frei verteilbar und einfach zu integrieren und zu lernen, ist AutoIt; dieser Seite zeigt, wie das Skript fordert erhöhte Rechte.
psexec -h
funktioniert nicht: 'Couldn' T install PSEXESVC service: Zugriff verweigert.". Sie müssen bereits über die administrator-Rechte zum ausführen von psexec.InformationsquelleAutor ewall
Gibt es eine einfache Möglichkeit, ohne die Notwendigkeit, ein externes tool - es läuft wunderbar mit Windows 7, 8, 8.1 und 10 und ist rückwärts-kompatibel zu (Windows XP hat keine Benutzerkontensteuerung, also die Höhe ist nicht erforderlich - in diesem Fall das Skript nur Erlös).
Überprüfen Sie heraus diesen code (ich war inspiriert durch den code durch NIronwolf gepostet in dem thread Batch-Datei "Zugriff Verweigert" Auf Windows 7?), aber ich habe es verbessert - in meiner version gibt es kein Verzeichnis erstellt und entfernt, um zu überprüfen, für die Administratorrechte):
Das Skript nutzt die Tatsache, dass
NET FILE
erfordert Administratorrechte und zurückerrorlevel 1
wenn Sie es nicht haben. Die Höhe wird erreicht, indem Sie ein Skript erstellen, die re-startet die batch-Datei, um Berechtigungen zu erhalten. Dies bewirkt, dass Windows zu präsentieren, die das UAC-Dialogfeld und fragt Sie für das administrator-Konto und Passwort.Ich habe es getestet mit Windows 7, 8, 8.1, 10 und mit Windows XP - es läuft gut für alle.
Der Vorteil ist, nach dem start-Punkt Sie können alles, was benötigt system-administrator-Privilegien, zum Beispiel, wenn Sie beabsichtigen, Sie zu re-installieren und re-führen Sie ein Windows-Dienst für debugging-Zwecke (davon ausgegangen, dass MeinPaket.msi ist service-installer-Paket):
Ohne dieses Privileg Erhöhung Skript, UAC würde Sie bitten, drei mal für Ihre administrator-Benutzer-und-Passwort - jetzt bist du gefragt, nur einmal am Anfang, und nur, wenn erforderlich.
Wenn Ihr Skript nur braucht, um zu zeigen Sie eine Fehlermeldung und beenden, wenn es gibt keine administrator-Rechte statt auto-erhöhen, das ist sogar noch einfacher: Sie können dies erreichen, indem Sie den folgenden am Anfang des Skripts:
Diese Weise, der Benutzer hat mit der rechten Maustaste klicken, und wählen Sie "als administrator Ausführen". Das Skript wird fortgesetzt, nachdem die
REM
Aussage, wenn es erkennt, administrator-Rechte, sonst wird mit einem Fehler beenden. Wenn Sie nicht erforderlichPAUSE
, entfernen Sie es einfach.Wichtig:
NET FILE [...] EXIT /D)
muss auf der gleichen Linie. Es ist angezeigt, die hier in mehreren Zeilen zur besseren Lesbarkeit!Auf einigen Maschinen, ich habe festgestellt, Probleme, die gelöst in der neuen version oben bereits. Man war aufgrund der unterschiedlichen Anführungszeichen Handhabung, und das andere Problem war, aufgrund der Tatsache, dass die UAC war deaktiviert (eingestellt auf niedrigster Stufe) auf einer Windows 7-Rechner, damit das script ruft sich selbst wieder und wieder.
Ich behoben haben dies jetzt durch Strippen die Anführungszeichen in dem Pfad, und re-adding Sie später, und ich habe einen zusätzlichen parameter, die Hinzugefügt wird, wenn das Skript neu startet mit erhöhten rechten.
Doppelte Anführungszeichen werden entfernt, indem die folgenden (details sind hier):
Kann dann auf den Pfad mit
!batchPath!
. Es enthält keine doppelten Anführungszeichen, so ist es sicher zu sagen"!batchPath!"
später im Skript.Die Linie
überprüft, ob das Skript bereits genannt worden, die von der VBScript Skript zum erhöhen der Rechte, damit zur Vermeidung von endlosen rekursionen. Es entfernt die parameter
shift
.Update:
Um zu vermeiden, dass Sie zum registrieren der
.vbs
Erweiterung in Windows 10, ich habe ersetzt die Linie"%temp%\OEgetPrivileges.vbs"
durch
"%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
in dem oben beschriebenen Skript; auch Hinzugefügt
cd /d %~dp0
wie vorgeschlagen von Stephen (separat beantworten) und Tomáš Zato (Kommentar), um Skript-Verzeichnis als default.Nun das Skript Ehrungen Kommandozeilen-Parameter übergeben werden. Dank jxmallet, TanisDLJ und Peter Mortensen für Beobachtungen und Inspirationen.
Laut Artjom B. s Hinweis, ich habe es analysiert und ersetzt haben
SHIFT
durchSHIFT /1
, was bewahrt die Dateinamen für die%0
parameterHinzugefügt
del "%temp%\OEgetPrivileges_%batchName%.vbs"
zu den:gotPrivileges
Abschnitt zu bereinigen (wie mlt vorgeschlagen). Hinzugefügt%batchName%
zu vermeiden Auswirkungen, wenn man verschiedene Chargen parallel. Beachten Sie, dass Sie brauchen, um zu verwendenfor
zu können, nutzen Sie die erweiterte string-Funktionen, wie%%~nk
, die extrahiert nur den Dateinamen.Optimierte Skript-Struktur, Verbesserungen (zusätzliche variable
vbsGetPrivileges
die nun verwiesen wird überall erlauben, ändern Sie den Pfad oder den Namen der Datei einfach nur löschen.vbs
batch-Datei, wenn nötig, erhöht werden)In einigen Fällen, eine andere Aufruf-syntax erforderlich war, für die elevation. Wenn das Skript nicht funktioniert, überprüfen Sie die folgenden Parameter:
set cmdInvoke=0
set winSysFolder=System32
Entweder ändern Sie den 1. parameter
set cmdInvoke=1
und überprüfen Sie, ob das schon das Problem behebt. Es wirdcmd.exe
um das Skript ausführen der Höhe.Oder versuchen, ändern Sie den 2. parameter zu
winSysFolder=Sysnative
, das könnte helfen (ist aber in den meisten Fällen nicht erforderlich) auf 64-bit-Systeme. (ADBailey hat dies berichteten). "Sysnative" ist nur erforderlich für den Start der 64-bit-Anwendungen von einer 32-bit-Scripting-host (z.B. ein Visual-Studio-build-Prozess oder Skript-Aufruf von einem anderen 32-bit-Anwendung).Zu machen, mehr klar, wie der Parameter interpretiert werden, bin ich die Anzeige jetzt wie
P1=value1 P2=value2 ... P9=value9
. Dies ist besonders nützlich, wenn Sie zum einschließen von Parametern wie Pfade in doppelten Anführungszeichen, z.B."C:\Program Files"
.Nützliche links:
Anführungszeichen (""), Bang (!), Caret-Zeichen (^), Kaufmännisches und-Zeichen (&), Andere Sonderzeichen
In der Tat, ein Befehl wie ELEVATE fehlt eindeutig in der Windows batch-Sprache.
Vielleicht ist es einfacher mit powershell das scheint zu sein, die genehmigt scripting lanaguge für komplexere Sachen, aber ich habe nie die Mühe gemacht, zu lernen, es ist so weit 🙁
Die syntax in der powershell ist völlig anders (verb-Substantiv-syntax), aber es ermöglicht es Ihnen zu nennen .NET-assemblies problemlos. Aber es ist ein bisschen schwieriger zu handhaben (Unterzeichnung des Skripts etc).
Können Sie überprüfen, ob es gibt einige Wahrheit hinter dieser lehnte Bearbeiten auf deine Antwort?
InformationsquelleAutor Matt
Als jcoder und Matt erwähnt, PowerShell, machte es einfach, und es könnte sogar sein, eingebettet in das batch-Skript ohne das erstellen einer neuen Skript.
Modifizierte ich Matt ' s script:
Gibt es keine Notwendigkeit für die
:getPrivileges
label.Beim aufrufen von cmd Powershell.exe nicht -verb runas-option. Es gibt Sie, wenn Sie bereits in der PowerShell.
Ich mag diese Lösung, funktioniert Super für mich. Auf Windows 8.1 habe ich erfordern :gotPrivileges label für Sie zu arbeiten.
Ich bin der Kollision mit einem problem, wenn diese batch-Datei ist remote auf einem UNC-Pfad.
InformationsquelleAutor Ir Relevant
Ich bin mit Matt ' s ausgezeichnete Antwort, aber ich sehe einen Unterschied zwischen meinem Windows 7 und Windows 8-Systemen bei der Ausführung erhöhte scripts.
Einmal das Skript erhöht auf Windows 8, wird das aktuelle Verzeichnis festgelegt ist
C:\Windows\system32
. Glücklicherweise gibt es eine einfache Abhilfe durch ändern Sie das aktuelle Verzeichnis in den Pfad des aktuellen Skripts:Hinweis: Verwenden Sie
cd /d
um sicherzustellen Laufwerksbuchstaben auch geändert.Um dies zu testen, können Sie kopieren Sie den folgenden, um ein Skript. Normalerweise laufen beide Versionen zu sehen, das gleiche Ergebnis. Als Admin ausführen und sehen den Unterschied in Windows 8:
cd %~dp0
zu behalten, den aktuellen Pfad (ich nehme an, das funktioniert in Win7 als auch, so dass der gleiche Befehl verwendet werden, obwohl nur für Win8+). +1 dafür!!!!Der Hinweis, dies war auch erforderlich, auf meinem system läuft Windows 7.
oder verwenden Sie
pushd %~dp0
statt... warum? dapopd
InformationsquelleAutor Stephen Klancher
Ich es so machen:
Diese Weise ist es einfach und verwenden Sie nur die windows-Standard-Befehle.
Es ist großartig, wenn Sie brauchen, verteilen Sie die batch-Datei.
CD /d %~dp0
Setzt das aktuelle Verzeichnis auf die Datei das aktuelle Verzeichnis (wenn es nicht bereits, unabhängig von dem Laufwerk, die Datei wird Dank der/d
option).%~nx0
Gibt den aktuellen Dateinamen mit der Erweiterung (Wenn Sie nicht zählen die Ausweitung und dort ist eine exe-Datei mit dem gleichen Namen auf den Ordner, es wird rufen Sie die exe-Datei).Gibt es so viele Antworten auf dieses post, ich weiß gar nicht, ob meine Antwort zu sehen sein wird.
Trotzdem, ich finde diesen Weg einfacher als die anderen Lösungen vorgeschlagen, auf die anderen Antworten, ich hoffe, es hilft jemand.
Ich Liebe die Einfachheit dieser Antwort. Und endlich ein Grund für die Verwendung von Jscript!
Magic! Ich danke Ihnen sehr.
Ich tippte eine riesige Antwort nur zu wissen, dass ich falsch verstanden... ich habe, was du jetzt meinst. Ich werde es Bearbeiten, umfassen die
/d
. Danke Kamerad 🙂 (P. S.: der Pianist hier auch!)Dies funktioniert gut, aber es könnte eine gute Idee sein, verschieben Sie die
cd
Befehl zum starten (dadurch wird sichergestellt, dass der Pfad ist auch auf der erhöhten Skript - sonst ist die erhöhte script läuft einfach aus system32). Sollten Sie auch umleiten der net-Befehl nul, es zu verbergen, Ausgabe:net session >nul 2>&1
InformationsquelleAutor Matheus Rocha
Matt hat eine tolle Antwort, aber es entfernt keine Argumente an das Skript übergeben. Hier ist meine Modifikation, hält Argumente. Ich habe auch integriert Stephen ' s fix für das Arbeitsverzeichnis ein problem in Windows 8.
ECHO UAC.ShellExecute....
Linie"batchArgs!"
wird nicht erweitert, variable. Verwenden"!batchArgs!"
. Meine änderung wurde abgelehnt, so dass ich kommentieren.gut erkannt! Ich bin mir nicht sicher, warum deine Bearbeitung wurde zurückgewiesen, weil das war definitiv ein Tippfehler und dein fix funktioniert. Gemacht die selber ändern und es getestet auf Win 8.1. Jetzt finden Sie alle Skripts, wo ich diesen code verwenden....
Das Skript brach bei der Verwendung von zitierten Argumenten, wie
test.bat "a thing"
oder"test script.bat" arg1 arg2
. Alles ist jetzt behoben.Ich schaffte es, es zu brechen (durch meine Schuld: Skript aus dem zugeordneten Netzlaufwerk, da der admin und der normale Benutzer nicht haben, gleiche Zuordnung). Trotzdem: gibt es eine Möglichkeit, um die Ausgabe zu sehen? Für mich, ich hatte zu finden .vbs, und ändern Sie die Optionen /c, /K, und dann sah Sie es manuell.
Alles gute auf Win 7 SP1 - danke!!!
InformationsquelleAutor jxmallett
Ich PowerShell verwenden, um re-starten Sie das Skript hoch, wenn es nicht. Fügen Sie die folgenden Zeilen ganz oben in Ihrem Skript.
Kopierte ich die "net name" Methode von @Matt ' s Antwort. Seine Antwort ist viel besser dokumentiert und hat Fehlermeldungen und dergleichen. Dieser hat den Vorteil, dass die PowerShell bereits installiert ist und auf Windows 7 und bis. Keine temporären VBScript (*.vbs) Dateien, und Sie nicht haben, um tools herunterzuladen.
Diese Methode sollte funktionieren, ohne Konfiguration oder setup, so lange, wie Sie Ihre PowerShell die Ausführung Berechtigungen nicht gesperrt.
/c %~fnx0 %*'
Teil zu verlassen scheint jedes Teil neben der ersten. ZB vontest.bat "arg1 arg2 arg3"
nur arg1 übergeben vorwärtsEs scheint, dass, egal was, der Start-Prozess entfernt alle doppelten Anführungszeichen in die argumentlist..
Funktioniert für mich! Ich verwende es für
netsh int set int %wifiname% Enable/Disable
.Ich hatte das gleiche problem wie Nicolas Mommaerts oben. Ich verstehe nicht, warum es funktioniert (die beste Art von fix), aber das folgende funktioniert wie es soll (Hinweis: alle extra-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""""'"
Ein weiteres problem (Unannehmlichkeit) ist, dass das Skript angehalten (wartet auf Benutzereingabe) wenn die server ist der Dienst nicht läuft (ich habe es deaktiviert aus Gründen). Ich usuallly test für admin perms, indem Sie versuchen, zu schreiben, um die HOSTS - Datei Lage, aber es ist vielleicht besser, ruft den powershell-Befehl -Verb runas anstatt auf aktiviert windows-Dienste oder der Versuch die Datei schreibt.
InformationsquelleAutor Ryan Bemrose
Für einige Programme, die die Einstellung der super-geheime
__COMPAT_LAYER
UmgebungsvariableRunAsInvoker
funktioniert.Überprüfen Sie dies :Aber wie diese wird es keine UAC-Aufforderungen für den Benutzer weiterhin ohne admin-Berechtigungen.
InformationsquelleAutor npocmaka
Klebte ich diese in den Anfang des Skripts:
cacls
ist veraltet in Windows 7 und neueren windows-Versionen.Ändern
calcs
zuicalcs
funktioniert gut.Fsutil dirty ist sogar noch besser
Wissen Sie, dass die Linie
pushd "%CD%"
speichert das aktuelle Verzeichnis und wechselt in das aktuelle Verzeichnis?InformationsquelleAutor TanisDLJ
Folgende Lösung ist sauber und funktioniert einwandfrei.
Download Elevate zip-Datei aus https://www.winability.com/download/Elevate.zip
Innerhalb von zip -, sollten Sie zwei Dateien finden: Elevate.exe und Elevate64.exe. (Letzteres ist eine native 64-bit-Zusammenstellung, wenn Sie verlangen, dass, obwohl die reguläre 32-bit-version, Elevate.exe sollte funktionieren mit der 32 - und 64-bit-Versionen von Windows)
Kopieren Sie die Datei Elevate.exe in einen Ordner, in dem Windows kann es immer wieder (wie C:/Windows). Oder Sie besser können Sie die Kopie im selben Ordner, in dem Sie planen, um Ihre bat-Datei.
Zur Verwendung in einer batch-Datei, Schreibe einfach den Befehl, den Sie ausführen möchten, als administrator mit dem elevate-Befehl, wie hier:
InformationsquelleAutor Vaibhav Jain