1

Я собрал пакетный файл (CMD), который мы используем для проверки различных вещей на некоторых серверах. То, что публикуется ниже, это почти все (за исключением конфиденциальной информации). Если пакет запущен с правильной командной строкой, пакетный файл продолжит проверять день и время его запуска. Таким образом, мы можем поместить его в папку STARTUP на наших серверах, и при входе в систему он запускается, и если пользователь входит в систему в рабочий день с 06:45 до 07:30, выполняются определенные проверки (т. Е. Внешние приложения запускаются и т. д.). Выборочно, правильное приложение запускается на основе переменных среды, таких как COMPUTERNAME, USERNAME (которые были удалены в приведенном ниже коде) и т.д.

Один из процессов, который нам нужно запустить, требует повышения прав (IISRESET). Чтобы сделать это в пакетном файле, я использовал пример, показанный Мэттом (спасибо), который можно найти на https://stackoverflow.com/questions/7044985/how-can-i-auto-elevate-my-batch-file-so. -это-запросы-от-uac-admin-права. Я не хотел публиковать в этой теме, потому что это новая тема. В пакетном файле, который я предоставил ниже, он работает должным образом (как бы то ни было, никаких гарантий или гарантий не подразумевается). Но если я уберу символы «комментарий» (двойные двоеточия), изменив:

    :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

...(в)...

    :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

... тогда пакетный файл не работает должным образом. Когда я удаляю комментарии из двух строк, пакетный файл перестает правильно оценивать переменные (запускаются ли они вручную или как часть процесса STARTUP). Хотя командный файл заявляет:

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

… Команда, связанная с SERVER1, выполняется правильно, но SERVER2 выполняет команды, связанные как с SERVER1, так и с SERVER2. Затем пакетный файл останавливается и никогда не выполняет ни одной из команд в разделе COMMON:

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

…так далее…

Я протестировал несколько сценариев, и я знаю, что я пропускаю что-то простое прямо перед моим лицом. Кто-нибудь может увидеть, что не так с командным файлом ниже?

Спасибо

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

Полный пакетный файл:

    @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 ответ1

0

Спасибо всем большое за ваш вклад и советы. Да, я обычно следую стандартам в любом из моих кодов (либо всегда использую все строчные буквы, либо всегда все верхние регистры для меток). Спасибо, что схватил это.

Итак, я понял, в чём была моя проблема. Во-первых, что происходит в моем пакетном файле, так это то, что он проверяет, требуется ли повышение прав, и, если это так, запускает скрипт для получения повышенного доступа. Я был так сосредоточен на части возвышения, что даже не думал об остальной части командного файла (и как он оценивается через переменную командной строки). Поскольку он оценивает использование переменных командной строки, это приводило к сбою выполнения остальной части пакетного файла. Поэтому я взял часть, которая повышает привилегии, и переписал ее. Я разместил обновленный код ниже, так что любой, кто может нуждаться в нем, может также использовать его. Код ниже повышает (если необходимо) и запускает IISRESET с повышенными правами. Просто добавили / обновите по мере необходимости.

"Не возвращаться" к той части меток, о которой я говорил в моем первоначальном посте, потому что я использовал Goto, а не Call. Думаю, я слишком долго начинаю смотреть на экран ...

Еще раз спасибо !!

: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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .