見出し画像

【WPF】PowerShellでリモートPCを操作する手順とGUIツール

この記事はPowerShell Advent Calendar 2018の25日目の記事になります。

はじめに

私は普段デジタルアートなど展示作品を開発しているプログラマなのですが、最近作品の大型化に伴い結構大量のPCをセットアップする作業が発生してきています。

さすがに手動ではやってられないということでPowerShellの出番になりました。作品の特性上グラフィックリッチな環境が必要なので必然的にOSはWindowsになります。

しばらくPowerShellで運用してみるとその場その場でちょこちょこ変更しながら複数のPCのセットアップを行うので、これはちょっとしたGUIがついてるとよさそうだなと感じ、つい先日ツールを作ってみました。

本記事はPowerShellでリモートPCを操作する際に必要な手順と自作のGUIツールについての解説になります。


PowerShellで操作されるPCの設定

操作される側のPCは操作を許可するよう設定する必要があります。ちょうどPowerShellにそのためのコマンドがあるので簡単です。

Enable-PSRemoting

*管理者権限が必要です


PowerShellで操作するPCの設定

リモート操作する場合は、接続先が信頼できるホストである必要があります。手動で登録するコマンドは次のとおりです。

Set-Item WSMan:\localhost\Client\TrustedHosts -Value *

*管理者権限が必要です。

上記の例だとあらゆるPCを信頼してしまうので、慎重に行きたい場合は-Valueの*をホスト名やIPアドレスにして個別に設定します。


PowerShellでリモート操作するときのお作法

主に次のような手順になります。

・対象のPCをホスト名かIPアドレスで指定
・ユーザー名とパスワードからCredentialを生成
・上記2つからセッションを作成

対話的にリモート操作を行う場合は

Enter-PSSession -ComputerName [ホスト名|IP] -Credential [ユーザー名]

スクリプト上などコマンド一発で行う場合は

$session = New-PSSession -ComputerName [ホスト名|IP] -Credential [ユーザー名]

でPSSessionを作成し、該当のコマンドに渡す形になります。


HQ(GUIツール)

こちらが自作ツールのリポジトリになります。

叩きたいスクリプトを.ps1ファイルで用意しておき、IPのうち対象にするものを選択して、GUI上から実行する感じになります。

特徴1:

対象IPをチェックボックスで選択できます。
全IPを記述しておけば操作に応じて対象が一部だけとなる場合でもファイルなどの書き換えしなくて済みます。

特徴2:

IPごとのループやセッションの作成はツール側が行うのでスクリプトがシンプルになります。スクリプトはPSSessionをパラメータとして受け取ってからの部分だけで動作します。

リモートPCにファイルをコピーするスクリプトはこんな感じになります。

param($session,$localPath,$remotePath)
Copy-Item -ToSession $session -Path $localPath -Destination $remotePath

$sessionはツールが勝手に生成して渡してきます。

特徴3:

スクリプトが使用するパラメータをGUI上で確認、編集ができます。
スクリプトのparam()を解析し、$session以外のパラメータを表示します。IPListに名前があるものはそちらを参照し、それ以外はスクリプトのパネルのほうで確認、入力ができるようになっています。


まとめ

複数のPCをセットアップしたいというところから意外とPowerShellってリモートで操作できるらしいと知ったので、そのほんとに触りの解説と自作のツールの紹介をしてみました。

作ってて面白かったのはC#から見るとスクリプトの出力として文字列ではなくPSObject型が返ってきたりするんですね。さすが.NETベースです。いままでPowerShellはあまり詳しく知らなかったのですがいろいろできそうで面白そうな気がしてます。

Unity Advent Calendarにも参加しています。
よかったら御覧ください。
https://note.mu/fuqunaga/n/ne331cb5600fe

参考





もしお役に立ちましたらスキ(♡マーク)をお願いします!!! noteアカウントがなくても大丈夫です。サポートもお待ちしています!