PowerShellInvoke-Commandを使用してリモートコンピューターでスクリプトを実行する
この記事では、Invoke-Commandの使用方法を学習します。 PowerShellコマンドまたはスクリプトをリモートで実行するためのコマンドレット。 PowerShellを使用して、ネットワーク内の1台以上のコンピューターでコマンドをリモートで実行できます。 Invoke-Commandコマンドレットは、 PowerShell Remotingのリモート管理機能を使用しています 。 PowerShell Remotingを使用すると、 WinRMを介してコンピューター上のPowerShellセッションにリモートで接続できます。 (Windowsリモート管理)サービスと管理用のWebサービス (WS-Management)プロトコル。このサービスは、リモートPowerShellセッションを確立してコードを実行する機能を提供します。
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.
このコマンドは、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
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
接続に使用しているコンピューターでNTLM認証を正しく機能させるには、さらにいくつかの操作を行います。WinRMのSSL証明書を発行するか、ホスト名/IPアドレスを信頼できるホストのリストに追加します。
Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.201
または、すべてのコンピュータへの接続を許可することもできます(NTLMの欠点の1つであり、相互認証をサポートしていないため、お勧めしません)。
Set-Item wsman:\localhost\Client\TrustedHosts -value *
同じ設定をリモートホストに適用する必要があります。
信頼できるホストのリストを表示するには、次のコマンドを実行します。
Get-Item WSMan:\localhost\Client\TrustedHosts
変更を適用するには、WinRMを再起動します:
Restart-Service WinRM
Invoke-Commandを使用してPowerShellコマンドをリモートで実行する方法
Invoke-Commandコマンドレットを使用すると、1台以上のリモートコンピューターでコマンドを実行できます。
たとえば、リモートコンピュータで単一のコマンドを実行するには、次を使用します。
Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}
このコマンドは、リモートコンピューターにインストールされているPowerShellのバージョンを表示します。この名前は-ComputerName
で指定されています。 パラメータ。 -ScriptBlock {[cmdlet]}
にリモートコンピューターで実行するコマンドを入力します ブロック。
デフォルトでは、Invoke-Commandを介して送信されたコマンドは、リモートコンピューター上の現在のユーザーとして実行されます。別のユーザーとして実行する場合は、ユーザーの資格情報をリクエストして変数に保存します:
$cred = Get-Credential
Invoke-Command -ComputerName dc01 -Credential $cred -ScriptBlock {Get-NetAdapter}
このPowerShellコマンドは、リモートコンピューター上のネットワークインターフェイスのリストを表示します。
ScriptBlockには、セミコロンで区切って複数のコマンドを入力できます。たとえば、次のコマンドは現在のタイムゾーンを表示し、別のタイムゾーンに変更します。
Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name "Central Europe Standard Time”}
を選択します
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}
コンピューターのリストを変数(配列)に配置できます:
$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
複数のコンピューターでInvoke-Commandを使用してコマンドを実行すると、同時に実行されます。 Invoke-Commandには、同時に管理されるコンピューターの最大数に制限があります(同時PSSessionの数に制限があります)。この制限は、 ThrottleLimitで設定されます パラメータ(デフォルト値は32)。 32台を超えるコンピューター(128台など)でコマンドを実行する場合は、–ThrottleLimit 128
を使用します。 (ただし、多数のPSSessionを確立するには、コンピューターの負荷が高くなります)。
バックグラウンドでInvoke-Commandを使用してリモートコンピューターでコマンドを実行するには、特別な属性–AsJob
使用されている。その後、コマンドの結果はコンソールに返されません。結果を取得するには、受信ジョブを使用します コマンドレット。
-
PowerShellを使用してWindows10コンピューターをリモートで再起動する方法
時々、特に、システム管理者はサーバーまたはシステムを再起動する必要があります。通常、グラフィカルユーザーインターフェイス( PowerShell )を使用して、Windows10をリモートシャットダウンまたは再起動できます。 コンピュータをリモートで再起動するためのいくつかの方法を提供します。この投稿では、6つの既知の方法の概要を説明します。 PowerShellを使用してWindows10をリモートで再起動する方法 これらの方法の前提条件は、リモートシステムに接続し、必要に応じて認証できることを確認することです。また、リモートシステムが再起動を保留していないことを確認する必要がありま
-
ユーザーのログオン、ログオフ、起動、およびシャットダウン時に、最初にWindowsPowerShellスクリプトを実行します
WindowsPowerShellスクリプトを実行する場合 最初にユーザーのログオン、ログオフ、起動、およびシャットダウンで、これがあなたがしなければならないことです。ローカルグループポリシーエディターとレジストリエディターを使用して、PowerShell以外のスクリプトよりもWindowsPowerShellスクリプトに優先順位を付けることができます。 ユーザーがログオンするか、コンピューターを起動すると、すべてのスクリプトが同時に実行されます。起動や特定のプログラムの実行に遅延が生じる可能性があります。多くの場合、PowerShell以外のスクリプトの前に実行するには、すべてのWindo