PowerShellのリモートコマンドで共有フォルダなどを参照する

PowerShellでは、Invoke-Commandや、Enter-PSSessionなどリモートホストの操作が非常に簡単に出来ますが、 デフォルトではリモート接続先から更にリモートコンピューターへのアクセスが制限されています。

例えば、

Invoke-Command -ComputerName $some_computer {
    Get-Content "\\file_server\share\hoge.txt"
}

などとした時に、アクセス権があるはずなのに"アクセスが拒否されました"とエラーが出力されます。

これはWindowsがこういった接続(second hop)に制限を設けている事で発生します。これを回避する為の機能としてCredSSPという、権限の委任を許可したり許可してもらったりといった機能が存在しますので、それを有効にします。

CredSSPの有効化

# リモート接続元ホスト側で実行
Enable-WSManCredSSP -Role Client -DelegateComputer 192.168.0.* Force

# リモート接続先ホスト側で実行
Enable-WSManCredSSP -Role Server -Force

尚、Hyper-Vホストはデフォルトインストールの状態で有効になっています。

CredSSPを有効にしたリモートコマンド例

CredSSPを有効にする場合は -Credential-Authentication CredSSPオプションが必要です。

$cred = Get-Credential
Invoke-Command -ComputerName $some_computer `
-Credential $cred -Authentication CredSSP {
    Get-Content "\\file_server\share\hoge.txt"
}

嬉しいこと

これによってPVMやらMPIの環境を整えなくてもPowerShellだけで簡単に並列分散処理が可能になります。 例えば、あるサーバーに保存されている大量のログ解析をこの仕組みで実施といったことを時々やったりします。

参考 : https://technet.microsoft.com/ja-jp/magazine/jj853299.aspx