次の方法で共有


Invoke-Command

ローカルとリモートのコンピューターでコマンドを実行します。

構文

Invoke-Command [-ScriptBlock] <scriptblock> [[-ComputerName] <string[]>] [-ApplicationName <string>] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-CertificateThumbprint <string>] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-Port <int>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-UseSSL] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-ComputerName] <string[]>] [-ApplicationName <string>] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-Port <int>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-UseSSL] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-Session] <PSSession[]>] [-AsJob] [-HideComputerName] [-JobName <string>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-ConnectionURI] <Uri[]>] [-AllowRedirection] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [[-Session] <PSSession[]>] [-AsJob] [-HideComputerName] [-JobName <string>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [[-ConnectionURI] <Uri[]>] [-AllowRedirection] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-CertificateThumbprint <string>] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

説明

Invoke-Command コマンドレットは、ローカル コンピューターまたはリモート コンピューターでコマンドを実行し、エラーも含め、コマンドからのすべての出力を返します。単一の Invoke-Command コマンドを使用して、複数のコンピューターでコマンドを実行できます。

リモート コンピューターで単一のコマンドを実行するには、ComputerName パラメーターを使用します。データを共有する一連の関連コマンドを実行するには、リモート コンピューター上に PSSession (固定接続) を作成し、Invoke-Command の Session パラメーターを使用して PSSession でコマンドを実行します。

ローカル コンピューター上で Invoke-Command を使用して、スクリプト ブロックの文字列をコマンドとして評価または実行することもできます。Windows PowerShell はスクリプト ブロックをコマンドに変換し、コマンド ラインに文字列のエコーを表示する代わりに、現在のスコープ内でコマンドを即座に実行します。

Invoke-Command を使用してリモート コンピューターでコマンドを実行する前に、「about_Remote」を参照してください。

パラメーター

-AllowRedirection

この接続を代替 URI にリダイレクトできます。

ConnectionURI パラメーターを使用すると、リモートの配信先は別の URI にリダイレクトするための命令を返すことができます。既定では、Windows PowerShell は接続をリダイレクトしませんが、ユーザーは AllowRedirection パラメーターを使用して接続のリダイレクトを許可できます。

また、$PSSessionOption preference 変数の MaximumConnectionRedirectionCount property プロパティ、または SessionOption パラメーターの値の MaximumConnectionRedirectionCount プロパティを設定することにより、接続をリダイレクトする回数を制限することもできます。既定値は 5 です。詳細については、SessionOption パラメーターの説明と、New-PSSessionOption コマンドレットのヘルプ トピックを参照してください。

必須

false

位置

named

既定値

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-ApplicationName <string>

接続 URI のアプリケーション名セグメントを指定します。ConnectionURI パラメーターをコマンド内で使用しない場合は、このパラメーターを使用してアプリケーション名を指定します。

既定値は、ローカル コンピューターの $PSSessionApplicationName ユーザー設定変数の値です。この設定変数を定義しない場合、既定値は WSMAN になります。この値はほとんどのユーザーに適しています。詳細については、「about_Preference_Variables」を参照してください。

WinRM サービスは、アプリケーション名を使用して接続要求を処理するリスナーを選択します。このパラメーターの値は、リモート コンピューターにあるリスナーの URLPrefix プロパティの値と一致する必要があります。

必須

false

位置

named

既定値

WSMAN

パイプライン入力を許可する

true (ByPropertyName)

ワイルドカード文字を許可する

false

-ArgumentList <Object[]>

コマンドのローカル変数の値を指定します。コマンドの変数は、リモート コンピューターでのコマンドの実行前にこれらの値で置換されます。値をコンマ区切り一覧で入力します。値は、一覧されている順に変数に関連付けられます。ArgumentList のエイリアスは "Args" です。

ArgumentList の値は、"1024" などの実際の値にすることも、"$max" などのローカル変数の参照にすることもできます。

コマンドでローカル変数を使用するには、次のコマンド形式を使用します。

{param($<名前 1>[, $<名前 2>]...)<ローカル変数を持つコマンド>} -ArgumentList <値 | $ローカル変数>

"param" キーワードには、コマンドで使用するローカル変数を列挙します。ArgumentList パラメーターには、変数を列挙した順にその値を指定します。

必須

false

位置

named

既定値

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-AsJob

リモート コンピューター上でバックグラウンド ジョブとしてコマンドを実行します。完了に時間のかかるコマンドを実行するには、このパラメーターを使用します。

AsJob を使用すると、ジョブを表すオブジェクトが返され、その後コマンド プロンプトが表示されます。ジョブが完了しても、引き続きセッションで作業できます。ジョブを管理するには、Job コマンドレットを使用します。ジョブの結果を取得するには、Receive-Job を使用します。

AsJob パラメーターの動作は、Invoke-Command を使用してリモートから Start-Job コマンドを実行する場合と似ています。ただし、AsJob では、ジョブは、リモート コンピューターで実行されますが、ローカル コンピューターで作成され、リモート ジョブの結果が自動的にローカル コンピューターに返されます。

Windows PowerShell のバックグラウンド ジョブの詳細については、「about_Jobs」および「about_Remote_Jobs」を参照してください。

必須

false

位置

named

既定値

なし

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-Authentication <AuthenticationMechanism>

ユーザーの資格情報の認証に使用するメカニズムを指定します。有効な値は、Default、Basic、Credssp、Digest、Kerberos、Negotiate、および NegotiateWithImplicitCredential です。既定値は Default です。

CredSSP 認証は、Windows Vista、Windows Server 2008、およびそれ以降のバージョンの Windows でのみ使用できます。

このパラメーターの値の詳細については、MSDN で System.Management.Automation.Runspaces.AuthenticationMechanism 列挙体の説明を参照してください。

注意: ユーザーの資格情報が認証対象のリモート コンピューターに渡される、資格情報のセキュリティ サービス プロバイダー (CredSSP) 認証は、リモート ネットワーク共有にアクセスする場合など、複数のリソースの認証を必要とするコマンドを対象としています。このメカニズムを使用すると、リモート操作のセキュリティ リスクが高まります。リモート コンピューターのセキュリティが低下している場合は、そのリモート コンピューターに渡される資格情報を使用してネットワーク セッションを制御できます。

必須

false

位置

named

既定値

Default

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-CertificateThumbprint <string>

この処理を実行するアクセス許可を持つユーザー アカウントのデジタル公開キー証明書 (X509) を指定します。証明書の拇印を入力します。

証明書は、クライアント証明書ベースの認証で使用されます。これらはローカル ユーザー アカウントにのみマッピングできます。ドメイン アカウントでは機能しません。

証明書の拇印を取得するには、Windows PowerShell Cert: ドライブで Get-Item または Get-ChildItem コマンドを使用します。

必須

false

位置

named

既定値

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-ComputerName <string[]>

コマンドが実行されるコンピューターを指定します。既定値はローカル コンピューターです。

ComputerName パラメーターを使用すると、Windows PowerShell は、指定されたコマンドを実行するためにのみ使用した後で閉じられる一時接続を作成します。固定接続が必要な場合、Session パラメーターを使用します。

コンマ区切り一覧にある 1 台または複数のコンピューターの NETBIOS 名、IP アドレス、または完全修飾ドメイン名を入力します。ローカル コンピューターを指定するには、コンピューター名、「localhost」、またはドット (.) を入力します。

ComputerName パラメーターの値に IP アドレスを使用するには、コマンドに Credential パラメーターを含める必要があります。また、コンピューターが HTTPS トランスポート用に構成されているか、リモート コンピューターの IP アドレスがローカル コンピューター上の WinRM TrustedHosts リストに含まれている必要があります。コンピューター名を TrustedHosts リストに追加する方法については、「about_Remote_Troubleshooting」の「How to Add a Computer to the Trusted Host List (コンピューターを信頼されたホストの一覧に追加する方法)」を参照してください。

注: Windows Vista 以降のバージョンの Windows で、ローカル コンピューターを ComputerName パラメーターの値に含めるには、Windows PowerShell を開くときに [管理者として実行] を指定する必要があります。

必須

false

位置

1

既定値

パイプライン入力を許可する

true (ByPropertyName)

ワイルドカード文字を許可する

false

-ConfigurationName <string>

新しい PSSession に使用するセッション構成を指定します。

構成名またはセッション構成の完全修飾リソース URI を入力します。構成名のみを指定すると、スキーマ URI "https://schemas.microsoft.com/powershell" が先頭に付加されます。

セッションのセッション構成は、リモート コンピューター上にあります。指定したセッション構成がリモート コンピューター上に存在しない場合、コマンドは失敗します。

既定値は、ローカル コンピューターの $PSSessionConfigurationName ユーザー設定変数の値です。この設定変数を設定しない場合、既定値は Microsoft.PowerShell になります。詳細については、「about_preference_variables」を参照してください。

必須

false

位置

named

既定値

https://Schemas.Microsoft.com/PowerShell/Microsoft.PowerShell

パイプライン入力を許可する

true (ByPropertyName)

ワイルドカード文字を許可する

false

-ConnectionURI <Uri[]>

接続エンドポイントを定義する URI (Uniform Resource Identifier) を指定します。URI は完全修飾名でなければなりません。

この文字列の形式は次のとおりです。

<Transport>://<ComputerName>:<Port>/<ApplicationName>

既定値は次のとおりです。

https://localhost:80/WSMAN

URI のトランスポート セグメントの有効な値は HTTP および HTTPS です。ConnectionURI を指定しない場合、UseSSL、ComputerName、Port、および ApplicationName パラメーターを使用して URI 値を指定できます。

対象のコンピューターが接続を別の URI にリダイレクトする場合、コマンドで AllowRedirection パラメーターを使用しない限り、Windows PowerShell によってリダイレクトが防止されます。

必須

false

位置

1

既定値

https://localhost:80/wsman

パイプライン入力を許可する

true (ByPropertyName)

ワイルドカード文字を許可する

false

-Credential <PSCredential>

この処理を実行するアクセス許可を持つユーザー アカウントを指定します。既定値は現在のユーザーです。

"User01"、"Domain01\User01" などのユーザー名を入力するか、Get-Credential コマンドレットで生成されるような PSCredential オブジェクトが含まれた変数を入力します。ユーザー名を入力すると、パスワードの入力を促すメッセージが表示されます。

必須

false

位置

named

既定値

パイプライン入力を許可する

true (ByPropertyName)

ワイルドカード文字を許可する

false

-FilePath <string>

1 つまたは複数のリモート コンピューターで、指定されたローカル スクリプトを実行します。スクリプトのパスとファイル名を入力するか、パイプを使用してスクリプト パスを Invoke-Command に渡します。スクリプトは、ローカル コンピューター上またはローカル コンピューターがアクセスできるディレクトリ内に保存されている必要があります。スクリプトのパラメーターの値を指定するには、ArgumentList パラメーターを使用します。

このパラメーターを使用すると、Windows PowerShell は、指定されたスクリプト ファイルの内容をスクリプト ブロックに変換し、そのスクリプト ブロックをリモート コンピューターに送信して、リモート コンピューター上で実行します。

必須

true

位置

2

既定値

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-HideComputerName

出力表示から各オブジェクトのコンピューター名を除外します。既定では、オブジェクトを生成したコンピューターの名前が画面に表示されます。

このパラメーターは出力表示にのみ影響します。オブジェクトは変更されません。

必須

false

位置

named

既定値

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-InputObject <psobject>

コマンドへの入力を指定します。オブジェクトが格納されている変数を入力するか、オブジェクトを取得するコマンドまたは式を入力します。

InputObject を使用する場合、ScriptBlock パラメーターの値に $input 自動変数を使用して入力オブジェクトを表します。

必須

false

位置

named

既定値

パイプライン入力を許可する

true (ByValue)

ワイルドカード文字を許可する

false

-JobName <string>

バックグラウンド ジョブのフレンドリ名を指定します。既定では、ジョブには "Job<n>" という名前が付けられます。<n> は序数です。このパラメーターは、AsJob パラメーターと共に使用した場合にのみ有効です。

コマンドで JobName パラメーターを使用し、コマンドをジョブとして実行した場合、コマンドに AsJob パラメーターを含めていなくても、Invoke-Command によって、ジョブ オブジェクトが返されます。

Windows PowerShell のバックグラウンド ジョブの詳細については、「about_Jobs」を参照してください。

必須

false

位置

named

既定値

Job<n>

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-Port <int>

このコマンドで使用するリモート コンピューター上のネットワーク ポートを指定します。既定値はポート 80 (HTTP ポート) です。

代替ポートを使用する前に、リモート コンピューター上でそのポートをリッスンするための WinRM リスナーを構成する必要があります。リスナーを構成するには、Windows PowerShell プロンプトで次の 2 つのコマンドを入力します。

remove-item -path wsman:\Localhost\listener\listener* -recurse

new-item -path wsman:\Localhost\listener -Transport http -Address * -port <port-number>

必要がない限り、Port パラメーターを使用しないでください。コマンドに設定されたポートは、すべてのコンピューターまたはコマンドが実行されるセッションに適用されます。代替ポート設定によって、すべてのコンピューターでのコマンドの実行が妨げられている可能性があります。

必須

false

位置

named

既定値

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-ScriptBlock <scriptblock>

実行するコマンドを指定します。コマンドを中かっこ ({ }) で囲み、スクリプト ブロックを作成します。このパラメーターは必須です。

既定では、コマンドの変数はリモート コンピューターで評価されます。コマンドにローカル変数を含めるには、ArgumentList パラメーターを使用します。

必須

true

位置

1

既定値

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-Session <PSSession[]>

指定された Windows PowerShell セッション (PSSession) でコマンドを実行します。PSSessions を格納する変数を入力するか、New-PSSession コマンドや Get-PSSession コマンドなど、PSSessions を作成または取得するコマンドを入力します。

PSSession を作成すると、Windows PowerShell はリモート コンピューターに対する固定接続を確立します。PSSession を使用して、データを共有する一連の関連コマンドを実行します。単一のコマンドまたは一連の関連のないコマンドを実行するには、ComputerName パラメーターを使用します。

PSSession を作成するには、New-PSSession コマンドレットを使用します。詳細については、「about_PSSessions」を参照してください。

必須

false

位置

1

既定値

パイプライン入力を許可する

true (ByPropertyName)

ワイルドカード文字を許可する

false

-SessionOption <PSSessionOption>

セッションの詳細オプションを設定します。New-PSSessionOption コマンドレットを使用して作成する SessionOption オブジェクトを入力します。

$PSSessionOption 設定変数の値が設定されている場合、オプションの既定値はこの値によって決まります。それ以外の場合、セッションではシステムの既定値が使用されます。

既定値を含め、セッション オプションの詳細については、New-PSSessionOption コマンドレットのヘルプ トピックを参照してください。$PSSessionOption 設定変数の詳細については、「about_Preference_Variables」を参照してください。

必須

false

位置

named

既定値

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-ThrottleLimit <int>

このコマンドを実行するために確立できる最大同時接続数を指定します。このパラメーターを省略した場合、または値 0 を入力した場合は、既定値の 32 が使用されます。

スロットル制限は現在のコマンドのみに適用され、セッションまたはコンピューターには適用されません。

必須

false

位置

named

既定値

32

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

-UseSSL

Secure Sockets Layer (SSL) プロトコルを使用してリモート コンピューターとの接続を確立します。既定では、SSL は使用されません。

WS-Management では、ネットワーク上で送信されるすべての Windows PowerShell コンテンツが暗号化されます。UseSSL は、HTTP ではなく HTTPS を使用してデータを送信する追加の保護機能です。

このパラメーターを使用するが、コマンドに使用されるポートで SSL が利用できない場合、コマンドは失敗します。

必須

false

位置

named

既定値

パイプライン入力を許可する

false

ワイルドカード文字を許可する

false

<CommonParameters>

このコマンドレットは、次の共通パラメーターをサポートします: -Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer、および -OutVariable。詳細については、次を参照してください: about_Commonparameters.

入力と出力

入力値の型は、コマンドレットへのパイプが可能なオブジェクトの型です。戻り値の型は、コマンドレットによって返されるオブジェクトの型です。

入力

System.Management.Automation.ScriptBlock

パイプを使用してスクリプト ブロックのコマンドを Invoke-Command に渡すことができます。$input 自動変数を使用して、コマンドの入力オブジェクトを表します。

出力

System.Management.Automation.PSRemotingJob または呼び出されたコマンドの出力

AsJob パラメーターが使用された場合、Invoke-Command はジョブ オブジェクトを返します。それ以外の場合は、呼び出されたコマンドの出力 (ScriptBlock パラメーターの値) を返します。

-- Windows Vista 以降のバージョンの Windows で、Invoke-Command の ComputerName パラメーターを使用してローカル コンピューターでコマンドを実行するには、Windows PowerShell を開くときに [管理者として実行] を指定する必要があります。

-- 複数のコンピューターでコマンドを実行する場合、Windows PowerShell は一覧に示された順序でコンピューターに接続します。ただし、コマンドの出力はリモート コンピューターから受信した順序で表示されるため、この順序と異なる場合があります。

-- Invoke-Command により実行されるコマンドで発生したエラーは、コマンドの結果に含まれます。ローカル コマンドで終了エラーとなるエラーは、リモート コマンドでは未終了エラーとして扱われます。この処理方法により、1 つのコンピューター上の終了エラーによってコマンドが実行されるすべてのコンピューターでコマンドが終了することが避けられます。この方法は、リモート コマンドを単一のコンピューターで実行する場合にも使用されます。

-- ローカル コンピューターが信頼するドメインにリモート コンピューターが属していない場合は、コンピューターでユーザーの資格情報を認証できない場合があります。WS-Management の "信頼されたホスト" の一覧にリモート コンピューターを追加するには、WSMAN プロバイダーで次のコマンドを使用します。<Remote-Computer-Name> はリモート コンピューターの名前です。

set-item -path wsman:\Localhost\Client\TrustedHosts -value <Remote-Computer-Name>.

例 1

C:\PS>invoke-command -filepath c:\scripts\test.ps1 -computerName Server01

Disks: C:, D:, E:
Status: Warning, Normal, Normal

説明
-----------
このコマンドは、Server01 コンピューターで Test.ps1 スクリプトを実行します。

このコマンドは FilePath パラメーターを使用して、ローカル コンピューターにあるスクリプトを指定します。このスクリプトはリモート コンピューターで実行され、結果はローカル コンピューターに返されます。





例 2

C:\PS>invoke-command -computername server01 -credential domain01\user01 -scriptblock {get-culture}

説明
-----------
このコマンドは、Server01 リモート コンピューターで Get-Culture コマンドを実行します。

このコマンドは、ComputerName パラメーターを使用してコンピューター名を指定し、Credential パラメーターを使用してコマンドの実行権限のあるユーザー "Domain01\User01" のセキュリティ コンテキストでコマンドを実行します。また、ScriptBlock パラメーターを使用して、リモート コンピューターで実行するコマンドを指定します。

応答として、Windows PowerShell は、User01 アカウントのパスワードと認証方法を要求するダイアログ ボックスを表示します。その後、Server01 コンピューターでコマンドを実行して、その結果を返します。





例 3

C:\PS>$s = new-pssession -computername server02 -credential domain01\user01

C:\PS> invoke-command -session $s -scriptblock {get-culture}

説明
-----------
この例では、Server02 リモート コンピューターのセッション (固定接続) で同じ "Get-Culture" コマンドを実行します。通常、セッションは、リモート コンピューターで一連のコマンドを実行する場合にのみ作成します。

最初のコマンドは、New-PSSession コマンドレットを使用して Server02 リモート コンピューターでセッションを作成します。次に、そのセッションを $s 変数に保存します。

2 番目のコマンドは、Invoke-Command コマンドレットを使用して、Server02 上で Get-Culture コマンドを実行します。このコマンドは、Session パラメーターを使用して、$s 変数に保存されたセッションを指定します。

応答として、Windows PowerShell は Server02 コンピューター上のセッションでコマンドを実行します。





例 4

C:\PS>invoke-command -computername Server02 -scriptblock {$p = get-process powershell}

C:\PS> invoke-command -computername Server02 -scriptblock {$p.virtualmemorysize}
C:\PS>

C:\PS> $s = new-pssession -computername Server02
C:\PS> invoke-command -session $s -scriptblock {$p = get-process powershell}
C:\PS> invoke-command -session $s -scriptblock {$p.virtualmemorysize}
17930240

説明
-----------
この例は、Invoke-Command の ComputerName パラメーターと Session パラメーターを使用した結果を比較しています。また、同じデータを共有する一連のコマンドを実行するためにセッションを使用する方法を示しています。

最初の 2 つのコマンドは、Invoke-Command の ComputerName パラメーターを使用して、Server02 リモート コンピューター上でコマンドを実行します。最初のコマンドは、Get-Process コマンドを使用して、リモート コンピューターの PowerShell プロセスを取得して $p 変数に保存します。2 番目のコマンドは、PowerShell プロセスの VirtualMemorySize プロパティの値を取得します。

最初のコマンドは成功しますが、2 番目のコマンドは失敗します。ComputerName パラメーターが使用された場合、Windows PowerShell はコマンドを実行するためにのみ接続を作成するからです。コマンドが完了すると、接続を閉じます。$p 変数は 1 つの接続に作成されていますが、2 番目のコマンド用に作成された接続には存在しません。

この問題を解決するには、リモート コンピューターにセッション (持続的な接続) を作成し、そのセッションで両方の関連コマンドを実行します。

3 番目のコマンドは、New-PSSession コマンドレットを使用して Server02 コンピューターでセッションを作成します。次に、そのセッションを $s 変数に保存します。4 番目と 5 番目のコマンドは、最初のセットで使用した一連のコマンドを繰り返しますが、この場合、Invoke-Command コマンドは Session パラメーターを使用して、同じセッションで両方のコマンドを実行します

この場合、同じセッションで両方のコマンドが実行されるため、コマンドは正常に実行され、$p の値は後で使用できるように $s セッションでアクティブのままになります。





例 5

C:\PS>$command = { get-eventlog -log "windows powershell" | where {$_.message -like "*certificate*"} }

C:\PS> invoke-command -computername S1, S2 -scriptblock $command

説明
-----------
この例は、ローカル変数に保存するコマンドの入力方法を示しています。

ローカル変数にコマンド全体が保存されている場合、その変数を ScriptBlock パラメーターの値として指定することができます。ローカル変数の値を送信するために "param" キーワードまたは ArgumentList 変数を使用する必要はありません。

最初のコマンドは、Get-Eventlog コマンドを $command 変数に保存します。コマンドはスクリプト ブロックとして書式設定されます。

2 番目のコマンドは、Invoke-Command コマンドレットを使用して、S1 および S2 リモート コンピューターで $command のコマンドを実行します。





例 6

C:\PS>invoke-command -computername server01, server02, TST-0143, localhost -configurationname MySession.PowerShell -scriptblock {get-eventlog "windows powershell"}

説明
-----------
この例は、Invoke-Command コマンドレットを使用して、複数のコンピューター上で単一のコマンドを実行する方法を示しています。

このコマンドは、ComputerName パラメーターを使用してコンピューターを指定します。コンピューター名はコンマ区切り一覧で指定します。コンピューターの一覧には、ローカル コンピューターを表す "localhost" 値が含まれます。

このコマンドは、Windows PowerShell の代替セッション構成の指定には ConfigurationName パラメーターを、コマンドの指定には ScriptBlock パラメーターをそれぞれ使用します。

この例で、スクリプト ブロック内のコマンドは、各リモート コンピューター上の Windows PowerShell イベント ログのイベントを取得します。





例 7

C:\PS>$version = invoke-command -computername (get-content machines.txt) -scriptblock {(get-host).version}

説明
-----------
このコマンドは、200 台のリモート コンピューターで実行中の Windows PowerShell ホストのバージョンを取得します。

1 つのコマンドのみが実行されているため、各コンピューターへの固定接続 (セッション) を作成する必要はありません。代わりに、このコマンドは ComputerName パラメーターを使用してコンピューターを指定します。

このコマンドは、Invoke-Command コマンドレットを使用して Get-Host コマンドを実行します。また、ドット表記を使用して、Windows PowerShell ホストの Version プロパティを取得します。

このコマンドは、Get-Content コマンドレットを使用して Machine.txt ファイル (コンピューター名のファイル) の内容を取得し、コンピューターを指定します。

これらのコマンドは同期して (一度に 1 つずつ) 実行されます。コマンドが完了すると、すべてのコンピューターからのコマンドの出力が変数 $version に保存されます。出力には、データの生成元のコンピューター名が含まれています。





例 8

C:\PS>$s = new-pssession -computername Server01, Server02

C:\PS> invoke-command -session $s -scriptblock {get-eventlog system} -AsJob

Id   Name    State      HasMoreData   Location           Command
---  ----    -----      -----         -----------        --------             -------
1    Job1    Running    True          Server01,Server02  get-eventlog system


C:\PS> $j = Get-Job

C:\PS> $j | format-list -property *

HasMoreData   : True
StatusMessage :
Location      : Server01,Server02
Command       : get-eventlog system
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : e124bb59-8cb2-498b-a0d2-2e07d4e030ca
Id            : 1
Name          : Job1
ChildJobs     : {Job2, Job3}
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
StateChanged  :

C:\PS> $results = $j | Receive-Job

説明
-----------
これらのコマンドは、2 台のリモート コンピューターでバックグラウンド ジョブを実行します。Invoke-Command コマンドは AsJob パラメーターを使用するため、コマンドはリモート コンピューターで実行しますが、実際にはジョブはローカル コンピューターに存在し、結果はローカル コンピューターに送信されます。

最初のコマンドは、New-PSSession コマンドレットを使用して、Server01 リモート コンピューターと Server02 リモート コンピューターでセッションを作成します。

2 番目のコマンドは、Invoke-Command コマンドレットを使用して、各セッションでバックグラウンド ジョブを実行します。また、AsJob パラメーターを使用して、バックグラウンド ジョブとしてコマンドを実行します。このコマンドは、2 台のリモート コンピューター上でそれぞれ実行されるジョブに対応する 2 つの子ジョブ オブジェクトを含むジョブ オブジェクトを返します。

3 番目のコマンドは、Get-Job コマンドレットを使用して、$j 変数にジョブ オブジェクトを保存します。

4 番目のコマンドは、パイプライン演算子 (|) を使用して $j 変数の値を Format-List コマンドレットに送ります。これにより、ジョブ オブジェクトのすべてのプロパティが一覧表示されます。

5 番目のコマンドは、ジョブの結果を取得します。このコマンドは、パイプを使用して $j のジョブ オブジェクトを Receive-Job コマンドレットに渡し、その結果を $results 変数に保存します。





例 9

C:\PS>$MWFO-LOg = Microsoft-Windows-Forwarding/Operational

C:\PS> invoke-command -computername server01 -scriptblock {param($log, $num) get-eventlog -logname $log -newest $num} -ArgumentList $MWFO-log, 10

説明
-----------
この例は、リモート コンピューターで実行されるコマンドにローカル変数の値を含める方法を示しています。

最初のコマンドは、Microsoft-Windows-Forwarding/Operational イベント ログの名前を $MWFO-Log 変数に保存します。

2 番目のコマンドは、Invoke-Command コマンドレットを使用して、Server01 リモート コンピューターで Get-EventLog コマンドを実行します。このコマンドは、Server01 上の Microsoft-Windows-Forwarding/Operational イベント ログから最新のイベント 10 件を取得します。

このコマンドは "param" キーワードを使用して、2 つの変数 $log と $num を作成します。これらの変数は、Get-EventLog コマンドでプレースホルダーとして使用されます。これらのプレースホルダーの名前は、値を提供するローカル変数の名前に一致する必要はなく、任意の名前を使用できます。

ArgumentList パラメーターの値は、引数一覧の値を指定する 2 つの異なる方法を示します。$log プレースホルダーの値は $MFWO-Log 変数です。この変数は最初のコマンドで定義されます。$num 変数の値は 10 です。

コマンドがリモート コンピューターに送信される前に、変数は指定された値で置換されます。





例 10

C:\PS>invoke-command -computername S1, S2 -scriptblock {get-process powershell} 

PSComputerName    Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
--------------    -------  ------    -----      ----- -----   ------     --   -----------
S1                575      15        45100      40988   200     4.68     1392 powershell
S2                777      14        35100      30988   150     3.68     67   powershell


C:\PS> invoke-command -computername S1, S2 -scriptblock {get-process powershell} -HideComputerName

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
-------  ------    -----      ----- -----   ------     --   -----------
575      15        45100      40988   200     4.68     1392 powershell
777      14        35100      30988   150     3.68     67   powershell

説明
-----------
この例は、Invoke-Command の HideComputerName パラメーターを使用した結果を示しています。

最初の 2 つのコマンドは、Invoke-Command コマンドレットを使用して、PowerShell プロセスに対して Get-Process コマンドを実行します。最初のコマンドの出力には、コマンドが実行されたコンピューターの名前を格納した PsComputerName プロパティが含まれています。HideComputerName パラメーターを使用する 2 番目のコマンドの出力には、PsComputerName 列は含まれていません。

HideComputerName パラメーターを使用すると、オブジェクトは変更されません。影響を受けるいずれかのオブジェクトの PsComputerName プロパティを表示するために、Format コマンドレットを使用することもできます。





例 11

C:\PS>invoke-command -comp (get-content servers.txt) -filepath c:\scripts\sample.ps1 -argumentlist Process, Service

説明
-----------
この例では、Invoke-Command コマンドレットを使用して、Servers.txt ファイルに示されているすべてのコンピューター上で Sample.ps1 スクリプトを実行します。このコマンドは、FilePath パラメーターを使用してスクリプト ファイルを指定します。このコマンドを使用すると、スクリプト ファイルがリモート コンピューターにアクセスできない場合でも、リモート コンピューターでスクリプトを実行することができます。

このコマンドを送信すると、Sample.ps1 ファイルの内容がスクリプト ブロックにコピーされ、スクリプト ブロックが各リモート コンピューターで実行されます。この手順は、ScriptBlock パラメーターを使用してスクリプトの内容を送信した場合と同じです。





例 12

C:\PS>$LiveCred = Get-Credential

C:\PS> Invoke-Command -ConfigurationName Microsoft.Exchange `
         -ConnectionUri https://ps.exchangelabs.com/powershell `
         -Credential $LiveCred  -Authentication Basic `
         -scriptblock {Invoke-Command {Set-Mailbox dan -DisplayName "Dan Park"}

説明
-----------
この例は、URI (インターネット アドレス) によって識別されるリモート コンピューターでコマンドを実行する方法を示しています。この例では、リモートの Exchange サーバーで Set-Mailbox コマンドを実行します。コマンドのバッククォート文字 (`) は、Windows PowerShell の連結文字です。

最初のコマンドは、Get-Credential コマンドレットを使用して、Windows Live ID の資格情報を $LiveCred 変数に保存します。資格情報ダイアログ ボックスが表示されたら、Windows Live ID の資格情報を入力します。

2 番目のコマンドは、Invoke-Command コマンドレットを使用して Set-Mailbox コマンドを実行します。このコマンドは、ConfigurationName パラメーターを使用して、Microsoft.Exchange セッション構成を使用したセッションでコマンドを実行するように指定します。ConnectionURI パラメーターは、Exchange サーバーのエンドポイントの URL を指定します。

資格情報パラメーターは、$LiveCred 変数に保存されている Windows Live の資格情報を指定します。AuthenticationMechanism パラメーターは、基本認証の使用を指定します。ScriptBlock パラメーターは、コマンドが含まれるスクリプト ブロックを指定します。





例 13

C:\PS>$max = New-PSSessionOption -MaximumRedirection 1

C:\PS> Invoke-Command -ConnectionUri https://ps.exchangelabs.com/powershell `
         -scriptblock {Invoke-Command {Get-Mailbox dan} `
         -AllowRedirection -SessionOption $max

説明
-----------
この例は、AllowRedirection パラメーターと SessionOption パラメーターを使用して、リモートのコマンドで URI リダイレクトを管理する方法を示しています。

最初のコマンドは New-PSSessionOption コマンドレットを使用して、$max 変数に保存する PSSessionOpption オブジェクトを作成します。このコマンドは MaximumRedirection パラメーターを使用して、PSSessionOption オブジェクトの MaximumConnectionRedirectionCount プロパティを 1 に設定します。

2 番目のコマンドは、Invoke-Command コマンドレットを使用して、Microsoft Exchange Server を実行しているリモート サーバーで Get-Mailbox コマンドを実行します。このコマンドは、AllowRedirection パラメーターを使用して、代替エンドポイントへ接続をリダイレクトするための明示的な許可を提供します。また、SessionOption パラメーターを使用して、$max 変数内のセッション オブジェクトも指定します。

その結果、ConnectionURI パラメーターによって指定されたリモート コンピューターがリダイレクト メッセージを返すと Windows PowerShell は接続をリダイレクトしますが、新しい接続先が別のリダイレクト メッセージを返すとリダイレクト回数の値が 1 を超え、Invoke-Command によって未終了エラーが返されます。





例 14

C:\PS>$so = New-PSSessionOption -SkipCACheck

PS C:\> invoke-command $s { get-hotfix } -SessionOption $so -credential server01\user01

説明
-----------
この例は、SessionOption パラメーターの作成方法と使用方法を示しています。

最初のコマンドは、New-PSSessionOption コマンドレットを使用してセッションのオプションを作成します。このコマンドは、結果の SessionOption オブジェクトを $so パラメーターに保存します。

2 番目のコマンドは、Invoke-Command コマンドレットを使用して、リモートから Get-Hotfix コマンドを実行します。SessionOption パラメーターの値は、$so 変数の SessionOption オブジェクトです。





例 15

C:\PS>enable-wsmanCredSSP -delegate server02

C:\PS> connect-wsman Server02

C:\PS> set-item wsman:\server02*\service\auth\credSSP -value $true

C:\PS> $s = new-pssession server02

C:\PS> invoke-command -session $s -script {get-item \\Net03\Scripts\LogFiles.ps1} -authentication credssp -credential domain01\admin01

説明
-----------
この例は、リモート セッション内からネットワーク共有にアクセスする方法を示しています。

このコマンドを使用するには、ローカル コンピューターのクライアント設定とリモート コンピューターのサービス設定で CredSSP 委任を有効にする必要があります。この例のコマンドを実行するには、ローカル コンピューターとリモート コンピューターで Administrators グループのメンバーであることが必要です。

最初のコマンドは Enable-WSManCredSSP コマンドレットを使用して、Server01 ローカル コンピューターから Server02 リモート コンピューターへの CredSSP 委任を有効にします。これによってローカル コンピューターに CredSSP クライアント設定が構成されます。

2 番目のコマンドは、Connect-WSMan コマンドレットを使用して Server02 コンピューターに接続します。この操作によって、Server02 コンピューターのノードがローカル コンピューターの WSMan: ドライブに追加されるので、Server02 コンピューターで WS-Management の設定の表示と変更が可能になります。

3 番目のコマンドは、Set-Item コマンドレットを使用して Server02 コンピューターの Service ノードの CredSSP 項目の値を True に変更します。この操作によって、リモート コンピューターのサービス設定で CredSSP が有効になります。

4 番目のコマンドは、New-PSSession コマンドレットを使用して Server02 コンピューターで PSSession セッションを作成します。PSSession は $s 変数に保存されます。

5 番目のコマンドは、Invoke-Command コマンドレットを使用して $s のセッションで Get-Item コマンドを実行し、Net03\Scripts ネットワーク共有からスクリプトを取得します。このコマンドは Credential パラメーターを使用し、CredSSP という値と共に Authentication パラメーターを使用します。





関連項目

概念

about_Remote
about_PSSessions
New-PSSession
Get-PSSession
Remove-PSSession
Enter-PSSession
Exit-PSSession
WSMan Provider