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

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

 


Written by blacknon

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

Leave a Comment

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

*