「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
リモートコンピューターでPowerShellのコマンドを実行する方法についてまとめる。
# Sessionを指定すれば処理中のジョブ等に再接続することも可能。
Invoke-Command を使って、リモートでコマンド実行ができます。
1. PowerShellリモート処理を有効にする
Enable-PSRemoting
Enable-PSRemoting は、PowerShellを使ってリモートからコマンド実行できるように、以下の様な構成変更をまとめて行います。
解放しすぎる場合は(任意のIPアドレスで..など)、範囲を調整する必要があるか、検討ください。
リモートから実行の可否を制御するには、ユーザーと権限(後述)、または、
ファイルウォール例外("Windows リモート管理 (HTTP 受信)")のスコープ設定で行います。
2. PowerShellリモート処理可能なユーザーと権限の設定
Set-PSSessionConfiguration Microsoft.Powershell -ShowSecurityDescriptorUI
実行すると権限を設定する画面が表示されるので、リモートから指定するユーザーと権限を追加。
(Administratorsメンバー以外のユーザーを使用する場合に必要)
1. WinRM サービスを開始
Start-Service WinRM
WinRMサービスを開始していなければ実行します。
2. UACのリモート設定
Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name LocalAccountTokenFilterPolicy -Value 1 -Type DWord (上は、行を折り返しています、1行のコマンドです。)
管理者特権を維持するように設定変更します。
これをしないと、下の wsman:localhost\client\trustedhosts の設定が出来ません。
3. 対象のコンピュータを 信頼されたホストの一覧に追加
set-item wsman:localhost\client\trustedhosts -value リモートコンピュータ名
リモートコンピュータ名 が複数ある場合は、"リモートコンピュータ名,リモートコンピュータ名" の様に 文字列にして , で繋ぎます。
依存の設定値に追加する場合は、get-item で値を確認し、 , で連結して設定します。
※ LocalAccountTokenFilterPolicy? と wsman:localhost\client\trustedhosts の関係について。
wsman:localhost\client\trustedhosts を設定するためには、以下の条件があります。
- 管理者実行のコマンドプロンプト(PowerShell) で行う場合は、LocalAccountTokenFilterPolicy? を 1 にする
- ビルトイン Administrator で行う場合は、 LocalAccountTokenFilterPolicy? の変更は不要
- wsman:localhost\client\trustedhosts を設定した後は、LocalAccountTokenFilterPolicy? を 0 に戻しても構いません。
(LocalAccountTokenFilterPolicy? を 0 に戻してもすぐには設定不可能に戻りません。その場合はWinRMサービスを再起動します。)
1. Invoke-Command を実行
Invoke-Command -ComputerName リモートコンピュータ名 -Credential (get-credential) -ScriptBlock { リモートコマンド リモートコマンド引数... } (上は、行を折り返しています、1行のコマンドです。)
(get-credential) によって、ユーザー名を入力する画面が開きます。
-Credential (get-credential) を指定しないと、Invoke-Command を実行しているユーザーで、リモートコンピュータへ接続し、コマンド実行されます。
ユーザー名を入力したくない場合は、 get-credential を先に行って、変数に入れておくか、-Credential を指定しないようにします。
上の Workgroup編では、リモートコマンドの中から、他サーバーのリソースにアクセスすると、匿名ユーザーが使用されますが、
下の手順の様に、ダブルホップを使用することで、-credential で指定するものと同じアカウントで 他サーバーのリソースにアクセスすることができます。
1. Enable-PSRemoting 2. Set-PSSessionConfiguration Microsoft.Powershell -ShowSecurityDescriptorUI
1. Start-Service WinRM 2. Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name LocalAccountTokenFilterPolicy -Value 1 -Type DWord (上は、行を折り返しています、1行のコマンドです。) 3. set-item wsman:localhost\client\trustedhosts -value リモートコンピュータ名
1. Enable-WSManCredSSP -Role Server
2. Enable-WSManCredSSP -Role Client -DelegateComputer リモートコンピュータ名
3. gpedit.msc コマンド コンピューターの構成 >> 管理用テンプレート >> システム >> 資格情報の委任 NTLMのみのサーバー認証で新しい資格情報の委任を許可する (x) 有効 サーバーを一覧に追加: [表示] wsman/リモートコンピュータ名
4. Invoke-Command に -Authentication CredSSP を付けてを実行 Invoke-Command -ComputerName リモートコンピュータ名 -Credential (get-credential) -ScriptBlock { cmd.exe /c "dir \\リソースサーバー\ファイル共有" } -Authentication CredSSP (上は、行を折り返しています、1行のコマンドです。 -ScriptBlock { ... } の中は例です。)
-credential で指定する ユーザーおよびパスワード は、リモートコンピュータ名 と リソースサーバー の両方に共通なものを作成しておきます。
上の例で \\リソースサーバー\ファイル共有 の共有フォルダは、指定する ユーザー で参照権限を設定しておきます。
リモートコンピュータ上のユーザーは、Administrators でなくてもかまいません。リモートコマンドの内容に応じて 権限を付加してください。
Tags: :シェル, :インフラストラクチャ, :Windows