バッチ(CMD)ファイルの実行中に権限を昇格する際の問題


1

選択したサーバーでさまざまなことを確認するために使用するバッチ(CMD)ファイルをまとめました。以下に掲載されているのはほとんどすべてです(機密情報を除く)。適切なコマンドラインで起動された場合、バッチファイルは起動された日時の確認に進みます。この方法で私たちはそれを私たちのサーバーのSTARTUPフォルダに入れることができ、ログインするとそれが実行され、ユーザーが午前6時45分から午前7時30分までの営業日にログインすれば、特定のチェックが行われます。アプリが起動されるなど)。選択的に、適切なアプリはCOMPUTERNAME、USERNAME(以下のコードでは削除されています)などのような環境変数に基づいて実行されます。

実行する必要があるプロセスの1つに、権限の昇格が必要です(IISRESET)。これをバッチファイル内で実行するために、Mattが示した例(ありがとう)を使用しました。 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

…その場合、バッチファイルは正しく実行されません。 2行からコメントを削除すると、バッチファイルは変数を正しく評価しなくなりました(手動で実行した場合でも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

私はSOにこれを投稿することができませんでした(それは私の投稿が正しくフォーマットされていなかったことを私に伝え続けました)、それで私はそれをここに投稿しなければなりません...
STGdb

問題がCHECKPRIVILEGEにあることの失敗によるその明らかな、そのOEgetPrivileges.vbsが失敗したことを推測しようとしている。試行錯誤により、どの行でアクセス許可の昇格が失敗するのかを判断します。現用回線はそれを呼び出しません。
Ramhound

すべてのラベルを同じ場合に書くようにしてください。最初に説明した問題に続いて、これは最初は奇妙に思えます。 If '%errorlevel%' == '0' ( Goto gotPrivileges ) else ( Goto getPrivileges ) CMDがキャップを差別化したり無視したりできるかどうかはわかりません。
Doktoro Reichard

@STGdb - 同じ規則があります。だからあなたはいくつかのフォーマットを逃したにちがいない。これは実際にはトピックではないので、移動する可能性が高いです
Ramhound

私はおそらく何かを見逃しているのですが - あなたは Goto CHECKPRIVILEGESしかし、GETPRIVILEGESは以下で終わります。 Exit /B そしてGOTPRIVILEGESはで終わる Goto :EOF。なりたくない CALL チェックプリビューをしていますか?
Scott

回答:


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.