Ich versuche, eine Batchdatei zu schreiben, die meine Benutzer von ihren Vista-Computern mit UAC ausführen können. Die Datei schreibt ihre Hosts-Datei neu, daher muss sie mit Administratorrechten ausgeführt werden. Ich muss in der Lage sein, ihnen eine E-Mail mit einem Link zur .bat-Datei zu senden. Das gewünschte Verhalten ist, dass sie, wenn sie mit der rechten Maustaste auf die Datei klicken und Öffnen sagen, eines dieser UAC-Dialogfelder erhalten, das den Bildschirm dunkel macht und sie zwingt zu antworten, ob sie der Anwendung die Berechtigung zum Ausführen als Administrator erteilen möchten. Stattdessen wird im Befehlszeilenfenster nur "Zugriff verweigert" angezeigt.
Ist das anders möglich?
Antworten:
Dieses Skript macht den Trick! Fügen Sie es einfach oben in Ihre Fledermausdatei ein. Wenn Sie die Ausgabe Ihres Skripts überprüfen möchten, fügen Sie am Ende Ihrer Batchdatei einen Befehl "Pause" hinzu.
UPDATE: Dieses Skript wurde jetzt leicht bearbeitet, um Befehlszeilenargumente und ein 64-Bit-Betriebssystem zu unterstützen.
Vielen Dank, dass Sie Eneerge @ https://sites.google.com/site/eneerge/scripts/batchgotadmin
quelle
Hier ist ein Einzeiler, den ich verwendet habe:
Anmerkungen:
quelle
am_admin
if not "%1"=="am_admin" (powershell start -verb runas '%0' 'am_admin "%~1" "%~2"' & exit)
Die Parameter befinden sich über dem Ort, an dem sie sich befanden'am_admin %*'
um alles zu übergeben, spielt nicht gut mit Anführungszeichen und Leerzeichen tho: / Sie könnenshift
im Stapel verwenden, um das erste Argument zu entfernen, wodurch alle Argumente außer behoben werden%0
.cd /D %~dp0
nachif not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit /b)
Hier ist mein Code! Es sieht groß aus, aber es sind meistens Kommentarzeilen (die Zeilen beginnen mit: :).
Eigenschaften:
Überprüfung des zugeordneten Ordners (Warnt Sie, wenn der Administrator nicht auf das zugeordnete Laufwerk zugreifen kann)
Kann als externe Bibliothek verwendet werden (siehe meinen Beitrag zu diesem Thema: https://stackoverflow.com/a/30417025/4932683 )
Hängen Sie dies einfach an das Ende Ihrer Batch-Datei an oder speichern Sie es als Bibliothek (siehe oben).
Beispiel zur Verwendung
quelle
&fc;: 2>nul
In hatset "_FN=_%~ns1" & echo/%TEMP%| findstr /C:"(" >nul && (echo/ERROR: %%TEMP%% path can not contain parenthesis &pause &endlocal &fc;: 2>nul & goto:eof)
den Fehlerlevel auf 1 gesetzt. Ich habe das Bit entfernt und es hat perfekt funktioniert. Ich verwende Windows 10 Home.fc;:
da es geht: eof gleich danach? Ich bin mir nicht sicher, warum dieses kleine Problem das Problem verursacht hat, da es ausgeführt werden sollte.echo/%TEMP%| findstr /C:"(" >nul
Tests, ob es ein(
Zeichen in Ihrer%temp%
Umgebungsvariablen gibt, und sollten den Teil erst nach dem&&
Wenn positiv ausführen . Es ist seltsam, warum Ihr(
Test positiv ausfällt.Ein anderer Ansatz ist zu
und dann
Denis
[Nachträglich hinzugefügt - Ja, ich habe das Datum dieses Threads nicht bemerkt.]
quelle
Die Lösung von Ben Gripka verursacht Endlosschleifen. Sein Batch funktioniert folgendermaßen (Pseudocode):
Wie Sie sehen können, führt dies zu einer Endlosschleife, wenn der VBS keine Administratorrechte anfordert.
Die Endlosschleife kann jedoch auftreten, obwohl Administratorrechte erfolgreich angefordert wurden.
Die Überprüfung in der Batch-Datei von Ben Gripka ist nur fehleranfällig. Ich habe mit dem Stapel herumgespielt und festgestellt, dass Administratorrechte verfügbar sind, obwohl die Prüfung fehlgeschlagen ist. Interessanterweise funktionierte die Überprüfung wie erwartet, wenn ich die Batchdatei über den Windows Explorer startete, aber nicht, als ich sie über meine IDE startete.
Daher schlage ich vor, zwei separate Batch-Dateien zu verwenden. Der erste generiert den VBS, der die zweite Batchdatei aufruft:
Die zweite mit dem Namen "my_commands.bat" befindet sich im selben Verzeichnis wie die erste und enthält Ihre eigentlichen Befehle:
Dies verursacht keine Endlosschleifen und entfernt auch die fehleranfällige Administratorberechtigungsprüfung.
quelle
Eine weitere PowerShell-Lösung ...
Hier geht es nicht darum, ein Batch-Skript als Administrator auszuführen, sondern darum, wie ein anderes Programm aus dem Batch ...
Ich habe eine Batch-Datei "Wrapper" für eine Exe. Sie haben den gleichen "Root-Dateinamen", aber alternative Erweiterungen. Ich kann die Exe als Administrator starten und das Arbeitsverzeichnis mit dem folgenden einzeiligen Powershell-Aufruf auf das Verzeichnis einstellen, das das Skript enthält:
Mehr Info
Es gibt eine ganze Reihe zusätzlicher
Start-Process
Optionen, die Sie anwenden können! Überprüfen Sie: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6Beachten Sie, dass ich das
@
Präfix verwende. Das entspricht@echo off
der einen Zeile. Ich benutze%~n0
hier, um den ".exe
Stammnamen " des Batch-Skripts zu erhalten, dann verkette ich den , um darauf die benachbarte Binärdatei zu verweisen. Die Verwendung von%~dp0
stellt den vollständigen Pfad zu dem Verzeichnis bereit, in dem sich der Stapel befindet. Und natürlich, das-Verb RunAs
bietet Parameter die Höhe .quelle
Ich weiß, dass dies keine Lösung für OP ist, aber da ich sicher bin, dass es hier viele andere Anwendungsfälle gibt, dachte ich, ich würde sie teilen.
Ich hatte Probleme mit allen Codebeispielen in diesen Antworten, fand dann aber: http://www.robotronic.de/runasspcEn.html
Sie können nicht nur als Administrator ausgeführt werden, sondern auch die Datei überprüfen, um sicherzustellen, dass sie nicht manipuliert wurde, und die erforderlichen Informationen sicher speichern. Ich gebe zu, es ist nicht das naheliegendste Werkzeug, um herauszufinden, wie man es benutzt, aber für diejenigen von uns, die Code schreiben, sollte es einfach genug sein.
quelle
@echo off
undtitle
kann vor diesem Code kommen:Viele der anderen Antworten sind übertrieben, wenn Sie sich nicht um Folgendes kümmern müssen:
cd %~dp0
wechselt in das Verzeichnis mit der Batchdatei)quelle
Da ich Probleme mit diesem Skript habe, eine neue Eingabeaufforderung aufzurufen, die in einer Endlosschleife (mit Win 7 Pro) erneut ausgeführt wird, empfehle ich Ihnen, einen anderen Ansatz zu versuchen: Wie kann ich meine Batch-Datei automatisch erhöhen, damit sie von angefordert wird? UAC-Administratorrechte bei Bedarf?
Seien Sie vorsichtig, Sie müssen dies am Ende des Skripts hinzufügen, wie in einer Bearbeitung angegeben, damit Sie nach dem Erhöhen der Berechtigungen wieder im Skriptverzeichnis sind: cd / d% ~ dp0
quelle
Basierend auf dem Beitrag von toster-cx und anderen interessanten Beiträgen auf dieser Seite erhielt ich einen Einblick in die Konfiguration und Lösung meines Problems. Ich hatte ein ähnliches Problem, bei dem ich mir wünschte, dass das Dienstprogramm zur Datenträgerbereinigung jede Woche zweimal am Montag und Donnerstag während der Mittagspause (z. B. 14 Uhr) ausgeführt wird. Dies erforderte jedoch erhöhte Rechte.
Batch-Datei teilen, die anderen Anfängern wie mir helfen könnte -
Vielen Dank für dieses Forum und Rems POST hier [ https://www.petri.com/forums/forum/windows-scripting/general-scripting/32313-schtasks-exe-need-to-pass-parameters-to-script ] [1]
Sein Beitrag half beim Konfigurieren optionaler Argumente beim Planen der Aufgabe.
quelle
Es gibt auch die FSUTIL-Abfrage aus diesem Beitrag, die ebenfalls auf ss64.com verlinkt ist und den folgenden Code enthält:
Solange FSUTIL verfügbar ist, ist es eine zuverlässige Alternative.
quelle
Das obige funktioniert auf meinem Windows 10 Version 1903
quelle
Sie können keine Administratorrechte aus einer Batchdatei anfordern, aber Sie können ein Windows-Skript-Hostskript in% temp% schreiben und ausführen (und das wiederum Ihren Batch als Administrator ausführen). Sie möchten die ShellExecute-Methode in der Shell aufrufen. Anwendungsobjekt mit "Runas" als Verb
quelle
Verwenden Sie
mshta
diese Option, um nach Administratorrechten zu fragen:Oder mit Powershell:
quelle
Verwenden Sie den Befehl runas. Ich glaube jedoch nicht, dass Sie eine .bat-Datei einfach per E-Mail versenden können.
quelle
runas
Befehl kann nicht verwendet werden, um eine Höhe zu provozieren.