SIOS Coati 開発チーム、沼野井です。正月に軍艦島に行って来ました。
前日の天気予報が雪で最悪ゥ―とか思っていたのですが、当日は幸いにも雪も雨も降らず、風もほぼ無風だったので、無事上陸を果たせました。
廃墟マニアならずとも見ごたえのある所でした。皆様もぜひどうぞ!
さて本日は、そんな軍艦島とは全く関係のない、pywinrm のお話です。
Windowsマシンからリモートで接続されている別のWindowsマシンのコマンドやpowershellコマンドレットを実行するプロトコル(と実装)にWinRMがあります。
Linuxでも、WinRMのクライアントを導入すれば、このプロトコルを利用してWindowsを操作することが可能です。Pythonでそれを実行可能にするのが、pywinrmモジュールです。
今回はこのpywinrm導入の方法と実行の簡単な例を紹介したいと思います。
事前準備
今回ご紹介する例ではWindowsマシンへのアクセスにBasic認証を利用します。この場合、操作する対象のWindows上で以下の設定が必要です。
- WinRMの通信ポートでの通信をできるようにしておく
WinRMが使用するデフォルトのポート番号は5985です。 - PowerShellリモーティングが有効になっている
ご参考 - Basic認証を許可する
以下のコマンドです(要管理者権限)。
12winrm set winrm/config/service/auth '@{Basic="true"}' # Basic認証の許可winrm set winrm/config/service '@{AllowUnencrypted="true"}' # 非暗号化パスワード許可 - ネットワークがHomeまたはPrivateになっている
[コントロールパネル]-[ファイアウォール]-[プライベートネットワーク] から設定できます(windows 10の場合)
pywinrmの導入
Linux側へのpywinrm導入の手順です。
pipでepelリポジトリからインストールすることができますので、入っていない場合には先にそれらをインストールしてください。
1 2 3 |
> yum install epel-release > yum install python-pip > pip install WinRM |
実行方法
pywinrmを使用した、Windowsリモートアクセスの方法です。
- セッションを張る
1 session = winrm.Session(<ホスト名>, auth=(<ユーザ名>, <パスワード>))- コマンドを実行する
1 で張ったセッションを利用します。
PowerShellコマンドレットの場合は、run_ps()メソッドで実行します。
1 session.run_ps(<コマンドレット>)
Windowsコマンドの場合は、run_cmd()メソッドです。
1 session.run_cmd(<コマンド>)
実行例
WindowsコマンドとPowerShellコマンドレットで、現在日時を取得するサンプルです。
1 2 3 4 5 |
>>> session = winrm.Session(<ホスト名>, auth=(<ユーザ名>, <パスワード>)) >>> session.run_cmd("echo %date% %time%").std_out # Windowsコマンドの実行 'Tue 01/23/2018 5:10:01.69\r\n' >>> session.run_ps("Get-Date").std_out " PowerShellコマンドレットの実行 '\r\nTuesday, January 23, 2018 5:06:34 AM\r\n\r\n\r\n' |
Basic認証以外を利用する場合
KerberosまたはCredSSLが使用できまするようです。(試してないです。すみません。)
その場合、別途モジュールの導入が必要です。
README を参照してください。
LinuxからWindowsを操作するケースは、様々な端末の操作自動化をLinuxにまとめてしまいたいというシチュエーションなどであるかも知れませんが、そのようなときにぜひご活用ください。