2015/08/31

Windows Server 2016 TP3 > システムロケールと FailoverClusters モジュール問題(の真相)


Windows Server 2016 Technical Preview 3 には、Failover Clustering の Windows PowerShell モジュール (RSAT-Clustering-PowerShell) が読み込まれず、Failover Clustring のコマンドレット (Get-Cluster や Test-Cluster など)が全滅になる問題があります。




SE の雑記さんの以下の記事でも指摘されています。

TP3 の ワークグループ環境での WSFC の構築

実はこの問題、システム ロケールが[日本語(日本)](ja-jp)だと発生するのですが、[英語(米国)](en-us)だと発生しません。ちなみに、他の言語については知りません。Azure 仮想マシンで評価している場合は、Azure 仮想マシンの既定のシステムロケールが en-us なので問題に遭遇しません。


原因は、C:\Windows\System32\WindowsPowerShell\v1.0\modules\FailoverClusters\Microsoft.FailoverClusters.PowerShell.psm1の 74-75 行目と 96 行目に、英語環境だと認識できて、日本語環境では認識できない不適切なダブルコーテーション(“”)が使われているから。

同じ Microsoft.FailoverClusters.PowerShell.psm1 をシステム ロケール  ja-jp の環境で開くと、こんな感じに。フォント環境によっては □ でなく ・ みたいに表示される場合もあります。

システム ロケール ja-jp でこの問題を回避するには、Microsoft.FailoverClusters.PowerShell.psm1 の 74-75 行目と 96 行目を次のように修正して上書き保存します。75行目の消えた改行も復活してあげましょう。

72: Function ShowError {
73: Param ([string] $Message)
74:     $Message = $Message + " - cmdlet was cancelled"
75:     Write-Error $Message -ErrorAction Stop
76: }

95: If (-not (Get-Command -Module FailoverClusters)) {
96:     ShowError("Wrong OS Version - Need at least Windows Server 2012 R2 or Windows 8.1. You are running '" + $OS.Name + "'")
97: }


ですが、このファイルの所有者は TrustedInstaller さんで、Administrator さんには書き込み権限がなく、上書き保存しようとするとアクセスが拒否されます。所有者を Administrator に変更して、Administrator さんにフルコントロールを与えてあげれば、上書き保存できます。

Server Core インストールの環境だと、所有権の取得やアクセス許可の設定をコマンドラインからやることになりますが、こんな感じで出来ると思います。所有権の変更方法は、こちら (Hey, Scripting Guy! Windows PowerShell を使用してファイルの所有者を特定する方法はありますか)をパクらせていただきました。※ドメインのAdministratorで操作する場合は、Administrator を <ドメイン名>\Administrator に置き換えてください。

PS> cd C:\Windows\System32\WindowsPowerShell\v1.0\modules\FailoverClusters
PS> $objUser = New-Object System.Security.Principal.NTAccount("Administrator") 
PS> $objFile = Get-Acl .\Microsoft.FailoverClusters.PowerShell.psm1
PS> $objFile.SetOwner($objUser) 
PS> Set-Acl -aclobject $objFile -path .\Microsoft.FailoverClusters.PowerShell.psm1
(ここまでは takeown /f .\Microsoft.FailoverClusters.PowerShell.psm1 でも OK)

PS> cacls .\Microsoft.FailoverClusters.PowerShell.psm1 /E /G Administrator:F
(Administrator: フル コントロールを追加)

PS> $objUser = New-Object System.Security.Principal.NTAccount("NT Service\TrustedInstaller") 
PS> $objFile = Get-Acl .\Microsoft.FailoverClusters.PowerShell.psm1
PS> $objFile.SetOwner($objUser) 
PS> Set-Acl -aclobject $objFile -path .\Microsoft.FailoverClusters.PowerShell.psm1
(所有権を TrustedInstaller さんに戻してあげる)

PS> notepad .\Microsoft.FailoverClusters.PowerShell.psm1
(変更して上書き保存)

この問題、システム ロケールが ja-jp な RSAT for Windows 10 の環境でも発生しますのでご注意ください。

追記)
管理者として開いたコマンドプロンプトで次のように操作すれば、ファイルの所有権やアクセス許可の変更をしなくてもいけます。

C:\Windows\System32> mkdir C:\work
(一時フォルダーの作成) 
C:\Windows\System32> cd WindowsPowerShell\v1.0\modules\FailoverClusters
C:\..\FailoverClusters> copy Microsoft.FailoverClusters.PowerShell.psm1 c:\work\
(.psm1を編集用にコピー)
C:\..\FailoverClusters> copy Microsoft.FailoverClusters.PowerShell.psm1 c:\work\Microsoft.FailoverClusters.PowerShell.bak
(念のためバックアップ) 
C:\..\FailoverClusters> notepad C:\work\Microsoft.FailoverClusters.PowerShell.psm1
(ここで変更して上書き保存)

C:\..\FailoverClusters> robocopy C:\work\ .\ Microsoft.FailoverClusters.PowerShell.psm1 /B

(Robocopy のバックアップ モードで編集後のファイルをコピー)




 

1 件のコメント:

注: コメントを投稿できるのは、このブログのメンバーだけです。