読者です 読者をやめる 読者になる 読者になる

tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShellでリモートPCの操作を行うに為にEnable-PSRemotingをするための準備

PowerShell
いまだに、よくcmdに比べてPowerShellのメリットは?と聞かれます。 業務経験上、最も嬉しいのはこれです。 イメージ的にはsshに近いものを個人的には感じています。(tunnelについて突っ込んだひとはお静かにお願いします><)
パラメータ一つでリモート先に対してもローカルと同等に扱うことができること。
また、それに加えてこのメリットも。 GUIとCUIの違いを生かすにはこれが欠かせませんね。
パラメータ一つで同時に複数のリモート先に同一ジョブを実行できる
他にもありますが……今回の記事は、このPowerShellでリモート接続するための準備について紹介します。

TechNetは

分かる人はこれでどうぞ。
Enable-PSRemoting

PowerShellでのリモートコマンドを受けられるようにするとは

PowerShellには、接続ネットワークがPrivateWorkgroupの場合に、リモート越しにコマンドを受け取るための機構が備わっています。 ただしデフォルトでは機能が無効になっているため、、外部からのコマンドを受け付けれるように有効にする必要があります。

機能を有効にする際に何をしてるの?

実は、有効にするにはコマンド一発なのですが、前提となる条件を守っていないと有効にしようとした時にエラーが出ます。 そこで、有効にする際に実際にやっていることは何かを確認しましょう。
  1. WinRMサービスを開始します。
  2. WinRMサービスのスタートアップの種類を自動にします。
  3. どのIPアドレスからでも受け付けるためのリスナーを作成します。
  4. Windows FirewallにWS-Management traffic (httpのみ)の例外を作成します

コマンドを実行する前に確認しよう

コマンドはこの後紹介します。 その前に、コマンド実行時に極力エラーが起こらないように、先ほど紹介した機能を有効する際に行っていることを確認しましょう。 経験上、確認事項は以下です。
  1. WinRM(Windows Remote Management (WS-Management))サービスが無効になっていたら自動にする手動でも可ですが推奨)
  2. WinRMサービスを開始する。
  3. Firewallサービス(Windows Firewall)が無効になっていたら自動にする手動でも可ですが推奨)
  4. Firewall自体が無効になっていたら有効にする
  5. 自分が接続しているネットワークが、「プライベートネットワーク(Private network)」か「社内ネットワーク(Work network)」であることを確認する
順番に説明します。

1. WinRM(Windows Remote Management (WS-Management))サービスが無効になっていたら自動にする手動でも可ですが推奨)

確認方法は、Windows 7 / 8共通です。
  1. 「Win + R」を押す
  2. services.mscと入力してOKを選択
  3. Windows Remote Management を一覧から探し無効になっていないことを確認します。
  4. 無効になっていた場合は、右クリック => プロパティから、状態を自動にします。
WinRM Service

2. WinRMサービスを開始する。

先ほどの1の続きです。Windows 7 / 8共通です。
  1. Windows Remote Management が、停止になっていたら「サービスの開始」をおこないます。
WinRM Service

3. Firewallサービス(Windows Firewall)が無効になっていたら自動にする手動でも可ですが推奨)

先ほどの2の続きです。Windows 7 / 8共通です。
  1. 1. Windows Firewall が、停止になっていたら「サービスの開始」をおこないます。
Windows Firewall

4. 自分が接続しているネットワークが、「ホーム(Home network)」か「社内ネットワーク(Work network)」であることを確認する

  1. 「Win + R」を押す
  2. firewall.cplと入力してOKを選択
  3. 現在接続されているネットワークが、プライベートネットワークや社内ネットワークであることを確認します。
※パブリックネットワークに接続している、Firewallへのアクセス絵エラーがでて機能を有効にできません。 必ず、プライベートネットワーク か ドメインネットワークに接続していることを確認してください。
Firewall Status

Enable-PSRemotingを実行してみる

ここまで確認ができていれば、コマンドを実行してみましょう。

1. Powershell.exe か PowerShell ISE.exeを管理者として起動する。

必ず管理者として起動してください。 これは、Set-ExecutionPolicyの時と同様ですね。

2. 起動したPowerShell画面でEnable-PSRemotingを実行する。

PowerShellでのリモートコマンドを受けられるようにするコマンド、それはたった一文です。 実行してみましょう。
Enable-PSRemoting

3. WinRMクイック構成を有効にする(WinRM Quick Configuration)

コマンドを実行して正常に行くと、初めにこのようなポップアップがでます。(Windows 8) 全て続行を選択します。 Enable PS Remoting1 English OSの場合はこうです。 (Windows 7) Yes to Allを選択します。 Enable PS Remoting 2

4. Set-PSSessionConfiguration

自動的に連携コマンドレットが走り、再度ポップアップがでます。(Windows 8) 全て続行を選択します。 Enable PSRemoting 3 English OSの場合はこうです。 (Windows 7) Yes to Allを選択します。 Enable PSRemoting 4

完了

完了です。 エラーが出なかった人、良かったですね! ちなみに有効になっている状態で、再度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つ可能性があります。
  1. Windows Firewallサービスが無効になっていませんか?有効にしてください。
  2. ネットワーク接続がパブリックではありませんか?プライベートかドメインにしてください。
  3. 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