なにやら WinRM という仕組みがあるようです。
そもそも WinRM って何かというと、ザクっといえば WMI (Windows Management Instrumentation) を Webサービス (WS-Management プロトコル, HTTP SOAP ベース, WS は WebService の略) でアクセスできる版、みたいなやつらしいです。一方 WMI は DCOM ベースのアクセスらしいです。しかし WMI 自体が WBEM (Web Based Enterprise Management) の Microsoft の実装なので Web なんじゃないの?という話なわけですが、まあそれを言ったら DCOM も ActiveX だったりするわけで Web ですよね、みたいな話なのかな? このあたりの関係性はよくわかりませんが・・・
なにはともあれ有効にしてみます。
- 管理者権限でコマンドプロンプトを起動します。
- winrm qc を実行します。
qc は QuickConfig の略らしいです。
winrm qc
- WinRM サービスを開始します。
WinRM サービスを開始します。変更しますか [y/n]? と聞いてくるので y を押します。
しかしここで public なネットワークに接続していると失敗します。WinRM はこのコンピューター上で要求を受信するように設定されていません。 次の変更を行う必要があります: WinRM サービスを開始します。 変更しますか [y/n]? y WinRM は要求を受信するように更新されました。 WinRM サービスが開始されました。 WSManFault Message ProviderFault WSManFault Message = このコンピューターのネットワーク接続の種類の 1 つが Public に設定されているため、WinRM ファイアウォール例外は機能しません。 ネットワーク接続の種類を Domain または Private に変更して、やり直してください。 エラー番号: -2144108183 0x80338169 このコンピューターのネットワーク接続の種類の 1 つが Public に設定されているため 、WinRM ファイアウォール例外は機能しません。 ネットワーク接続の種類を Domain ま たは Private に変更して、やり直してください。
なので WinRM を有効にする PC はルーターの内側にあるか、または public なネットワークにつながっていない状況で実行します。
ところが Hyper-V をインストールしていたりしますと仮想 NIC が作成されていますが、それが「識別できないネットワーク」になっていると public 扱いされてはねられてしまいます。そういう場合はグループポリシーを操作するなどをして、一時的にでも public ネットワークが存在しないようにします。
- あらためて WinRM の設定を行います。
WinRM サービスを開始します。変更しますか [y/n]? で y を
WinRM ファイアウォールの例外を有効にします。~ 変更しますか [y/n]? で y を選択します。C>winrm qc WinRM はこのコンピューター上で要求を受信するように設定されていません。 次の変更を行う必要があります: WinRM サービスを開始します。 変更しますか [y/n]? y WinRM は要求を受信するように更新されました。 WinRM サービスが開始されました。 WinRM は、管理用にこのコンピューターへのリモート アクセスを許可するように設定されていません。 次の変更を行う必要があります: WinRM ファイアウォールの例外を有効にします。 ローカル ユーザーにリモートで管理権限を付与するよう LocalAccountTokenFilterPolicy を構成してください。 変更しますか [y/n]? y WinRM はリモート管理用に更新されました。 WinRM ファイアウォールの例外を有効にしました。 ローカル ユーザーにリモートで管理権限を付与するよう LocalAccountTokenFilterPolicy を構成しました。
LocalAccountTokenFilterPolicy ってのは リモート UAC のことらしいです。(=リモート接続で権限が昇格するようにする)
- WinRM を使用してデータを取ってみます。
サービスの一覧を取得します。 e というのは enumerate の略です。wmicimv2/Win32_Service というのはアクセスするリソース名のようです。wmicimv2/~ で wmi のクラス名を指定すれば取得できるようです。
winrm e wmicimv2/Win32_Service
特定のサービスの情報を取得する場合は get を使用します。取得するサービス名は指定は「?Name=サービス名」といった形式で指定します。
winrm get wmicimv2/Win32_Service?Name=W32time
- Linux からのアクセスが可能なように構成します。
現在の設定を確認します。デフォルトの設定では Basic 認証が無効 (Basic = false), 平文が不可 (AllowUnencrypted=false) になっているはずです。
winrm get winrm/config/service
Linux からのアクセスを可能にするため Basic 認証を有効、平文を許可にします。
(もっとセキュアな設定はあると思いますが、ここでは考えないことにします)winrm set winrm/config/service/auth @{Basic="true"} winrm set winrm/config/service @{AllowUnencrypted="true"}
- CentOS からアクセスできるかを確認します。
まず wsmancli のインストールをします。
yum install wsmancli
CentOS ではなく Ubuntu や WSL (Bash on Ubuntu on Windows) など Debian系Linux の場合は apt-get します。
apt-get install wsmancli
以下のような感じでアクセスします。
この際、user はドメインユーザーは指定できません。なので WinRM でアクセスする用のローカルユーザーを作成して置く必要があります。wsman -u [localuser] -p [password] -y basic -h 127.0.0.1 -P 5985 enumerate http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service wsman -u [localuser] -p [password] -y basic -h 127.0.0.1 -P 5985 get http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service?Name=W32time