Probleme beim Erhöhen von Berechtigungen beim Ausführen einer Batchdatei (CMD-Datei)

1337
STGdb

Ich habe eine Batch-Datei (CMD-Datei) zusammengestellt, mit der wir verschiedene Dinge auf ausgewählten Servern überprüfen. Was hier veröffentlicht wird, ist fast alles (minus sensible Informationen). Wenn die Batchdatei mit der richtigen Befehlszeile gestartet wird, prüft sie den Tag und die Uhrzeit, zu der sie gestartet wird. Auf diese Weise können wir es in den STARTUP-Ordner auf unseren Servern legen. Wenn wir uns anmelden, wird es ausgeführt. Wenn sich der Benutzer an einem Werktag zwischen 06:45 Uhr und 07:30 Uhr anmeldet, werden bestimmte Prüfungen durchgeführt (dh extern) Apps werden gestartet usw.). Wahlweise wird die richtige App basierend auf Umgebungsvariablen wie COMPUTERNAME, USERNAME (die im nachstehenden Code entfernt wurde) usw. ausgeführt.

Einer der Prozesse, die wir ausführen müssen, erfordert eine Erhöhung der Rechte (IISRESET). Um dies innerhalb einer Batch-Datei zu erreichen, habe ich das von Matt (danke) gezeigte Beispiel unter https://stackoverflow.com/questions/7044985/how-can-i-auto-elevate-my-batch-file-so verwendet -die-es-Anfragen-von-Uac-Admin-Rechte . Ich wollte nicht in diesem Thread posten, da dies ein neues Thema ist. In der unten angegebenen Batch-Datei funktioniert sie ordnungsgemäß (jedoch keine impliziten Garantien). Aber wenn ich die "Kommentar" -Zeichen (die Doppelpunkte) durch Ändern entferne:

 :BEGIN If %COMPUTERNAME%==SERVER1 explorer.exe "c:\queue" :: If %COMPUTERNAME%==SERVER1 Goto CHECKPRIVILEGES  If %COMPUTERNAME%==SERVER2 explorer.exe "c:\queue" :: If %COMPUTERNAME%==SERVER2 Goto CHECKPRIVILEGES  :COMMON 

...(in)...

 :BEGIN If %COMPUTERNAME%==SERVER1 explorer.exe "c:\queue" If %COMPUTERNAME%==SERVER1 Goto CHECKPRIVILEGES  If %COMPUTERNAME%==SERVER2 explorer.exe "c:\queue" If %COMPUTERNAME%==SERVER2 Goto CHECKPRIVILEGES  :COMMON 

… Dann läuft die Batchdatei nicht richtig. Wenn ich die Kommentare aus den beiden Zeilen entferne, wertet die Batchdatei Variablen nicht mehr richtig aus (ob manuell oder als Teil des STARTUP-Prozesses ausgeführt). Obwohl in der Batchdatei Folgendes angegeben ist:

 If %COMPUTERNAME%==SERVER1 If %COMPUTERNAME%==SERVER2 

… Der Befehl, der zu SERVER1 gehört, wird ordnungsgemäß ausgeführt, aber SERVER2 führt die Befehle aus, die sowohl zu SERVER1 als auch zu SERVER2 gehören. Dann wird die Batchdatei angehalten und führt niemals einen der Befehle im Abschnitt COMMON aus:

 :COMMON explorer.exe /e, Start services.msc 

…usw…

Ich habe eine Reihe von Szenarien getestet und weiß, dass ich vor meinem Gesicht etwas einfaches übersieht. Kann jemand sehen, was mit der Batch-Datei unten nicht stimmt?

Vielen Dank

-------------------------------------------------- -----------

Komplette Batchdatei:

 @Echo Off  :: ***** If not started using "-Login" with the cmd line then we won't even check the day or time ***** :: ***** We won't even consider what day or time it is if we run this CMD file manually ***** Set LaunchString=%1% If [%LaunchString%] equ [] Goto BEGIN Rem ***** No parameters given ***** Call :UPCASE LaunchString If not %LaunchString% equ -LOGIN Goto BEGIN  :: ***** See if we're running on a normal business weekday ***** :: ***** That way we can put this in server startup to run automatically at login during certain times ***** For /F "tokens=1 delims= " %%A IN ('Date /t') DO @(Set DayName=%%A) If %DayName:~0,3% equ Mon Goto CONTINUE If %DayName:~0,3% equ Tue Goto CONTINUE If %DayName:~0,3% equ Wed Goto CONTINUE If %DayName:~0,3% equ Thu Goto CONTINUE If %DayName:~0,3% equ Fri Goto CONTINUE Goto FINISH Rem ***** Not a business day so exit *****  :CONTINUE :: Check if the time is between 06:45 and 07:30 and if not then exit otherwise continue processing Setlocal enableextensions enabledelayedexpansion Set tm=%time% Set hh=!tm:~0,2! Set mm=!tm:~3,2! If !hh! equ 6 ( :: Hour is 6 (i.e., 06:xx AM) If not !mm! gtr 44 ( :: - Since hour is 6, are minutes greater than 44 (i.e., after 06:45)? Goto FINISH ) ) else If !hh! equ 7 ( :: Hour is 7 (i.e., 07:xx AM) If not !mm! lss 30 ( :: - Since hour is 7, are minutes less than 31 (i.e., before 07:30)? Goto FINISH ) ) else Goto FINISH Endlocal  :: If manually launched without command line argument then we start here (no day or time check) :BEGIN If %COMPUTERNAME%==SERVER1 explorer.exe "c:\queue" :: If %COMPUTERNAME%==SERVER1 Goto CHECKPRIVILEGES  If %COMPUTERNAME%==SERVER2 explorer.exe "c:\queue" :: If %COMPUTERNAME%==SERVER2 Goto CHECKPRIVILEGES  :COMMON explorer.exe /e, Start services.msc  :: ***** Check if test file exists ***** If Exist "c:\test.log" Start c:\programA.exe If Exist "d:\test.log" Start c:\programB.exe  :FINISH Exit /B Goto:EOF  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  :: Subroutine - Convert a variable VALUE to all UPPER CASE. :UPCASE For %%i IN ("a=A" "b=B" "c=C" "d=D" "e=E" "f=F" "g=G" "h=H" "i=I" "j=J" "k=K" "l=L" "m=M" "n=N" "o=O" "p=P" "q=Q" "r=R" "s=S" "t=T" "u=U" "v=V" "w=W" "x=X" "y=Y" "z=Z") DO Call Set "%1=%%%1:%%~i%%" Goto :EOF  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  :: Subroutine - Elevate permissions to run IISRESET :CHECKPRIVILEGES Net FILE 1>NUL 2>NUL If '%errorlevel%' == '0' ( Goto gotPrivileges ) else ( Goto getPrivileges )  :GETPRIVILEGES If '%1'=='ELEV' (shift & goto gotPrivileges) Setlocal DisableDelayedExpansion Set "batchPath=%~0" Setlocal EnableDelayedExpansion ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs" ECHO UAC.ShellExecute "!batchPath!", "ELEV", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs" "%temp%\OEgetPrivileges.vbs" :: Del "%temp%\OEgetPrivileges.vbs" Exit /B  :GOTPRIVILEGES Setlocal & pushd . CMD /k iisreset Goto :EOF 
1
Ich konnte dies nicht bei SO posten (es sagte mir immer wieder, dass mein Beitrag nicht richtig formatiert wurde), also musste ich ihn hier posten ... STGdb vor 10 Jahren 0
Es ist klar durch den Fehler, dass das Problem in CHECKPRIVILEGE liegt und erraten wird, dass die Datei OEgetPrivileges.vbs fehlschlägt. Ich würde durch Versuch und Irrtum herausfinden, in welcher Zeile die Erhöhung der Berechtigungen fehlschlägt. Die Arbeitsleitungen nennen es nicht. Ramhound vor 10 Jahren 0
Versuchen Sie, alle Etiketten im selben Fall zu schreiben. Nach Ihrem ersten beschriebenen Problem erscheint dies zunächst merkwürdig. `Wenn '% errorlevel%' == '0' (Goto gotPrivileges) sonst (Goto getPrivileges)` Ich bin mir nicht sicher, ob CMD Caps unterscheiden oder ignorieren kann. Doktoro Reichard vor 10 Jahren 0
@STGdb - Wir haben die gleichen Regeln. Sie müssen also einige Formatierungen übersehen haben. Es ist wahrscheinlich, dass es verschoben wird, da dies nicht wirklich ein Thema ist Ramhound vor 10 Jahren 0
Ich übersehe wahrscheinlich etwas, aber - Sie haben `Goto CHECKPRIVILEGES ', aber GETPRIVILEGES endet mit' Exit / B 'und GOTPRIVILEGES endet mit' Goto: EOF '. Wollen Sie nicht CHECKPRIVILEGES "ANRUFEN"? Scott vor 10 Jahren 0

1 Antwort auf die Frage

0
STGdb

Vielen Dank für Ihre Anregungen und Ratschläge. Ja, ich befolge normalerweise die Standards in meinem Code (entweder immer mit Kleinbuchstaben oder immer mit Großbuchstaben für Etiketten). Danke, dass du das genommen hast.

Also habe ich herausgefunden, was mein Problem war. Erstens, was in meiner Batch-Datei passiert, ist, dass geprüft wird, ob eine Erhöhung erforderlich ist, und wenn dies der Fall ist, wird ein Skript ausgeführt, um erhöhten Zugriff zu erhalten. Ich war so sehr auf den Elevation-Teil konzentriert, dass ich nicht einmal an den Rest der Batchdatei dachte (und wie sie über eine Befehlszeilenvariable ausgewertet wird). Da es mithilfe von Befehlszeilenvariablen ausgewertet wird, schlägt der Rest der Batchdatei-Ausführung fehl. Also nahm ich den Teil, der die Privilegien erhöht, und schrieb ihn um. Ich habe den aktualisierten Code unten veröffentlicht, damit jeder, der ihn benötigt, ihn auch verwenden kann. Der folgende Code erhöht sich (falls erforderlich) und führt IISRESET höher aus. Einfach nach Bedarf hinzufügen / aktualisieren.

Das "Nicht-Zurückkehren" zu dem Etikettenabschnitt, von dem ich in meinem ursprünglichen Beitrag sprach, war, weil ich Goto und nicht Call verwendet habe. Ich denke, ich habe zu lange in den Bildschirm gestartet ...

Danke nochmal!!

:CHECKPRIVILEGES Setlocal Set PrivLaunchCmd=%temp%\Cmd2Run.CMD ECHO "%SystemRoot%\System32\iisreset.exe" > "%PrivLaunchCmd%" Net FILE 1>NUL 2>NUL If '%errorlevel%' == '0' Goto GOTPRIVILEGES  :GETPRIVILEGES ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs" ECHO UAC.ShellExecute "%PrivLaunchCmd%", "ELEV", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs" Call "%temp%\OEgetPrivileges.vbs" Del "%temp%\OEgetPrivileges.vbs" Del "%PrivLaunchCmd%" Endlocal Goto :EOF  :GOTPRIVILEGES Call "%PrivLaunchCmd%" Del "%PrivLaunchCmd%" Endlocal Goto :EOF