Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

PowerShellInvoke-Commandを使用してリモートコンピューターでスクリプトを実行する

この記事では、Invoke-Commandの使用方法を学習します。 PowerShellコマンドまたはスクリプトをリモートで実行するためのコマンドレット。 PowerShellを使用して、ネットワーク内の1台以上のコンピューターでコマンドをリモートで実行できます。 Invoke-Commandコマンドレットは、 PowerShell Remotingのリモート管理機能を使用しています 。 PowerShell Remotingを使用すると、 WinRMを介してコンピューター上のPowerShellセッションにリモートで接続できます。 (Windowsリモート管理)サービスと管理用のWebサービス (WS-Management)プロトコル。このサービスは、リモートPowerShellセッションを確立してコードを実行する機能を提供します。

PowerShellリモーティング用のWinRMの構成

PowerShell Remotingは、HTTP(ポートTCP / 5985)またはHTTPS(ポートTCP / 5986)を使用してコンピューター間で通信します。デフォルトではHTTPプロトコルが使用されますが、このトラフィックでさえAES-56を使用して暗号化されます(ただし、中間者タイプの攻撃の脅威があります)。 KerberosまたはNTLM認証も使用できます。

WinRMは、接続するリモートコンピューターで実行されている必要があります。 WinRMサービスのステータスを確認します:

Get-Service -Name "*WinRM*" | fl

サービスが実行されていない場合は、開始します:

Enable-PSRemoting

WinRM has been updated to receive requests.
WinRM service started.
WinRM is already set up for remote management on this computer.

PowerShellInvoke-Commandを使用してリモートコンピューターでスクリプトを実行する

このコマンドは、WinRMサービスを開始し(そして自動的に開始するように設定し)、デフォルトのwinrm設定を設定し、Windowsファイアウォールに例外ルールを追加します。 Enable-PSRemoting –Force コマンドは、ユーザーにプロンプ​​トを表示せずにWinRMを有効にします。

次に、PowerShellRemotingを使用してリモートでコンピューターに接続できます。

ネットワークタイプがパブリックに設定されている場合、PowerShellRemotingはデフォルトでは機能しないことに注意してください 。次に、コマンドは次のエラーを返します。

Set-WSManQuickConfig : ... WinRM firewall exception will not work since one of the network connection types on this machine is set to Public. Change the network connection type to either Domain or Private and try again.

ネットワークの場所をプライベートに変更するか、次のコマンドを使用する必要があります:

Enable-PSRemoting –SkipNetworkProfileCheck.

また、パブリックネットワークでWinRMへのアクセスを許可するWindowsDefenderファイアウォールルールを有効にします。 GPOまたはPowerShellを使用してファイアウォールルールを有効にできます:

Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress Any

PowerShell Remotingを介してリモートコンピューターへの接続をテストするには、次のコマンドを実行します。

Test-WsMan compname1

PowerShellInvoke-Commandを使用してリモートコンピューターでスクリプトを実行する

Active Directoryドメインがない場合、またはIPアドレスによるPowerShell Remotingを介してコンピューターにアクセスする場合、この場合、認証にはNTLMプロトコルが使用されます。 NTLMを使用している場合、Invoke-Commandを実行しようとすると、次のエラーが表示されます。

[192.168.1.201] Connecting to remote server 192.168.1.102 failed with the following error message: The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: thetransport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. + FullyQualifiedErrorId: CannotUseIPAddress,PSSessionStateBroken

PowerShellInvoke-Commandを使用してリモートコンピューターでスクリプトを実行する

接続に使用しているコンピューターでNTLM認証を正しく機能させるには、さらにいくつかの操作を行います。WinRMのSSL証明書を発行するか、ホスト名/IPアドレスを信頼できるホストのリストに追加します。

Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.201

PowerShellInvoke-Commandを使用してリモートコンピューターでスクリプトを実行する

または、すべてのコンピュータへの接続を許可することもできます(NTLMの欠点の1つであり、相互認証をサポートしていないため、お勧めしません)。

Set-Item wsman:\localhost\Client\TrustedHosts -value *

同じ設定をリモートホストに適用する必要があります。

信頼できるホストのリストを表示するには、次のコマンドを実行します。

Get-Item WSMan:\localhost\Client\TrustedHosts

変更を適用するには、WinRMを再起動します:

Restart-Service WinRM

グループポリシーを使用してWinRMを有効にして構成することもできます。

Invoke-Commandを使用してPowerShellコマンドをリモートで実行する方法

Invoke-Commandコマンドレットを使用すると、1台以上のリモートコンピューターでコマンドを実行できます。

たとえば、リモートコンピュータで単一のコマンドを実行するには、次を使用します。

Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}

PowerShellInvoke-Commandを使用してリモートコンピューターでスクリプトを実行する

このコマンドは、リモートコンピューターにインストールされているPowerShellのバージョンを表示します。この名前は-ComputerNameで指定されています。 パラメータ。 -ScriptBlock {[cmdlet]}にリモートコンピューターで実行するコマンドを入力します ブロック。

デフォルトでは、Invoke-Commandを介して送信されたコマンドは、リモートコンピューター上の現在のユーザーとして実行されます。別のユーザーとして実行する場合は、ユーザーの資格情報をリクエストして変数に保存します:

$cred = Get-Credential
Invoke-Command -ComputerName dc01 -Credential $cred -ScriptBlock {Get-NetAdapter}

このPowerShellコマンドは、リモートコンピューター上のネットワークインターフェイスのリストを表示します。

PowerShellInvoke-Commandを使用してリモートコンピューターでスクリプトを実行する

ScriptBlockには、セミコロンで区切って複数のコマンドを入力できます。たとえば、次のコマンドは現在のタイムゾーンを表示し、別のタイムゾーンに変更します。

Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name "Central Europe Standard Time”}を選択します

PowerShellInvoke-Commandを使用してリモートコンピューターでスクリプトを実行する

Invoke-Commandを使用すると、個々のコマンドだけでなく、PowerShellスクリプトも実行できます。これを行うには、(-ScriptBlockの代わりに)-FilePath引数が使用されます。この場合、コンピューター上のローカルPS1スクリプトファイルへのパスを指定します(スクリプトファイルをターゲットのリモートコンピューターにコピーする必要はありません):

Invoke-Command -ComputerName DC01 -FilePath C:\PS\Scripts\CheckSMBversion.ps1

Invoke-Commandを使用して複数のコンピューターでコマンドを同時に実行する方法

Invoke-Commandを使用して、複数のリモートコンピューターでコマンドを並行して(同時に)実行できます。

最も単純なケースでは、PowerShellコマンドを実行するコンピューターの名前はコンマで区切られます。

Invoke-Command server1, server2, server3 -ScriptBlock {get-date}

PowerShellInvoke-Commandを使用してリモートコンピューターでスクリプトを実行する

コンピューターのリストを変数(配列)に配置できます:

$servers = @("server1","server2","server3")
Invoke-Command -ScriptBlock { get-date} -ComputerName $servers

または、テキストファイルから取得します:

Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName(Get-Content c:\ps\servers.txt)

AD for PowerShellモジュールからGet-ADComputerコマンドレットを使用して、AD内のコンピューターのリストを取得することもできます。

ドメイン内のすべてのWindowsServerホストでコマンドを実行するには、次のPowerShellコードを使用します。

$computers = (Get-ADComputer -Filter 'OperatingSystem -like "*Windows server*" -and Enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -ScriptBlock {Get-Date} -ErrorAction SilentlyContinue

コンピューターの電源がオフになっているか使用できない場合、SilentlyContinueパラメーターが原因でスクリプトが停止せず、他のコンピューターで引き続き実行されます。

結果がどのコンピューターからのものであるかを理解するには、PSComputerNamee環境変数を使用します。

$results = Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
$results | Select-Object PSComputerName, DateTime

PowerShellInvoke-Commandを使用してリモートコンピューターでスクリプトを実行する

複数のコンピューターでInvoke-Commandを使用してコマンドを実行すると、同時に実行されます。 Invoke-Commandには、同時に管理されるコンピューターの最大数に制限があります(同時PSSessionの数に制限があります)。この制限は、 ThrottleLimitで設定されます パラメータ(デフォルト値は32)。 32台を超えるコンピューター(128台など)でコマンドを実行する場合は、–ThrottleLimit 128を使用します。 (ただし、多数のPSSessionを確立するには、コンピューターの負荷が高くなります)。

バックグラウンドでInvoke-Commandを使用してリモートコンピューターでコマンドを実行するには、特別な属性–AsJob 使用されている。その後、コマンドの結果はコンソールに返されません。結果を取得するには、受信ジョブを使用します コマンドレット。


  1. PowerShellを使用してWindows10コンピューターをリモートで再起動する方法

    時々、特に、システム管理者はサーバーまたはシステムを再起動する必要があります。通常、グラフィカルユーザーインターフェイス( PowerShell )を使用して、Windows10をリモートシャットダウンまたは再起動できます。 コンピュータをリモートで再起動するためのいくつかの方法を提供します。この投稿では、6つの既知の方法の概要を説明します。 PowerShellを使用してWindows10をリモートで再起動する方法 これらの方法の前提条件は、リモートシステムに接続し、必要に応じて認証できることを確認することです。また、リモートシステムが再起動を保留していないことを確認する必要がありま

  2. ユーザーのログオン、ログオフ、起動、およびシャットダウン時に、最初にWindowsPowerShellスクリプトを実行します

    WindowsPowerShellスクリプトを実行する場合 最初にユーザーのログオン、ログオフ、起動、およびシャットダウンで、これがあなたがしなければならないことです。ローカルグループポリシーエディターとレジストリエディターを使用して、PowerShell以外のスクリプトよりもWindowsPowerShellスクリプトに優先順位を付けることができます。 ユーザーがログオンするか、コンピューターを起動すると、すべてのスクリプトが同時に実行されます。起動や特定のプログラムの実行に遅延が生じる可能性があります。多くの場合、PowerShell以外のスクリプトの前に実行するには、すべてのWindo