Home > Windows にまつわる e.t.c.

ワークグループ環境の Windows Server 2016 への Enter-PSSession がエラーになる問題対応


Windows Server 2012 R2 以前の OS であれば、ワークグループ環境であっても Enable-PSRemoting -Force しておけば、Enter-PSSession 出来ていたのですが、ワークグループ環境 Windows Server 2016 では Enable-PSRemoting -Force が有効に機能しないので Windows ファイアウォールが開かれず、Enter-PSSession が出来ません。

 

WinRM のファイアウォールを開く

GUI でファイアウォール設定を追加しても良いのですが、PowerShell でファイアウォール設定を追加する場合は New-NetFirewallRule を使います。

WinRM のファイアウォール設定を追加する場合は以下の要領です。

New-NetFirewallRule -DisplayName [表示名] -Profile Any -Direction Inbound -Action Allow -RemoteAddress [接続元 IP(カンマ区切り)] -Protocol TCP -LocalPort 5985,5986

 

例えば 172.16.3.0/24 からの接続を許可する場合は、以下のようにします

New-NetFirewallRule -DisplayName "WinRM from Lan" -Profile Any -Direction Inbound -Action Allow -RemoteAddress 172.16.3.0/24 -Protocol TCP -LocalPort 5985,5986

 

Administrator 以外がエラーになる対応

Administrator というアカウントは特殊なアカウントなので、WinRM のファイアウォールを開くだけで Enter-PSSession 出来るようになりますが、Administrators メンバーに追加した他のアカウントで Enter-PSSession しようとすると以下のようなエラーになってしまいます。
(クラック対策で Administrator を Disable にする運用しているとこのケースに引っかかります)

PS C:\> Enter-PSSession 172.24.58.51 -Credential admin
Enter-PSSession : リモート サーバー 172.24.58.51 への接続に失敗し、次のエラー メッセージが返されました: アクセスが拒否されました。
詳細については、about_Remote_Troubleshooting のヘルプ トピックを参照してください。
発生場所 行:1 文字:1
+ Enter-PSSession 172.24.58.51 -Credential admin
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (172.24.58.51:String) [Enter-PSSession]、PSRemotingTransportException
    + FullyQualifiedErrorId : CreateRemoteRunspaceFailed

 

これは、Enable-PSRemoting -Force が設定してたリモート UAC の無効化が出来ていないからです。

リモート UAC の無効化はレジストリを直接変更しても良いのですが、Set-WSManQuickConfig -Force の方がスマートなので、コマンドレットで設定するのがお勧めです。
(今までレジストリ編集していたのですが、参考情報にある Ask CORE の blog でコマンドレット紹介されたのでレジストリ編集を止めたのはナイショ w)

Set-WSManQuickConfig -Force

 

Set-WSManQuickConfig -Force ではなく、レジストリでセットするのなら、以下のようにします。

New-ItemProperty -Name LocalAccountTokenFilterPolicy -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -PropertyType DWord -Value 1 -Force

 

まとめ

ワークグループ環境の Windows Server 2016 で Enter-PSSession するには、Enable-PSRemoting -Force ではなく、Set-WSManQuickConfig -Force コマンドレットを使います。

更に WinRM(TCP/5985,5986) のファイアウォールは別途開ける必要があります。

関数にまとめるとこんな感じですね

#############################################################
# PowerSehll リモーティングを有効にする
#############################################################
function EnablePSRemoting($RemoteAddress){
    ### リモート接続許可
    Set-WSManQuickConfig -Force

    ### WinRM ファイアウォール open
    $DisplayName = "WinRM from Manage"

    # 既に設定が入っているか確認
    [array]$Result = Get-NetFirewallRule -DisplayName $DisplayName -ErrorAction SilentlyContinue

    # 既に設定が入っていたら全削除(複数入っているケース対応)
    $MaxIndex = $Result.Count
    for($i =0; $i -lt $MaxIndex; $i++){
        Remove-NetFirewallRule -DisplayName $DisplayName -Confirm:$false
    }

    # ファイアウォール ルール 追加
    New-NetFirewallRule -DisplayName $DisplayName -Profile Any -Direction Inbound -Action Allow -RemoteAddress $RemoteAddress -Protocol TCP -LocalPort 5985,5986
}

 

New-NetFirewallRule の -RemoteAddress に渡す値は文字列配列なので、複数指定する場合は以下のように文字列配列を渡します。

# IP アドレスを文字列配列に格納する
$RemoteAddress = @("172.16.3.0/24", "fd75:f582:7ae3::/64")

# 文字列配列を関数に渡す
EnablePSRemoting $RemoteAddress

 

参考情報

WMF 5.1 をインストールしたサーバー OSで Enable-PSRemoting が動作しない | Ask CORE
https://blogs.technet.microsoft.com/askcorejp/2017/06/26/enablepsremoringwmf5/

リモート コンピューターの対話操作(Enter-PSSession)
http://www.vwnet.jp/Windows/PowerShell/EnterPSSession.htm

リモート コンピューターのバッチ操作(Invoke-Command)
http://www.vwnet.jp/Windows/PowerShell/InvokeCommand.htm

リモート コンピューターのパラレル バッチ操作(Invoke-Command -AsJob)
http://www.vwnet.jp/Windows/PowerShell/Invoke-CommandAsJob.htm

関数を PowerShell プロンプトで実行する
http://www.vwnet.jp/Windows/PowerShell/2016100401/UseFunctionInPsPrompt.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.