Skip to content

Instantly share code, notes, and snippets.

@ytez
Last active May 24, 2022 09:04
Show Gist options
  • Save ytez/bf437a2a6589b68db5b735fe02c98b1d to your computer and use it in GitHub Desktop.
Save ytez/bf437a2a6589b68db5b735fe02c98b1d to your computer and use it in GitHub Desktop.
ネットワークドライブ上からの BAT 実行を禁止したい [Win10]

ネットワークドライブ上からの BAT 実行を禁止したい [Win10]

is_local_or_nw_drive.bat は UNC パスには chdir できないことを利用して %CD% (カレントディレクトリ) と %~dp0 (BATが置かれているディレクトリ) が異なる場合に ネットワークドライブと判定することを意図したもの.

結論として、この方法は種々の問題があるため他の方法を使うべき.

実行例

  • ネットワークドライブ上 (UNCパス) で is_local_or_nw_drive.bat を実行

    # PowerShell なら UNC パスに chdir できるのでここから bat を実行してみる
    PS Microsoft.PowerShell.Core\FileSystem::\\VM-WIN10-01\share\GD> .\is_local_or_nw_drive.bat
    '\\VM-WIN10-01\share\GD'
    CMD.EXE was started with the above path as the current directory.
    UNC paths are not supported.  Defaulting to Windows directory.
    '\\VM-WIN10-01\share\GD\'
    CMD does not support UNC paths as current directories.
    %CD%  == "C:\Windows"
    %~dp0 == "\\VM-WIN10-01\share\GD\"
    ローカルドライブ上で実行してください (デスクトップ等)
    Press any key to continue . . .

問題1: ネットワークドライブにマップすれば実行できてしまう

ネットワークドライブにマップしてドライブレターが割り当てられれば chdir 可能なので "%CD%\" == "%~dp0" とならない.

  • mapped drive 上で is_local_or_nw_drive.bat を実行

    X:\GD>net use
    New connections will be remembered.
    
    
    Status       Local     Remote                    Network
    
    -------------------------------------------------------------------------------
    OK           X:        \\VM-WIN10-01\share       Microsoft Windows Network
    The command completed successfully.
    
    
    X:\GD>.\is_local_or_nw_drive.bat
    %CD%  == "X:\GD"
    %~dp0 == "X:\GD\"
    Press any key to continue . . .
    
    X:\GD>

問題2: ドライブ直下で実行するとネットワークドライブ判定されてしまう

ドライブレター + 中間ディレクトリパス の場合 %CD% は末尾に \ が無く %~dp0 は末尾に \ があるので, それを想定して条件式を "%CD%\" == "%~dp0" としている (%CD% の末尾に \ を付与している).

ドライブ直下の場合 %CD% の末尾も \ で終わるのでこの条件式だと成立しない.

bat の文字列置換には疎いのだが、なんとかして「末尾に \ がある場合削除」ができれば解決できるかもしれない.

  • Pドライブ直下で is_local_or_nw_drive.bat を実行

    P:\>.\is_local_or_nw_drive.bat
    %CD%  == "P:\"
    %~dp0 == "P:\"
    ローカルドライブ上で実行してください (デスクトップ等)
    Press any key to continue . . .

Want To Do

  • PathIsUNCA function (shlwapi.h)
  • PowerShell でできないか
  • WShell でできないか
@echo off
chcp 65001>NUL
chdir /D %~dp0
echo %%CD%% == "%CD%"
echo %%~dp0 == "%~dp0"
if not "%CD%\" == "%~dp0" (
echo ローカルドライブ上で実行してください ^(デスクトップ等^)
pause
exit /b 1
)
pause
exit /b 0
@ytez
Copy link
Author

ytez commented May 24, 2022

chcp 65001>NUL

コードポイント変更時の Active code page: 65001 というメッセージを表示にするためのもの

@ytez
Copy link
Author

ytez commented May 24, 2022

PowerShell から .NET Framework の System.IO.DriveInfo を使うのはどうか

PS C:\> (New-Object System.IO.DriveInfo "X:").DriveType
Network

PS C:\> (New-Object System.IO.DriveInfo "P:").DriveType
Fixed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment