LinuxからWindowsのコマンドをリモート実行するPythonモジュールpywinrm

SIOS Coati 開発チーム、沼野井です。正月に軍艦島に行って来ました。

前日の天気予報が雪で最悪ゥ―とか思っていたのですが、当日は幸いにも雪も雨も降らず、風もほぼ無風だったので、無事上陸を果たせました。

廃墟マニアならずとも見ごたえのある所でした。皆様もぜひどうぞ!

 

さて本日は、そんな軍艦島とは全く関係のないpywinrm のお話です。

Windowsマシンからリモートで接続されている別のWindowsマシンのコマンドやpowershellコマンドレットを実行するプロトコル(と実装)にWinRMがあります。
Linuxでも、WinRMのクライアントを導入すれば、このプロトコルを利用してWindowsを操作することが可能です。Pythonでそれを実行可能にするのが、pywinrmモジュールです。
今回はこのpywinrm導入の方法と実行の簡単な例を紹介したいと思います。

事前準備

今回ご紹介する例ではWindowsマシンへのアクセスにBasic認証を利用します。この場合、操作する対象のWindows上で以下の設定が必要です。

  • WinRMの通信ポートでの通信をできるようにしておく
    WinRMが使用するデフォルトのポート番号は5985です。
  • PowerShellリモーティングが有効になっている
    ご参考
  • Basic認証を許可する
    以下のコマンドです(要管理者権限)。
  • ネットワークがHomeまたはPrivateになっている
    [コントロールパネル]-[ファイアウォール]-[プライベートネットワーク] から設定できます(windows 10の場合)

 pywinrmの導入

Linux側へのpywinrm導入の手順です。
pipでepelリポジトリからインストールすることができますので、入っていない場合には先にそれらをインストールしてください。

 実行方法

pywinrmを使用した、Windowsリモートアクセスの方法です。

  1. セッションを張る
  2. コマンドを実行する
    1 で張ったセッションを利用します。
    PowerShellコマンドレットの場合は、run_ps()メソッドで実行します。

    Windowsコマンドの場合は、run_cmd()メソッドです。

実行例

WindowsコマンドとPowerShellコマンドレットで、現在日時を取得するサンプルです。

 

Basic認証以外を利用する場合

KerberosまたはCredSSLが使用できまするようです。(試してないです。すみません。)
その場合、別途モジュールの導入が必要です。
README を参照してください。

 


LinuxからWindowsを操作するケースは、様々な端末の操作自動化をLinuxにまとめてしまいたいというシチュエーションなどであるかも知れませんが、そのようなときにぜひご活用ください。

SNSでもご購読できます。