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

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


Windows Server 2016 の場合、Administrator アカウントでの PowerShell リモート操作がデフォルトで許可されていますが、Administrator 以外(Administrators 権限を持っている場合でも)エラーになってしまいます。

Windows Server 2012 R2 以前の OS であれば、ワークグループ環境であっても Enable-PSRemoting -Force しておけば、リモート操作が出来ていたのですが、ワークグループ環境 Windows Server 2016 では Enable-PSRemoting -Force が有効に機能しません。

この問題を回避するには、Enable-PSRemoting -Force ではなく、Set-WSManQuickConfig -Force します。

 

WinRM ファイアウォール

Windows Server 2016 では、Default で WinRM のリモート接続が許可されていますが、ファイアウォールを調整をすることはよくあるので、ファイアウォール周りを整理しておきましょう。

全ての接続元からの WinRM を許可する場合

Windows Server 2016 のデフォルトで WinRM のポートは開いているのですが、何らかの理由でファイアウオールが閉じている場合は以下のようしてファイアウオールを開きます。

Set-NetFirewallRule -Name WINRM-HTTP-In-TCP -Enabled True
Set-NetFirewallRule -Name WINRM-HTTP-In-TCP-PUBLIC -Enabled True

 

GUI で設定する場合のファイアウオール名は以下になっています

Name 日本語名 英語名 プロファイル
WINRM-HTTP-In-TCP Windows Windows リモート管理 (HTTP 受信) Windows Remote Management (HTTP-In) ドメイン,プライベート
WINRM-HTTP-In-TCP-PUBLIC Windows リモート管理 (HTTP 受信) Windows Remote Management (HTTP-In) パブリック

 

特定接続元のみからの WinRM を許可する場合

接続元を絞りたいときには既定のファイアウオールを閉じて、接続元を絞ったファイアウオール設定をします。

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

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

Set-NetFirewallRule -Name WINRM-HTTP-In-TCP -Enabled False
Set-NetFirewallRule -Name WINRM-HTTP-In-TCP-PUBLIC -Enabled False
New-NetFirewallRule -DisplayName [表示名] -Profile Any -Direction Inbound -Action Allow -RemoteAddress [接続元 IP(カンマ区切り)] -Protocol TCP -LocalPort 5985

 

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

Set-NetFirewallRule -Name WINRM-HTTP-In-TCP -Enabled False
Set-NetFirewallRule -Name WINRM-HTTP-In-TCP-PUBLIC -Enabled False
New-NetFirewallRule -DisplayName "WinRM from Lan" -Profile Any -Direction Inbound -Action Allow -RemoteAddress 172.16.3.0/24 -Protocol TCP -LocalPort 5985

 

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 コマンドレットを使います。

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

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

    # 特性接続元のファイアウオール名
    $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
    }

    # ファイアウォール設定
    if( $RemoteAddress.Count -eq 0 ){
        # 全ての接続元からの WinRM 接続を許可
        Set-NetFirewallRule -Name WINRM-HTTP-In-TCP -Enabled True
        Set-NetFirewallRule -Name WINRM-HTTP-In-TCP-PUBLIC -Enabled True
    }
    else{
        # 特定接続元のみ WinRM を許可
        # Defaule のファイアウオールを閉じる
        Set-NetFirewallRule -Name WINRM-HTTP-In-TCP -Enabled False
        Set-NetFirewallRule -Name WINRM-HTTP-In-TCP-PUBLIC -Enabled False

        # 特性接続元のファイアウオールを作る
        New-NetFirewallRule -DisplayName $DisplayName -Profile Any -Direction Inbound -RemoteAddress $RemoteAddress -Action Allow -Protocol TCP -LocalPort 5985
    }
}

 

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.