いまだに、よくcmdに比べてPowerShellのメリットは?と聞かれます。 業務経験上、最も嬉しいのはこれです。 イメージ的にはsshに近いものを個人的には感じています。(tunnelについて突っ込んだひとはお静かにお願いします><)
パラメータ一つでリモート先に対してもローカルと同等に扱うことができること。
また、それに加えてこのメリットも。 GUIとCUIの違いを生かすにはこれが欠かせませんね。
パラメータ一つで同時に複数のリモート先に同一ジョブを実行できる
他にもありますが……今回の記事は、このPowerShellでリモート接続するための準備について紹介します。
TechNetは
分かる人はこれでどうぞ。
Enable-PSRemoting
PowerShellでのリモートコマンドを受けられるようにするとは
PowerShellには、接続ネットワークがPrivateかWorkgroupの場合に、リモート越しにコマンドを受け取るための機構が備わっています。 ただしデフォルトでは機能が無効になっているため、、外部からのコマンドを受け付けれるように有効にする必要があります。
機能を有効にする際に何をしてるの?
実は、有効にするにはコマンド一発なのですが、前提となる条件を守っていないと有効にしようとした時にエラーが出ます。 そこで、有効にする際に実際にやっていることは何かを確認しましょう。
- WinRMサービスを開始します。
- WinRMサービスのスタートアップの種類を自動にします。
- どのIPアドレスからでも受け付けるためのリスナーを作成します。
- Windows FirewallにWS-Management traffic (httpのみ)の例外を作成します
コマンドを実行する前に確認しよう
コマンドはこの後紹介します。 その前に、コマンド実行時に極力エラーが起こらないように、先ほど紹介した機能を有効する際に行っていることを確認しましょう。 経験上、確認事項は以下です。
- WinRM(Windows Remote Management (WS-Management))サービスが無効になっていたら自動にする手動でも可ですが推奨)
- WinRMサービスを開始する。
- Firewallサービス(Windows Firewall)が無効になっていたら自動にする手動でも可ですが推奨)
- Firewall自体が無効になっていたら有効にする
- 自分が接続しているネットワークが、「プライベートネットワーク(Private network)」か「社内ネットワーク(Work network)」であることを確認する
順番に説明します。
1. WinRM(Windows Remote Management (WS-Management))サービスが無効になっていたら自動にする手動でも可ですが推奨)
確認方法は、Windows 7 / 8共通です。
- 「Win + R」を押す
- services.mscと入力してOKを選択
- Windows Remote Management を一覧から探し無効になっていないことを確認します。
- 無効になっていた場合は、右クリック => プロパティから、状態を自動にします。
2. WinRMサービスを開始する。
先ほどの1の続きです。Windows 7 / 8共通です。
- Windows Remote Management が、停止になっていたら「サービスの開始」をおこないます。
3. Firewallサービス(Windows Firewall)が無効になっていたら自動にする手動でも可ですが推奨)
先ほどの2の続きです。Windows 7 / 8共通です。
- 1. Windows Firewall が、停止になっていたら「サービスの開始」をおこないます。
4. 自分が接続しているネットワークが、「ホーム(Home network)」か「社内ネットワーク(Work network)」であることを確認する
- 「Win + R」を押す
- firewall.cplと入力してOKを選択
- 現在接続されているネットワークが、プライベートネットワークや社内ネットワークであることを確認します。
※パブリックネットワークに接続している、Firewallへのアクセス絵エラーがでて機能を有効にできません。 必ず、プライベートネットワーク か ドメインネットワークに接続していることを確認してください。
Enable-PSRemotingを実行してみる
ここまで確認ができていれば、コマンドを実行してみましょう。
1. Powershell.exe か PowerShell ISE.exeを管理者として起動する。
必ず管理者として起動してください。 これは、Set-ExecutionPolicyの時と同様ですね。
2. 起動したPowerShell画面でEnable-PSRemotingを実行する。
PowerShellでのリモートコマンドを受けられるようにするコマンド、それはたった一文です。 実行してみましょう。
Enable-PSRemoting
3. WinRMクイック構成を有効にする(WinRM Quick Configuration)
コマンドを実行して正常に行くと、初めにポップアップがでます。
(Windows 8) 全て続行を選択します。
(Windows 7) Yes to Allを選択します。
4. Set-PSSessionConfiguration
自動的に連携コマンドレットが走り、再度ポップアップがでます。
(Windows 8) 全て続行を選択します。
(Windows 7) Yes to Allを選択します。
完了
完了です。 エラーが出なかった人、良かったですね! ちなみに有効になっている状態で、再度Enable-PSRemotingを実行するとこのようなメッセージがでます。
WinRM is already set up to receive requests on this computer.
無効にする場合
無効にする場合は、同様の下準備で以下のコマンドを実行して完了です。
Disable-PSRemoting
Enable-PSRemotingでエラーが出た場合
良くある事例です。私も英語OSでの自邸のため、日本語でなくて申し訳ないのですが。
Unable to check the status of the firewall
3つ可能性があります。
- Windows Firewallサービスが無効になっていませんか?有効にしてください。
- ネットワーク接続がパブリックではありませんか?プライベートかドメインにしてください。
- Windows7での経験ですがKBがでています
3に関して説明します。
InvalidOperationException
Windows 7 Enterprise x64 Eng環境での経験です。 少しはまったので共有です。 Enable-PSRemotingのコマンド実行後のポップアップ二回目で続行しようとするとエラーがでます。
Enable-PSRemoting
このようなエラーです。
Set-WSManQuickConfig : Unable to check the status of the firewall. At line:69 char:17 + Set-WSManQuickConfig -force + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Set-WSManQuickConfig], InvalidOperationException + FullyQualifiedErrorId : WsManError,Microsoft.WSMan.Management.SetWSManQuickConfigCommand
Unable to check the status of the firewall.とありますね? でもfirewallも有効ですし、プライベートネットワークに接続しています。 エラーをもう少し細かく見ましょう。 以下のコマンドを実行します。
Winrm get winrm/config
詳細がでましたが、エラーに関しては分かりにくいですね…
Config MaxEnvelopeSizekb = 500 MaxTimeoutms = 60000 MaxBatchItems = 32000 MaxProviderRequests = 4294967295 Client NetworkDelayms = 5000 URLPrefix = wsman AllowUnencrypted = false Auth Basic = true Digest = true Kerberos = true Negotiate = true Certificate = true CredSSP = false DefaultPorts HTTP = 5985 HTTPS = 5986 TrustedHosts 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 = false Auth Basic = false Kerberos = true Negotiate = true Certificate = false CredSSP = false CbtHardeningLevel = Relaxed DefaultPorts HTTP = 5985 HTTPS = 5986 IPv4Filter = * IPv6Filter = * EnableCompatibilityHttpListener = false EnableCompatibilityHttpsListener = false CertificateThumbprint AllowRemoteAccess = true Winrs AllowRemoteShellAccess = true IdleTimeout = 7200000 MaxConcurrentUsers = 10 MaxShellRunTime = 2147483647 MaxProcessesPerShell = 25 MaxMemoryPerShellMB = 1024 MaxShellsPerUser = 30
別のコマンドを実行します。
winrm quickconfig
エラーの詳細がキッチリでました。
winrm : WSManFault At line:1 char:1 + winrm quickconfig + ~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (WSManFault:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError Message ProviderFault WSManFault Message = Unable to check the status of the firewall. Error number: -2147024894 0x80070002 The system cannot find the file specified.
Error number: -2147024894 WinRM
で検索すると、なんとMS文書番号が発行されていました。 これをダウンロードして、実行します。(再起動が求められます)
Windows リモート管理 (WinRM) は Windows Server 2008 または Windows Vista を実行しているコンピューター上の 16 KB を超える HTTP 承認要求を受け付けません
再起動後に、再度挑戦することで成功しました。
Enable-PSRemoting
まとめ
まずは、PSRemotingを有効にするための基本でした。 これで、そのPCに対して-ComputerNameや-Credentialによる管理PCでの制御が出来るようになりましたね!
参考サイト
Error executing Enable-PSRemoting or Set-WSManQuickConfig on XP Home An Introduction to WinRM Basics How to Create a Firewall Exception CTP3: Reenable remoting a firewall problem