##内容
Powershellを使ってWindowsServer1からWindowsServer2へリモート接続してコマンドを実行するといったことを実施したのでやり方をまとめておきます。
##前提
■リモート接続元、接続先の両方でPowershellのポリシーがRemoteSignedになっている
・実行ポリシーをRemoteSignedに変更
set-ExecutionPolicy RemoteSigned
・実行ポリシー確認方法
コマンドの結果RemoteSignedと表示されれば問題無し。
> get-ExecutionPolicy
RemoteSigned
■WinRMが要求を受け入れられる状態になっている。
・WinRMで要求を受け入れられるようにするコマンド
Enable-PSRemoting
##リモートログイン
・SSH接続したようなリモートログイン
これでログインすると、接続先の情報がプロンプトの頭に表示される。
以降のコマンド実行は接続先のサーバで実行される。
Enter-PSSession -ComputerName windowsserver2 -Credential [接続アカウント] [パスワード]
[windowsserver2]:PS C:\Users\~>
この場合、コマンドはすべてWindowsServer2で実行されているため、結果をWindowsServer1側に保存しようとしてExport
系のコマンドへパイプを使って結果を渡しても、WindowsServer2側で保存されてしまう。
##コマンドのリモート実行
Invoke-command
を用いる。
その際、複数コマンドを実行する場合、リモートセッション情報を使い回すため、セッションを固定で生成しておくと
都度セッションを開く必要がないため楽だと思う。
$S = New-PSSession -ComputerName windowsserver2 -Credential [接続アカウント] [パスワード]
Invoke-Command -Session $S -ScriptBlock {[実行コマンド]}
こちらの場合、コマンド結果をWindowsServer1で受け取るのでパイプでExportするコマンドへ渡してあげれば、結果をWindowsServer1側で保存できる。
※多数のホストからの情報収集等はこちらを利用すると良いと思う。
Invoke-command
はコマンドだけでなく事前に定義したFunctionも実行可能。
function func {hostname}
Invoke-Command -Session $S -ScriptBlock $function:func
コマンド実行が終わったらセッションをクローズする。
Remove-PSSession -Session $S