Linuxからpywinrmを使ってPythonからWinRM経由でWindowsを操作する
Pocket

Linuxからpywinrmを用いてWinRM経由でWindowsを操作する場合、まず以下のコマンドをWindows側で実行しWinRMを有効にする。

winrm qc
winrm set winrm/config/client/auth '@{Basic="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
PS C:\Users\Administrator> winrm qc
WinRM サービスは、既にこのコンピューターで実行されています。
WinRM は、管理用にこのコンピューターへのリモート アクセスを許可するように設定されていません。
次の変更を行う必要があります:

ローカル ユーザーにリモートで管理権限を付与するよう LocalAccountTokenFilterPolicy を構成してください。

変更しますか [y/n]? y

WinRM はリモート管理用に更新されました。

ローカル ユーザーにリモートで管理権限を付与するよう LocalAccountTokenFilterPolicy を構成しました。

PS C:\Users\Administrator> winrm set winrm/config/client/auth '@{Basic="true"}'
Auth
    Basic = true
    Digest = true
    Kerberos = true
    Negotiate = true
    Certificate = true
    CredSSP = false

PS C:\Users\Administrator> winrm set winrm/config/service/auth '@{Basic="true"}'
Auth
    Basic = true
    Kerberos = true
    Negotiate = true
    Certificate = false
    CredSSP = false
    CbtHardeningLevel = Relaxed

PS C:\Users\Administrator> winrm set winrm/config/service '@{AllowUnencrypted="true"}'
Service
    RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)
    MaxConcurrentOperations = 4294967295
    MaxConcurrentOperationsPerUser = 1500
    EnumerationTimeoutms = 240000
    MaxConnections = 300
    MaxPacketRetrievalTimeSeconds = 120
    AllowUnencrypted = true
    Auth
        Basic = true
        Kerberos = true
        Negotiate = true
        Certificate = false
        CredSSP = false
        CbtHardeningLevel = Relaxed
    DefaultPorts
        HTTP = 5985
        HTTPS = 5986
    IPv4Filter = *
    IPv6Filter = *
    EnableCompatibilityHttpListener = false
    EnableCompatibilityHttpsListener = false
    CertificateThumbprint
    AllowRemoteAccess = true

 

これでWindows側の準備は完了。
次に、Linux側にpywinrmをインストールする。

yum install epel-release
yum install python-pip
pip install pywinrm
yum install gcc krb5-devel krb5-workstation python-devel
pip install pywinrm[kerberos]

 

これで、PythonでWinRM経由でコマンドを実行できるようになった。
なお、WinRMへのアクセス用のコマンドとして用意されているわけではないので、以下のようなPythonスクリプトを作成してアクセスする。

import winrm

s = winrm.Session('ホスト名', auth=('ユーザ名', 'パスワード'))
r = s.run_cmd('コマンド', ['引数'])

print r.std_out
[root@BS-PUB-CENT7-01 ~]# cat test.py
import winrm

s = winrm.Session('BS-PUB-WIN2012R2', auth=('Administrator', 'P@ssw0rd'))
r = s.run_cmd('hostname')

print r.std_out
[root@BS-PUB-CENT7-01 ~]# python test.py
BS-PUB-WIN2012R2

 

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。