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

    この記事は公開してから1年以上経過しており、情報が古い可能性がありますのでご了承ください。

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

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

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

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

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

    事前準備

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

    • WinRMの通信ポートでの通信をできるようにしておく
      WinRMが使用するデフォルトのポート番号は5985です。
    • PowerShellリモーティングが有効になっている
      ご参考
    • Basic認証を許可する
      以下のコマンドです(要管理者権限)。

      winrm set winrm/config/service/auth '@{Basic="true"}' # Basic認証の許可
      winrm set winrm/config/service '@{AllowUnencrypted="true"}' # 非暗号化パスワード許可
      
    • ネットワークがHomeまたはPrivateになっている
      [コントロールパネル]-[ファイアウォール]-[プライベートネットワーク] から設定できます(windows 10の場合)

     pywinrmの導入

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

    > yum install epel-release
    > yum install python-pip
    > pip install WinRM

    実行方法

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

    1. セッションを張る
      session = winrm.Session(<ホスト名>, auth=(<ユーザ名>, <パスワード>))
    2. コマンドを実行する
      1 で張ったセッションを利用します。
      PowerShellコマンドレットの場合は、run_ps()メソッドで実行します。

      session.run_ps(<コマンドレット>)

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

      session.run_cmd(<コマンド>)

    実行例

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

    >>> 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にまとめてしまいたいというシチュエーションなどであるかも知れませんが、そのようなときにぜひご活用ください。

    また、Amazon EC2上で運用しているアプリケーションの自動監視、自動復旧サービスもやってます。(ド宣伝)
    たくさんのEC2インスタンスをご利用の方、簡単にEC2インスタンス自動復旧したい方など、ご興味あればぜひどうぞ。

     

    SNSでもご購読できます。