気まぐれなももぽえむ

気まぐれなももぽえむです。

PowerShellでリモートコマンド実行

とあることから、Windows Server間でコマンドを実行しなくては
ならなくなり、急遽PowerShellなるものを少しかじってみた。

PowerShellを使って、別なServerにコマンドを投げて結果を得るのである。
その昔、Unixマシンではrloginやrshなどを使ったことはあるが、
WindowsServerではPowerShellを使うのが一番ベストな選択のようだ。

今回はWindows Server 2008R2を使ったが、Windows Server 2003でも
可能だし、Windows 7/8/8.1/10でも可能なはず。

セキュリティの絡みもあって非常にシビアな設定が必要。
#といっても今回は強引に動作させる最低限の設定のみ。
#ネットに公開しているサーバーでは、こんな設定をしてはダメです。

使用するには準備が必要。

前提として、実行元のServerをA、実行先のServerをBとする。
つまり、A -> B にコマンドを投げる。

A(投げる方)での準備
 
コマンドプロンプトを管理者モードで実行し以下を実行。

PowerShell Set-ExecutionPolicy Unrestricted
PowerShell Set-Item WSMan:\localhost\Client\TrustedHosts -Value * -Force

解説:1行目:スクリプトを全て実行可能。
         2行目:全てのホストを信頼する。
 
イメージ 1
 

B(受けて実行する方)での準備
 
コマンドプロンプトを管理者モードで実行し以下を実行。

PowerShell Enable-PSRemoting -Force

解説:リモートからスクリプト実行を許可する。-Forceは強制的に。
  このコマンドで、サービスやファイアウォールの設定が行われる。
 
イメージ 2
 
ここで赤字でエラーがでるようなら、ネットワークのセキュリティ構成が、
「パブリックネットワーク」になっている可能性が高い。
その場合は、以下のページを参考に「プライベートネットワーク」に
変更してやり直せばよい。

各々の準備が終わったら、管理者のコマンドプロンプトは閉じる。
 
リモートコマンドスクリプトの準備
 
以下の方のサイトに書いてある、スクリプトをA側にファイルとして保存する。
仮にA(投げる方)のパス、C:\Users\USER\Documentsに置いたとする。
※このページの最後にも少し変更したものを記載した。
 
B(受けて実行する方)のユーザーIDとパスワードを知っている必要がある。
※ユーザーのログオン時のフォルダーはディフォルトで C:\User\USER\Documentsである。
 
そして実行
 
A(投げる方)側で、(管理者ではない)コマンドプロンプトを開き、以下のように実行する。

PowerShell .\RemoteCommand.ps1 B(またはIPアドレス) ユーザーID パスワード { Bでの実行コマンド }

解説:カレントフォルダのRemoteCommand.ps1を
   ホスト名(ここではB)、ユーザーID、パスワード(プレーンテキスト)で
   { }で括った内側にB側のコマンドを書く。
   例えば、
    {cmd /c dir}
   と書けば、Bのカレントフォルダのディレクトリが表示される。

すごく荒っぽい設定だが、これで実行することができた。
実際には、ホスト名やユーザーなどセキュリティを細かく設定する必要がある。
#特に、パスワードをプレーンテキストで書くなどこれでは不味いです。

Param (
$computer,
$username,
$password,
$command
)
$password1 = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username,$password1
Invoke-Command -ComputerName $computer -Credential $credential -Command $command

誰が作ってもこうなるとは思うが、ヒント(そのもの)を頂いた、「だめでもいいからやってみる」のmataro777さんには感謝したい。

追伸:リモートでコマンドを実行する際、気をつけるべきこととして、
リモート側にログインされたとき、カレントディレクトリがローカル側、
(つまりA側)になっていること。
dir > aaa.txt
などとすると、aaa.txtはローカル側にできてしまう。
バッチコマンドの最初にcd %HOMEPATH%を最初の行に入れてやる必要があります。
リモートでバッチコマンドを実行する時などには、注意が必要です。