こんにちは!今回は今まで紹介してきたバッチファイルのテクニックを応用した形を紹介していきたいともいます。
「管理者権限」で自動実行するバッチファイルの作り方と、「再起動」を挟んでも処理を継続するバッチファイルの作成方法を以前に紹介させていただきました。
この2つを組み合わせると、「管理者権限が必要な再起動を含む」処理が実行できるようになります。
よくあるケースとしては、「コンピューター名」を変更したり、「OS更新プログラム」を適用したり、「セキュリティソフトのアップデート」等を行う場合、管理者権限と再起動を要求されることが多いですね。
こういった場合にも対応できるバッチファイルの例を紹介していきたいと思います。
やりたいこと
・実行時に必ず管理者で実行される。
・再起動を含む処理を行っていても、継続して処理をすすめることができる。
この2点が満たされるようにバッチを作っていきたいと思います。
また、「再起動する」=「ログインをしなくてはならない」ということでもあると思いますので、自動ログインも有効にしてみます。
スクリプト例
@echo off
cd /d %~dp0
rem --------------------------------------------------
rem 管理者権限チェックし自動で管理者実行
rem --------------------------------------------------
whoami /priv | find "SeDebugPrivilege" > nul
if %errorlevel% neq 0 (
@powershell start-process %~0 -verb runas
exit
)
rem ==================================================
rem 再起動判定
rem ==================================================
if "%1" neq "" goto :AfterReboot%1
rem ~~~~~~~~~~~~~~~~~~~~
rem 再起動前にやりたい処理
rem ~~~~~~~~~~~~~~~~~~~~
rem --------------------------------------------------
rem 現在ログインしているユーザーのパスワードを入力要求
rem --------------------------------------------------
:input
set "pscmd=powershell.exe -Command " ^
$inputPass = read-host 'ログインしているユーザーのパスワード=' -AsSecureString ; ^
$BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($inputPass); ^
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "tokens=*" %%a in ('%pscmd%') do set PASSWORD=%%a
set "pscmd=powershell.exe -Command " ^
$inputPass = read-host 'もう一度入力してください=' -AsSecureString ; ^
$BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($inputPass); ^
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "tokens=*" %%a in ('%pscmd%') do set PASSWORD_C=%%a
if %PASSWORD% neq %PASSWORD_C% (
echo 入力が間違っています
pause
cls
goto :input
)
echo 入力OK
rem --------------------------------------------------
rem 自動ログインを有効にする
rem --------------------------------------------------
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "AutoAdminLogon" /t REG_DWORD /d "1" /f >Nul
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultUserName" /t REG_SZ /d "%USERNAME%" /f >Nul
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultPassword" /t REG_SZ /d "%PASSWORD%" /f >Nul
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /v "Exec_AfterReboot" /t REG_SZ /d "%~0 1" /f >Nul
Shutdown /r /t 0
exit
rem ==================================================
rem 再起動後の処理
rem ==================================================
:AfterReboot1
rem ~~~~~~~~~~~~~~~~~~~~
rem 再起動後にやりたい処理
rem ~~~~~~~~~~~~~~~~~~~~
rem --------------------------------------------------
rem 自動ログイン削除
rem --------------------------------------------------
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "AutoAdminLogon" /t REG_DWORD /d "0" /f >Nul
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultUserName" /f >Nul
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultPassword" /f >Nul
exit
解説
自分自身を管理者実行する
whoami /priv | find "SeDebugPrivilege" > nul
if %errorlevel% neq 0 (
@powershell start-process %~0 -verb runas
exit
)
「Whoami /priv」を使用した管理者判定を使用しています。
一般と管理者の権限の違いを利用して、管理者判定を行っています。
管理者の時のみに発生する権限が見つからない場合、自分自身を管理者で起動しなおすという動作になります。詳しくは過去記事を参考にしてくださいね♪
再起動後に自分自身を自動実行させる
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /v "Exec_AfterReboot" /t REG_SZ /d "%~0 1" /f >Nul
再起動後にも処理を継続したい場合、起動直後に1度だけ処理を実行してくれる「RunOnce」キーを使うのが楽でしょう。そこにバッチ自身のパスである「%~0」を登録すれば、再起動後にバッチ自身を実行してくれます。
これだけでは、また最初からバッチが実行されてしまいます。
そのため引数にラベル番号を与えておき、処理をスキップさせるようにしています。
「%~0 1」であれば、AfterReboot1へジャンプ、「%~0 2」ならAfterReboot2といった具合です。
if "%1" neq "" goto :AfterReboot%1
~~~~~~~~~~~~~~~~~~~~
再起動前にやりたい処理
~~~~~~~~~~~~~~~~~~~~
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /v "Exec_AfterReboot" /t REG_SZ /d "%~0 1" /f >Nul
shutdown /r /t 0
exit
:AfterReboot1
~~~~~~~~~~~~~~~~~~~~
1回目の再起動でやりたい処理
~~~~~~~~~~~~~~~~~~~~
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /v "Exec_AfterReboot" /t REG_SZ /d "%~0 1" /f >Nul
shutdown /r /t 0
exit
~~~~~~~~~~~~~~~~~~~~
2回目の再起動でやりたい処理
~~~~~~~~~~~~~~~~~~~~
:AfterReboot2
exit
こちらも過去記事で詳しく解説していますので参考にしてください!
Windowsに自動ログインさせる
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "AutoAdminLogon" /t REG_DWORD /d "1" /f >Nul
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultUserName" /t REG_SZ /d "%USERNAME%" /f >Nul
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultPassword" /t REG_SZ /d "%PASSWORD%" /f >Nul
自動ログインはレジストリの設定によって実現できます。
この3点について設定してあげれば、自動ログインが有効になります。
「AutoAdminLogon」は機能の"有効:1"、"無効:0"をスイッチし、ログインの際に使用するユーザー名が「DefaultUserName」、パスワードは「DefaultPassword」の値が使われます。
パスワードを「*」にマスクする
:input
set "pscmd=powershell.exe -Command " ^
$inputPass = read-host 'ログインしているユーザーのパスワード=' -AsSecureString ; ^
$BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($inputPass); ^
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "tokens=*" %%a in ('%pscmd%') do set PASSWORD=%%a
最後に先日解説させていただいたパスワードマスクについてです。
これはバッチファイルの入力機能では実現できないので、PowerShellを呼び出して使用しています。
PowerShellでマスク状態の入力を受け取り、暗号化を解除してからバッチファイルへ値を引き渡すという処理をしています。
あとがき
今回は今まで紹介させたいただいたテクニックを組み合わせて、常に管理者実行される再起動を含んだ処理を行うバッチファイルの作成方法を紹介させていただきました。
総集編のような形になってしまいましたが、各要点ごとに解説記事がありますので、興味のある方はご覧になっていただけるとありがたいです。
この形のバッチファイルは、ほとんどの処理がバッチファイルだけで完結できます。
更新プログラムやセキュリティソフトのインストールなど、管理者権限が必要で再起動も必要・・・そんなケースは山ほどあります。
そんな時にこの方法を実践していただけるとうれしいです。
何かのお役に立てれば幸いです。
コメント