リモート PowerShell への詳細な入門ガイド

PowerShell Remotingを使用して、快適なワークステーションからリモートマシンでPowerShellコマンドを実行したいことはありますか?リモートPowerShellを使用すると、複数のリモートシステムでコマンドやスクリプトを持続可能な方法で実行できます。

興味がありますか?PowerShellの方法でリモートマシンを制御する方法を学ぶために続けて読んでください。

前提条件

このチュートリアルは実演形式で行われます。一緒に進めたい場合は、PowerShell 7が搭載された少なくとも3台のコンピュータを準備してください。1台は管理コンピュータであり、他の2台はリモートマシンです。

このチュートリアルでは、次のコンピュータが使用されます。

  • A Windows 10 PC with PowerShell 7 installed as the management computer. You will launch remote commands from this machine.
  • A Windows 10 PC with PowerShell 7 installed. This machine will be the endpoint for remote PowerShell over WinRM.
    • A user account on the remote Windows machine with local administrator rights. This tutorial uses a user account called ma.
  • LinuxマシンでSSHDを有効にして、リモートPowerShellエンドポイントとして機能させる。このチュートリアルではFedora 35を使用します。
    • Linuxマシンでリモートコマンドを実行するためのユーザーアカウント。アカウントにはsudoとSSHアクセスが必要です。このチュートリアルではtestというアカウントを使用します。まだアカウントがない場合は、この時点でユーザーアカウントを作成してください。

WinRMを使用したWindowsでのリモートPowerShellの有効化

PowerShell 7をインストールすると、PowerShellリモートを有効にするオプションがあります。すでに有効にしているかもしれませんが、確認するために以下の手順に従ってください。

1. リモートのWindows 10 PCにログインします。

2. 管理者としてPowerShellを開きます。

3. 以下のコマンドを実行してリモートPowerShellを有効にします。

Enable-PSRemoting

コマンドはいくつかの構成変更を実行します。これらはコンソールで確認できます。

Enabling Remote PowerShell on Windows over WinRM

Linux上のSSH経由でのリモートPowerShellの有効化

WinRMはWindows専用ですので、Linux上でリモートPowerShellを有効にすることはできません。代わりに、Linux上でSSH経由でリモートPowerShellを有効にすることができます。PowerShellを既にインストール済みと仮定して、以下の手順に従ってください。

1. リモートLinuxシステムにログインし、ターミナルセッションを開きます。

2. SSHサーバーの設定ファイルをテキストエディターで開きます。Gedit、Sublime、またはNanoなどのテキストエディターをお選びください。この例ではGeditを使用します。

sudo nano /etc/ssh/sshd_config

3. 次に、以下の行をファイルに追加します。この行は、PowerShellプロセスをホストするSSHサブシステムを作成します。

Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
Create an SSH subsystem for PowerShell on Linux

4. エディターを閉じます。

5. 最後に、次のコマンドを実行してSSHサーバーを再起動します。

sudo systemctl restart sshd

ローカルマシンでリモートPowerShellの信頼できるホストを追加する

この時点で、リモートコンピューターはコマンドを受け取る準備が整っています。ただし、管理コンピューターはリモートPowerShellホストに接続を拒否する場合があります。その場合、リモートホストを信頼できるホストに追加する必要があります。

管理コンピューターで管理者としてPowerShellを開きます。

以下のwinrmコマンドを実行してください。このコマンドは、リモートWindows(192.168.8.107)およびLinux(192.168.8.171)マシンをコンピューターの信頼されたホストリストに追加します。

winrm set winrm/config/client '@{TrustedHosts=" 192.168.8.171,192.168.8.107"}'
Adding remote machines as Trusted Hosts

リモートコンピューターでコマンドを実行する

すべての準備が整ったら、このセクションでリモートマシン上でコマンドを実行します。

1. 管理コンピューターで新しいPowerShellセッションを開きます。

2. 次に、以下のInvoke-Commandコマンドを実行して、ユーザーmaとしてリモートマシンの最初の5つのサービスをリストします。 実行するコマンドは、ScriptBlockスイッチのブレース内に表示されます。

Invoke-Command `
    -ComputerName 192.168.8.107 `
    -Credential 'ma' `
    -ScriptBlock { Get-Process | Select-Object -First 5 }
Listing the processes on the remote PowerShell Windows host

3. リモートLinuxホストで同じ操作を行うには、代わりに以下のコマンドを実行します。 -HostName-ComputerNameに置き換わり、-UserName-ComputerNameに置き換わったことに注意してください。 これらのパラメーターは、Invoke-Commandコマンドレットに対してターゲットがSSHホストであることを示します。

Invoke-Command `
    -HostName 192.168.8.171 `
    -UserName 'test' `
    -ScriptBlock { Get-Process | Select-Object -First 5 }
Listing the processes on the remote PowerShell Linux host

リモートコンピューターでスクリプトを実行する

Invoke-Commandコマンドレットを使用して、リモートコンピューターでPowerShellスクリプトファイルを実行することもできます。ただし、-ScriptBlockパラメーターを指定する代わりに、スクリプトのローカルパスに続いて-FilePathパラメーターを指定します。

1. まず、ローカルコンピューターにnametime.ps1という名前のPowerShellスクリプトファイルを作成します。

2. スクリプトをお好みのスクリプトエディターで開き、次のコードを追加します。その後、ファイルを保存します。

# nametime.ps1
hostname
Get-Date
Create the PowerShell script

3. Invoke-Commandコマンドレットを-FilePathパラメーターと共に実行します。この-FilePathはスクリプトファイルを指すべきです。この例では、スクリプトファイルは同じ作業ディレクトリにあります。

# WinRMを介してリモートPowerShellでスクリプトを実行
Invoke-Command `
    -ComputerName 192.168.8.107 `
    -Credential 'ma' `
    -FilePath .\nametime.ps1

# SSHを介してリモートPowerShellでスクリプトを実行
Invoke-Command `
    -HostName 192.168.8.171 `
    -UserName 'test' `
    -FilePath .\nametime.ps1
Invoke a script on remote PowerShell hosts

対話的にリモートコンピューターを管理

前のセクションでは、リモートマシンで個々のコマンドを実行する方法を見ました。このセクションでは、リモートマシンで複数のコマンドをローカルと同様に実行できる対話セッションを開く方法を学びます。

1. Enter-PSSessionコマンドを実行して、192.168.8.107のマシンでユーザーmaとしてリモートセッションを開始します。

Enter-PSSession -ComputerName 192.168.8.107 -Credential ma

プロンプトに表示されるように、リモートユーザーアカウントのパスワードmaを入力してください。

Entering an interactive remote session

以下に示すように、新しいプロンプトが表示されます。角かっこ内のIPアドレスはリモートPowerShellホストを示します。

Viewing a remote prompt

3. 以下に示すようにdirコマンドで現在の作業ディレクトリのファイルをリスト表示します。セッション内で複数のPowerShellコマンドを実行できます。dir

dir

ディレクトリの内容が画面に表示されるはずです。スクリーンショットに示すように。

Linting the files on a remote machine

4. 完了したらExit-PSSessionコマンドレットを実行してセッションを終了します。

Exit-PSSession

終了すると、スクリーンショットに示すようにローカルのプロンプトに戻ります。

Exiting a remote session

切断および再接続のリモート PowerShell セッション

対話型セッションや一回限りのコマンドの代わりに、セッションを永続的に保存することが可能です。セッションを保存すると、コンテキストを失うことなくセッション間を切り替えることができます。このセクションでは、永続的なセッションの作成と管理方法を学びます。

1. リモートコンピューター192.168.8.107上でユーザーma-Credential)としてセッションを作成するには、New-PSSession コマンドレットを実行します。セッションを変数$varに保存します。以下はその方法です。

$var = New-PSSession -ComputerName 192.168.8.107 -Credential ma

2. 変数$varを実行してその内容を表示します。

$var

以下のように、RemoteMachine ComputerTypeStateOpenedに設定されたセッションオブジェクトが表示されるはずです。

Displaying the details of a session

3. $varに保存されたセッションに入るには、Enter-PSSession コマンドを実行します。

Enter-PSSession $var

すべてが正常な場合、プロンプトは追加の出力なしにリモートプロンプトに変更されます。以下に示すように。

Entering a persistent remote session

4. セッション内で変数$rem1を作成します。任意の変数名と識別子文字列を使用してください。この変数は後で同じセッションに接続しているかどうかを確認するために使用します。

$rem1 = "same session"

5. 以下のコマンドを実行してリモート PowerShell セッションを終了します。

Exit-PSSession
Disconnecting from a persistent remote session

6. リモート PowerShell セッションを再確立します。

Enter-PSSession $var

7. リモートセッションプロンプトで$rem1変数を実行してその値を表示します。

$rem1

前に設定した値を見る必要があります。リモートPowerShellセッションを終了する前に、同じセッションに再接続したことを確認します。

Viewing the value of a session variable

8. 次のようにセッションを再度終了するには、Exit-PSSession コマンドを実行します。

Exit-PSSession

9. 最後に、Invoke-Command を実行し、session スイッチを$var に設定して、同じリモートセッションでリモートマシンのホスト名を表示します。この方法は、単一のセッションに手動で接続、切断、再接続することなく、同じセッションでコマンドを実行する代替手段です。

Invoke-Command -Session $var -ScriptBlock {hostname}
Displaying the hostname of a remote machine

10. Remove-PSSession を実行して、$var に格納されたセッションを完全に削除します。

Remove-PSSession $var

結論

おめでとうございます!このチュートリアルの最後まで到達したことで、リモートPowerShellを使用してWindowsまたはLinuxシステムを管理する方法を学びました。このガイドは、足を濡らすことを目的としています。なぜリモートセッションでLinux上のPowerShellに深く入り込んでみませんか?

Source:
https://adamtheautomator.com/remote-powershell/