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 します。
Windows Server 2016 では、Default で 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) | パブリック |
接続元を絞りたいときには既定のファイアウオールを閉じて、接続元を絞ったファイアウオール設定をします。
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 というアカウントは特殊なアカウントなので、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 コマンドレットを使います。
関数にまとめるとこんな感じですね
|
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
Copyright © MURA All rights reserved.