Operations Lab.

WinRMとProxy

leave a comment »

この Post は PowerShell Advent Calendar 2014 の 12/08 分です。

企業などでは Proxy サーバが存在している環境も多いかと思います。PowerShell Remoting / WinRM は(構成によりますが)接続に HTTP/HTTPS を使用する為、Proxy 設定の影響をうけます。

Internet Explorer などのブラウザは、WPAD (Web Proxy Auto Discovery) を用いた自動構成と WinHTTP の静的 Proxy 設定が同時に有効になっていた場合に WPAD を優先してくれます。一方、PowerShell (WinRM) は(デフォルトでは) WPAD や構成スクリプト(pacファイル)を処理できないため、ブラウザは接続できるのに PowerShell Remoting では接続できない、という事が起こりえます。

特に、Proxy 設定されているノート PC を外部に持ち出した場合は要注意です。

Proxy 関連で問題がある場合、以下の様になります。(Proxy サーバに依存する部分がありますので、参考情報です。)

WinRM を Proxy できない Proxy サーバが設定されている場合

※Proxy サーバのサービスポートへは接続できるが、Proxy できない状態。

PS C:\> New-PSSession -Credential $cred $target
New-PSSession : [sv01.example.local] リモート サーバー sv01.example.local への接続に失敗し、次のエラー メッセージ
が返されました: WinRM クライアントは、リモート WS-Management サービスから HTTP 状態コード 504 を受け取りました。詳細に
ついては、about_Remote_Troubleshooting のヘルプ トピックを参照してください。
発生場所 行:1 文字:1
+ New-PSSession -Credential $cred $target
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotin
   gTransportException
    + FullyQualifiedErrorId : -2144108273,PSSessionOpenFailed

Proxy サーバから target ホストに接続できない場合

※例えば、Proxy サーバ上で target ホストの名前解決ができなかったり、ルーティングが存在しない状態。

PS C:\> New-PSSession -Credential $cred $target
New-PSSession : [sv01.example.local] リモート サーバー sv01.example.local への接続に失敗し、次のエラー メッセージ
が返されました: 指定したリモート ホストへの接続は拒否されました。 このリモート ホストで WS-Management サービスが実行さ
れていて、適切なポートと HTTP URL で要求をリッスンするようにリモート ホストが構成されていることを確認してください。詳細
については、about_Remote_Troubleshooting のヘルプ トピックを参照してください。
発生場所 行:1 文字:1
+ New-PSSession -Credential $cred $target
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotin
   gTransportException
    + FullyQualifiedErrorId : CannotConnectWinRMService,PSSessionOpenFailed

Proxy サーバに接続できない場合

※Proxy ホストには到達できるが、Proxy サービスを提供するポートへ接続できない状態。

PS C:\> New-PSSession -Credential $cred $target
New-PSSession : [sv01.example.local] リモート サーバー sv01.example.local への接続に失敗し、次のエラー メッセージ
が返されました: クライアントは、要求で指定された接続先に接続できません。 接続先のサービスが実行されていて、要求を受け付
けられる状態であることを確認してください。 接続先で実行されている WS-Management サービス (通常は IIS または WinRM) に関
するログとドキュメントを参照してください。 接続先が WinRM サービスの場合は、リモート ホスト上で次のコマンドを実行して、
WinRM サービスを分析および構成してください: "winrm quickconfig" 詳細については、about_Remote_Troubleshooting のヘルプ ト
ピックを参照してください。
発生場所 行:1 文字:1
+ New-PSSession -Credential $cred $target
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotin
   gTransportException
    + FullyQualifiedErrorId : CannotConnect,PSSessionOpenFailed

※Proxy ホストへ到達すらできない場合は、以下のようになります。

PS C:\> New-PSSession -Credential $cred $target
New-PSSession : [sv01.example.local] リモート サーバー sv01.example.local への接続に失敗し、次のエラー メッセージ
が返されました: WinRM クライアントは、サーバー名を解決できないため、要求を処理できません。詳細については、about_Remote_
Troubleshooting のヘルプ トピックを参照してください。
発生場所 行:1 文字:1
+ New-PSSession -Credential $cred $target
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotin
   gTransportException
    + FullyQualifiedErrorId : ComputerNotFound,PSSessionOpenFailed

解決方法

Proxy の問題であれば Proxy 設定を修正すればよいのですが、環境によっては管理者に Proxy 設定をロックされているかもしれないですので、PowerShell 上で(ある程度)指定する方法を。

New-PSSessionOption コマンドレットを使用すると、PSSession を生成する際にパラメータを調整できます。

New-PSSessionOption [-ApplicationArguments <PSPrimitiveDictionary>] [-CancelTimeout <Int32>] [-Culture <CultureInfo>] [-IdleTimeout <Int32>] [-IncludePortInSPN] [-MaximumReceivedDataSizePerCommand <Int32>] [-MaximumReceivedObjectSize <Int32>] [-MaximumRedirection <Int32>] [-NoCompression] [-NoEncryption] [-NoMachineProfile] [-OpenTimeout <Int32>] [-OperationTimeout <Int32>] [-OutputBufferingMode <OutputBufferingMode>] [-ProxyAccessType <ProxyAccessType>] [-ProxyAuthentication <AuthenticationMechanism>] [-ProxyCredential <PSCredential>] [-SkipCACheck] [-SkipCNCheck] [-SkipRevocationCheck] [-UICulture <CultureInfo>] [-UseUTF16] [<CommonParameters>]

ProxyAccessType パラメータを指定することで、New-PSSession / Enter-PSSession 時に、WinRM サービスへプロキシ設定を渡すことができます。

-ProxyAccessType <ProxyAccessType>

Determines which mechanism is used to resolve the host name. Valid values are IEConfig, WinHttpConfig, AutoDetect, NoProxyServer and None. The default value is None.

ProxyAccessType に指定可能な値は以下の通りです。

  • AutoDetectProxy 構成を自動検出します。
  • IEConfigInternet Explore の Proxy 設定を使用します。
  • NoneProxy 情報を(明示的には)指定しません。WSMan など、下位(ベースとなっている)サービスに Proxy の解決を委任します。WinHTTP の設定はベースサービス側でも参照されるため、結果として WinHTTP などの Proxy 設定が利用されれる場合があります。
  • NoProxyServerProxy サーバを使用しません。(使用しないことを明示的に設定します。)
  • WinHttpConfigWinHTTP の Proxy 設定を使用します。

注:具体的なサーバを指定することはできません。

詳細は、MSDN に記載があります。

Proxy サーバ設定を迂回したい場合は、ProxyAccessType に NoProxyServer を設定します。

PS C:\> $options = New-PSSessionOption -ProxyAccessType NoProxyServer
PS C:\> New-PSSession -Credential $cred -SessionOption $options $target

 Id Name            ComputerName    State         ConfigurationName     Availability
 -- ----            ------------    -----         -----------------     ------------
 16 Session16       sv01.example... Opened        Microsoft.PowerShell     Available
広告

Written by kazu

2014/12/08 @ 12:52

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。