読者です 読者をやめる 読者になる 読者になる

treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

リモート接続操作最後の切り札=PSExec

運用管理 バッチ・スクリプト トラブルシューティング

リモート接続はとても便利です。お使いの方は日常的にいろいろなツールプロトコルをお使いのことと思います。
RDP(リモートデスクトップ)、SSHVNC、X-Window、最近ではPowershellなども使いますね。

これらのリモート接続では事前にリモート接続するための準備が必ず必要です。
Windows限定の話になりますが、遠隔地からリモート接続が出来ないときにリモート接続をリモート接続で修正する、というのも変な話ですが実際にやらざるを得ない状況もあります。
また、Windowsのスタートやシャットダウン中で問題が発生した場合、ハードウェアの力に頼らなければ通常はリモート操作をすることは不可能です。(リモート操作は通常はWindowsのサービスかログオンユーザプロセスとして動作するためです。)

しかし、コマンドプロンプトであれば接続できることがあります。
それがPsToolsに含まれるPsExecというコマンドラインツールキットです。これが最後の切り札になり得ます。
詳しくはこのページに記載してあります。
Microsoft Sysinternals(Windows Sysinternals)
https://technet.microsoft.com/ja-jp/sysinternals/bb897553
※もちろん無償で利用可能です。
このpsexec.exeによるCUI接続はRPC(リモートプロシージャコール)という仕組みで接続をしています。WindowsにおけるRPCサービスというのがOS起動時のかなり初期の段階でサービスが有効化されており、シャットダウンにおいてはかなり最後の方でサービスが停止することからpsexecで接続できるタイミングは他のリモート接続より多いといえます。
PsExecはあくまでCUIです。リモートコンピュータのコマンドプロンプトをローカルコンピュータのコマンドプロンプト画面で操作するものでGUIは一切ありません。逆に言えばコマンドプロンプトさえ使い慣れていればリモートコンピュータになにもしなくてもコマンドプロンプト自体が使えることになります。
こんな画面です。

f:id:treedown:20150918121911p:plain

見た目、ただのコマンドプロンプトですが、別のコンピュータのPsExec開いたコマンドプロンプトの実行は接続先コンピュータにてコマンド実行結果が反映されます。


さて、簡単ではありますが、ここまででPsExecに興味を持っていただけましたか?
興味を持ったけど、使い方が分からない、ということはあると思います。特にオプションで何をつけたらいいか分からない、ということが良くありますよね。
そこで、使いやすいようにバッチファイルを用意してみました。
SSH接続でのログインに近づけるよう対話型でオプションを入力し、単純にリモート接続してリモートのコマンドプロンプト(cmd.exe)を起動する、という動きをするバッチファイルです。

ぜひこのバッチファイルで、こんな接続方法もあるんだ、という新しい世界を見てみてもらえればと思います。

■ 動作条件:

  1. 対象のPCでRPC経由でのアクセスが可能であることが条件です。
    (ポートは3種類=TCP:135、TCP:445、TCP:1025~65535)
    ※よほど厳格なポート管理をしていない限り、通常はこのポートは開いていることが多いです。
  2. ダウンロードしたファイルの格納場所
    Microsoft Sysinternals(Windows Sysinternals)にて
    「PsTools のダウンロード」
    http://download.sysinternals.com/files/PSTools.zip
    で「PsTools のダウンロード」からpsexec.exeをダウンロードし、
    %userprofile%(c:\Users\ユーザ名\)内に「PSTools」とフォルダを作成しその中にpsexec.exeを格納することが条件です。
    ■2015年9月15日誤表記修正:
    バッチファイル内のset行、変数ExecDirの指定では、「%userprofile%\UserPrograms\PSTools」となっておりましたので、
    "%userprofile%(c:\Users\ユーザ名\)"内に「UserPrograms」フォルダを作成しその配下に「PSTools」とフォルダを作成しその中にpsexec.exeを格納することが条件です。
    格納場所を変える場合にはバッチファイル中のこの行
    「set ExecDir=%userprofile%\PSTools」
    「set ExecDir=%userprofile%\UserPrograms\PSTools」
    をpsexec.exeが格納されているパスに書き換えてください。
    例えば、「C:\Users\Public\PSTools」に格納した場合
    「set ExecDir=C:\Users\Public\PSTools」
    と書き換えます。
  3. 途中でリモートコンピュータに接続するためのパスワード入力を実行するのですが、これがコマンド実行履歴に残ります。(ウィンドウを起動している間記憶された状態になります。)このため、バッチファイル完了後は「exit」コマンドなどでウィンドウを閉じることをおすすめします。(履歴内に残るパスワード文字列が意図せず読み取られることを防ぐため)


::**********************************************************
:: バッチファイル
::**********************************************************
@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% \\%targetPCNAME% cmd
) else (
rem ドメインネットワーク環境でのRPC接続(ドメイン認証)
PsExec.exe -u %targetPCDomain%\%USERNAME% -p %USERPASSWD% \\%targetPCNAME% cmd
)

:endMsg
echo ログアウトし切断します。
:end
popd
set ExecDir=
set targetPCNAME=
set targetPCDomain=
set USERNAME=
set USERPASSWD=
::**********************************************************