いまだに、よくcmdに比べてPowerShellのメリットは?と聞かれます。 業務経験上、最も嬉しいのはこれです。 イメージ的にはsshに近いものを個人的には感じています。
パラメータ1つでリモート先に対してもローカルと同等に扱うことができること。また、それに加えてこのメリットも。 GUIとCUIの違いを生かすにはこれが欠かせませんね。
パラメータ1つで同時に複数のリモート先に同一ジョブを実行できる他にもありますが……今回の記事は、このPowerShellでリモート接続するための準備について紹介します。
TechNetは
分かる人はこれでどうぞ。
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. Windows Firewallサービス
Windows Firewallが無効になっていたら自動にする手動でも可ですが推奨です。
先ほどの2の続きです。Windows 7 / 8共通です。
- 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サービスが無効になっていませんか? 有効にしてください
- ネットワーク接続がパブリックではありませんか?プライベートかドメインにしてください
- KBがでている可能性
3に関して説明します。
InvalidOperationException
Windows 7 Enterprise x64 Eng環境での経験です。 少しはまったので共有です。 Enable-PSRemotingのコマンド実行後のポップアップ2回目で続行しようとするとエラーがでます。
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文書番号が発行されていました。 これをダウンロードして、実行します。(再起動が求められます)
再起動後に、再度挑戦することで成功しました。
Enable-PSRemoting
まとめ
まずは、PSRemotingを有効にするための基本でした。 これで、そのPCに対して-ComputerNameや-Credentialによる管理PCでの制御が出来るようになりましたね!