ログイン不調になったPCを操作するためにPSExecを使用しましたが、いままで使ってきたPSExecの使い方を複合的に使う必要があったので、その実施したことをご報告です。
PSExecでネットワーク経由でコマンドプロンプトの操作
以前にPSExecを使って、ネットワーク経由で別のPCのコマンドプロンプト操作をCUIベースで実行できることをご紹介しました。
この使い方が一般的だと思います。でも今回のPCはちょっと事情が異なっていました。
ログインが不調でPSExecを使う場合
今回はPCのトラブルシューティングの一環でPSExecを使用しました。簡単に言えば、ログイン処理が上手く動作しなくなったWindowsを対処するために、bcdeditコマンドを実行し、F8復活のコマンドを実行したい、という状況になりました。(普通にGUIでログインが完了できない状況なのでコマンドプロンプトで操作しようと考えたのです。)
※ちなみに今回接続先となった環境はWindows10 LTSB 2016/Windows Server 2016世代の環境なので、Windows11世代のPCには通用しないかも。
そこでPSExecを使ってネットワーク経由でアクセスをする、という使い方をしようと考えましたが、従来までのやり方ではbcdeditコマンドを実行するところまで漕ぎ着けなかったという状況です。
実行したいコマンドはセーフモードを強制する
bcdedit /set {current} safeboot minimal
が候補でした。
しかし、これがエラーになってしまいます。
PSExec経由で起動したコマンドプロンプトからbcdeditコマンドを実行したところ、以下のようになりました。
--------------------------------------------------------------
C:\Windows\system32>bcdedit /set {current} safeboot minimal
ブート構成のデータ ストアを開けませんでした。
アクセスが拒否されました。
--------------------------------------------------------------
ローカルの管理者権限を有する(Administratorsグループの)ユーザアカウントでPSexec.exeのサインインは実行したのですが、「アクセスが拒否されました。」とエラー表示されているということは権限が足りない可能性があると予想されました。
SYSTEM権限が必要?
より強い権限でのコマンド実行はより深い注意で利用する必要があります。今回は実行したいbcdeditコマンドに(実行しても)問題がないことはテスト環境で確認済みでしたので、SYSTEM権限を使ってネットワーク経由でPSExecを実行し、強い権限でbcdeditコマンドを実行してみます。
以前にローカル環境ではPSExecでSYSTEM権限を利用する方法を検証していました。
※くれぐれも取り扱いには十分にご注意ください。
whoamiコマンドを実行した時に、「nt authority\system」が表示されればPSExecでSYSTEM権限が行使できる状態になっています。
コマンドライン
いままでのPSExecのコマンド実行は以下のようになっていました。
PsExec.exe -u %targetPCNAME%\%USERNAME% -p %USERPASSWD% \\%targetPCNAME% cmd
前回記事<システム権限でコマンドプロンプト起動 - treedown’s Report>で、「PsExec.exe -i -s cmd」と「-i」&「-s」付与でSYSTEM権限になることは確認していました。
なので最初は「-i」&「-s」付与でコマンドを実行していたのですが、いざPSExecを実行してみると、メッセージ表示が、
PsExec v1.98 - Execute processes remotely Copyright (C) 2001-2010 Mark Russinovich Sysinternals - www.sysinternals.com
と、ここから進まなくなってしまいました。対象のPCがセーフモードでの起動が必要な状況だったためか、-iオプションを付けると上手く動作しませんでした。
そこで-iを外したら、プロンプトが返ってきました。最終的なコマンドラインは以下のようになります。
PsExec.exe -u %targetPCNAME%\%USERNAME% -p %USERPASSWD% -s \\%targetPCNAME% cmd
これで接続できたので、

この画面になりました、さっそくログインユーザを確認してみたところ、

「nt authority\system」となっていたので、SYSTEM権限でPSExecを実行できていることがわかります。ネットワーク経由で別のPCからSYSTEM権限を行使できるという、考えようによってはなかなか危ない使い方となっております。
以前のバッチファイルを編集
以前のバッチファイル<リモート接続操作最後の切り札=PSExec - treedown’s Report>をSYSTEM権限対応に編集してみました。-sを付与しただけですが、トラブルシューティング時には権限が要求される操作(例えばサービス制御であるnet startやnet stopとか)をしなければいけないということもあるので、その際にはこちらのバッチファイルを使うことになります。
::**********************************************************
:: バッチファイル
::**********************************************************
@echo off
:UserConfigure
rem
rem ExecDir変数にPSExec.exeが保管されているパスを入力してください。
rem
set ExecDir=%userprofile%\UserPrograms\PSTools
set targetPCNAME=
set targetPCDomain=
set USERNAME=
set USERPASSWD=
rem echo PC名は名前解決可能なNBT名(COMPUTERNAME)である必要があります。
set /p targetPCNAME="操作したいPC名かIPを入力してください >"
echo 操作対象PCが所属するドメイン名を入力してください
set /p targetPCDomain="ワークグループ環境ではこの欄は空欄にしてください >"
echo .
echo %targetPCNAME%.%targetPCDomain%にアクセスします。
echo .
set /p USERNAME="login as:"
set /p USERPASSWD="%USERNAME%@%targetPCNAME%or%targetPCDomain%'s password:"
CLS
:psexec
rem echo "%ExecDir%"に移動する
pushd "%ExecDir%"
IF "%targetPCDomain%" EQU "" (
rem 非ドメイン(ワークグループ)環境でのRPC接続(端末認証)
PsExec.exe -u %targetPCNAME%\%USERNAME% -p %USERPASSWD% -s \\%targetPCNAME% cmd
) else (
rem ドメインネットワーク環境でのRPC接続(ドメイン認証)
PsExec.exe -u %targetPCDomain%\%USERNAME% -p %USERPASSWD% -s \\%targetPCNAME% cmd
)
:endMsg
echo ログアウトし切断します。
:end
popd
set ExecDir=
set targetPCNAME=
set targetPCDomain=
set USERNAME=
set USERPASSWD=
::**********************************************************