Проблемы с повышением разрешений при выполнении пакетного файла (CMD)

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

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

    :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

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

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

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

    :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
8
задан Community
14.04.2023 15:36 Количество просмотров материала 3402
Распечатать страницу

1 ответ

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

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

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

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

: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
0
отвечен STGdb 2023-04-15 23:24

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

batch-file
cmd.exe
elevation
privileges
script
Вверх