[WinRM/WinRS] 簡単リモート管理!WMI の代わりに使ってみませんか?

皆さんごきげんよう。ういこです。最近森ガールの後継の山ガールが流行ってるらしいですね。私もついカッとなってファーベストを試着したら山狩り上等なマタギ感溢れるコーデになってしまいそして僕は途方にくれるな秋ですが皆さま如何お過ごしでしょうか。

さて、今日は WinRM についてです。あんまり情報が無いので、おいしそうに見えませんが、毒キノコじゃないですよ。WinRM は食べて美味しいものですよ!食べず嫌いはもったいないです。というわけで、今日は本当に基本の基本になっちゃいますが、簡単な使い方を御紹介します。

能書き
WinRM とは…というのを語ってるとすごく難しくて、色々語られつくされているのですがまあ要は DCOM 使わないで HTTP/HTTPS などでリモートコンピュータやらの管理ができる便利なインターフェースと思ってください。興味をもたれた方は後述の technet コンテンツなどご参照頂ければと思います。管理系インターフェースとしては、WMI が随分人口に膾炙している感がありますが、WinRM も基本同じような目的のものなので、ほとんど同じことが出来ます。むしろ、もっと出来ることあるかも。

① WinRM のバージョンを見てみよう
2010 年 10 月 27 日現在、WinRM のバージョンは二つありますです。

・Windows Vista / Windows Server 2008 … Version 1.x ・Windows 7 / Windows Server 2008 R2 … Version 2.x

実は、それぞれ微妙に違います。例えば、既定のポート番号が違ったりします。そこで、まずあなたの環境と、リモートでこっそりいじりまわしてやりたい環境と双方の WinRM のバージョンを確認してみたいと思います。

ローカルで実行してみる
1. PowerShell を管理者権限で実行します。
2. WinRM id と打って、Enter キーを押します。例えば、Windows 7 の環境で実行した場合は以下のようになります。

image

    PS C:\Windows\system32> WinRM id IdentifyResponse ProtocolVersion = https://schemas.dmtf.org/wbem/wsman/1/wsman.xsd         ProductVendor = Microsoft Corporation ProductVersion = OS: 6.1.7600 SP: 0.0 Stack: 2.0

Windows Server 2008 の場合は以下のようになります。どうも、Stack というところが実際の WinRM のバージョンのようですね。

image

    PS C:\Users\Administrator> WinRM id IdentifyResponse ProtocolVersion = https://schemas.dmtf.org/wbem/wsman/1/wsman.xsd         ProductVendor = Microsoft Corporation ProductVersion = OS: 6.0.6002 SP: 2.0 Stack: 1.1

リモート PC の WinRM バージョンを確認してみる
まず、リモート PC では WinRM QC を実行してある必要があります。これがないと、リモートからアクセスできません。

例) WinRM Qc を実行していないマシンに対して実行した場合

image

PS C:\Windows\system32> WinRM id -r:uikou2008r2 WSManFault Message = WinRM クライアントは、指定された時間内に処理を完了できません。コンピューター名が有効で、ネットワークを介して到達可能で、Windows リモート管理サービスのファイアウォールの例外が有効化されていることを確認してください。

エラー番号: -2144108250 0x80338126 WinRM クライアントは、指定された時間内に処理を完了できません。コンピューター名が有効で、ネットワークを介して到達可能で、Windows リモート管理サービスのファイアウォールの例外が有効化されていることを確認してください。

リモート PC を設定する場合、 -r:<接続してやりたいマシンの NetBIOS 名など> を指定します。以下の例では、jpdsfim というマシンの WinRM のバージョンを確認しています。jpdsfim 上であらかじめ WinRM qc を実施してあるので、ちゃんと確認が出来ます。

image

    PS C:\Windows\system32> WinRM id -r:jpdsfim IdentifyResponse ProtocolVersion = https://schemas.dmtf.org/wbem/wsman/1/wsman.xsd         ProductVendor = Microsoft Corporation ProductVersion = OS: 6.1.7600 SP: 0.0 Stack: 2.0

② WinRM の細かい設定を見てみよう
WinRM の構成情報を確認する場合、コマンドは以下のようになります。

WinRM get WinRM/config

これを実行すると、認証や、既定ポートなどが判ります。さっきの通り、Windows 2008 と Windows 2008 R2 では既定ポートが違うのがよくわかります。

・Windows Vista / Windows Server 2008 の場合 : HTTP = 80、HTTPS = 443 が使われている

image

・Windows 7 / Windows Server 2008 R2 の場合 : HTTP = 5985、HTTPS = 5986 が使われている

image

さて、リモートで実行してみましょう。簡単です。さっきと同じく、 -r: にリモートマシン名つければいいだけです。

WinRM get WinRM/config -r:jpdsfim

③ WMI 見たいなことをやってみよう
例えば、WMI のコマンドラインである WMIC で特定のサービスの情報を取ってきたい場合は、以下のような構文になります。

wmic path win32_service where Name="WinRM"

これと同じことを WinRM でやると、こんな感じになります。Whare 句の後にクラス (この例では、win32_service) のプロパティを指定していますが、(この例では Name) クラス名のあとに ? とプロパティ名を指定して確認が可能です。例えば、WinRM 自身の情報を取ってきましょうか。Name のあとにサービス名、つまり今回の場合 WinRM と指定してあげれば、取れます。

image
まずローカルでやってみます。

WinRM get wmi/root/cimv2/Win32_Service?Name="WinRM"

image

こんな指定方法でもよいです。

WinRM get https://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service?Name=WinRM

では次はリモートやってみましょう。まず、WMI の場合は、 /node:<いじってやりたいマシン名> を wmic の後につつましくつけてあげましょう。

wmic /node:jpdsfim path win32_service where Name="WinRM"

image

はい、取れました。相変わらずインデントが色々気に食わないです。つぎ、WinRM 行ってみましょう。WinRM でリモートは… そう、 -r:<いじってやりたいマシン名> でしたね。最後に追加してあげても全然 OK です。

WinRM get wmi/root/cimv2/Win32_Service?Name="WinRM" -r:jpdsfim

image

美しい。

④ リモート シェル実行してみますか
さて、WinRM って、結構色々できるのね★ってことがまだ実感できないというかた!Windows Remote Shell (WinRS) を使って色々コマンドも実行できますよ。WinRS は、WinRM を基盤として、シェルを実行するもの見たいな感じです。WinRM が構成されている必要があります。(WinRM qc)
例えば、リモートマシンに適切なアクセス権があるユーザで接続できさえすれば、shutdown もできますよ!ちょっとしたおちゃめ心で同僚の気になるあの子のマシンに WMI でシャットダウンさせちゃって怒られたものの、「え…僕、あのマシンの管理者権限貰っちゃってたんだ」と微妙にときめいたりした経験のある方などは、今度は WinRS で再チャレンジしてみるというのもオツなものかもしれません。それでアクセス権なくなってたら男泣きですが。

というわけで、心優しい私は一瞬、チームメンバーのマシンでも落としてやろうかと思いましたが、思い直して自分のおととい構成したマシンをシャットダウン…するのが怖いので、休止モード (/h) で実行したら、休止状態無効にしててほっとしたようなそれでいてまったりしたような気分でした。

image

PS C:\Windows\system32> winrs -r:uikou2008r2 shutdown /h このシステムでは休止状態が有効になっていません。-h オプションを使うには、休止状態を有効にしてください。

でもこれ、別に WMI のころから変わってないんですが、ひそかにコマンドとかを実行させたりできる分、怖いなあと思います。アクセス権は適切にしておいたほうがいいですね。

⑤おまけ : エラーコードを見てみるです
以前の記事で紹介した、WinRM のイベント ビューアのエラーコード。
イベント ビューア上だと、これの説明があんまりないです。そういう時は、以下の構文で確認が出来ます。

winrm helpmsg 0x<エラーコード>

が、電卓と、頭に 0x をつけないと動いてくれません。

image

Windows リモート管理コマンド ライン ツール

winrm helpmsg errorcode

エラー コードに関連付けられているエラー メッセージを表示します。 例: winrm helpmsg 0x5

そこで、まずエラーコードをイベント ビューアからコードをコピーします。

image

WSMan の操作 Get に失敗しました。エラー コード 2150858811

電卓を起動し、プログラマ電卓あるいは関数電卓にして 10 進数にした状態で、コードをペーストします。

image

ペーストしたら、16 進数にします。8033803B と判ります。

image
ここで、0x をつけて、0x8033803B にした状態で、winrm helpmsg に渡します。

winrm helpmsg 0x8033803B

image

WS-Management サービスは要求を処理できません。リソース URI が見つからないか、間違った形式です。 リソース URI を構築する方法については、マニュアルを参照するか、または "winrm help uris" コマンドを使用してください。

それではみなさんごきげんよう。

参考

An update is available for the Windows Remote Management feature in Windows Server 2003 and in Windows XP
https://support.microsoft.com/default.aspx?scid=kb;EN-US;936059

Windows Remote Management and WMI
https://msdn.microsoft.com/en-us/library/aa384463(VS.85).aspx

Windows Management Instrumentation (WMI) コマンド ライン ユーティリティ (Wmic.exe) の説明
https://support.microsoft.com/kb/290216/ja

Examples of WMIC commands for Windows .NET SERVER Family
https://support.microsoft.com/servicedesks/webcasts/wc072402/listofsampleusage.asp

WMIC のエイリアス
https://technet.microsoft.com/ja-jp/library/cc736307(WS.10).aspx

[ILM/FIM] Remote PowerShell/WinRM を用いて Exchange 2010 コマンドレットを投入にチャレンジする
https://blogs.technet.com/b/jpilmblg/archive/2010/10/12/ilm-fim-remote-powershell-winrm-exchange-2010.aspx

[WinRM:初級編] WinRM を構成してみよう!(WinRM QC)
https://blogs.technet.com/b/jpilmblg/archive/2009/11/25/winrm-winrm.aspx

[WinRM] Windows Remoe Management を使って、らくらく管理!- その1
https://blogs.technet.com/b/jpilmblg/archive/2009/08/17/winrm-windows-remoe-management-1.aspx

ういこう@これからはマタギガールがなうでトレンディだと思うよおっかさん