PowerShellリモーティング:プロのようにリモートコマンドを実行する

あなたがローカルでコマンドを実行する方法を学んだと仮定すると、リモート実行をマスターするための足掛かりです。PowerShell Remotingを使用すると、管理者はリモートシステムでコマンドやスクリプトを実行できます。

このガイドでは、Active Directory(AD)環境でPowerShell Remotingを設定および使用する方法を示します。机を離れることなく、ファイルの作成、スクリプトの実行、または構成の確認をリモートで行うことを想像してみてください。

PowerShell Remotingを設定して使用して、自信を持ってリモートシステムでスクリプトを実行しましょう!

標準ユーザー向けにPowerShell Remotingを設定する

PowerShell Remotingの利点を十分に活用する前に、必要な権限が整っていることを確認する必要があります。コマンドやスクリプトをリモートで実行するには、特にセキュリティが優先されるActive Directory環境では、適切な構成が重要です。

まず、Invoke-Commandを使用してリモートサーバー(SRV2)に接続しようとしてみてください。次のコマンドは、リモートコンピューターでスクリプトブロックを実行します:

Invoke-Command -ComputerName SRV2 -ScriptBlock {Write-Host "Hi, I'm running code on the $(hostname) remote computer!"}

認証に失敗する場合、ユーザーに必要な権限がないことが通常の原因です。

デフォルトでは、管理者以外のユーザーはリモートコンピューターのローカルRemote Management Usersグループのメンバーである必要があります。

グループのメンバーシップを確認してください:

Get-LocalGroupMember -Group 'Remote Management Users'

ユーザーがリストされていない場合は、追加してください:

Add-LocalGroupMember -Group 'Remote Management Users' -Member user
Get-LocalGroupMember -Group 'Remote Management Users'

それから、再度Invoke-Commandコマンドを実行して接続を確認してください。

Invoke-Command -ComputerName SRV2 -ScriptBlock {Write-Host "Hi, I'm running code on the $(hostname) remote computer!"}

基本スクリプトのリモート実行

PowerShellリモーティングが構成されると、リモートコンピュータでコマンドを実行できます。この機能により、タスクの自動化、データ収集、問題のリモートトラブルシューティングが可能になります。

PowerShellリモーティングの動作を確認するために、リモートマシンにテキストファイルを作成し、そのアクションが成功したか確認します。

スクリプトブロックを定義して実行します:

$scriptblock = { Set-Content -Path 'somefile.txt' -Value '' }
Invoke-Command -Scriptblock $scriptblock -ComputerName SRV2

以下のコマンドを使ってファイルが作成されたことを確認します:

このコマンドはリモートコンピュータSRV2に接続し、ファイルsomefile.txtに関する情報を取得し、その名前と作成時間のみを出力します。

icm -ComputerName SRV2 -ScriptBlock {Get-Item somefile.txt} | Select-Object Name, CreationTime

リモートコンピュータでのローカルスクリプトの実行

単一のコマンドでは不十分な場合、ローカルに保存された完全なスクリプトを実行する必要があるかもしれません。その場合、PowerShellリモーティングを使用すると、ローカルスクリプトを迅速にリモートコンピュータに送信し、まるで物理的にそこにいるかのように実行できます。

リモートコンピュータでスクリプトを実行するデモを行うために、ローカルで短いスクリプトを作成し、リモートマシンで実行してアクションの自動化やクリーンアップタスクを行います。

次のコマンドでローカルにスクリプトを作成します。:

  • $scriptContentsは、マルチライン文字列を使用してスクリプトを保持し(@' ... '@)、スクリプトを読みやすく整理された状態に保つのに便利です。
  • Set-Contentは、$scriptContentsの内容を現在のディレクトリに*RunThisRemotely.ps1*というファイルに書き込みます。
$scriptContents =
@'
Write-Host "Deleting the file just created..."
Remove-Item -Path somefile.txt
'@
Set-Content -Path 'RunThisRemotely.ps1' -Value $scriptContents

スクリプトの内容を確認します:

Get-Content RunThisRemotely.ps1

リモートでスクリプトを実行します:

Invoke-Command -ComputerName SRV2 -FilePath RunThisRemotely.ps1

テストファイルが削除されたことを確認します:

icm -ComputerName SRV2 -ScriptBlock {Test-Path somefile.txt}

スクリプトブロックを使用してローカルレジストリキーを検証する

PowerShellリモート操作は、ローカルとリモートセッション間で変数を渡すことをサポートし、柔軟で再利用可能なスクリプトを実現します。しかし、まずはローカルでレジストリキーを確認することに焦点を当てましょう。

システムに存在するかどうか後で確認できる複数のレジストリパスを保存します:

# Define an array of registry paths to check
$registryKeyPaths = @(
    'HKLM:\SOFTWARE\Microsoft\AppV\', 
    'HKLM:\SOFTWARE\Microsoft\AccountsControl\'
)

コンピューターでローカルに実行されるスクリプトブロック ****($localScriptBlock) を定義するために、スクリプトにこれを追加します。このスクリプトブロックは、特定のレジストリパスがローカルマシンに存在するかどうかをチェックし、各パスに対してフィードバックを提供します。

# Define the script block that will run locally on the computer
$localScriptBlock = {
    ## Iterate through each registry path in the $registryKeyPaths array
    foreach ($path in $registryKeyPaths) {
        # Check if the current registry path exists on the local machine
        if (Test-Path -Path $path) {
            # If the path exists, output a message confirming its existence
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            # If the path does not exist, output a message stating its absence
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

スクリプトブロックを実行して、何が起こるかを確認します。

Invoke-Command -ScriptBlock $localScriptBlock

ローカル変数をリモートセッションに渡す

配列、文字列、またはオブジェクトを扱っている場合、データをリモートコマンドに渡す方法は2つあります:

  • $using – ローカル変数をスクリプトブロックに直接統合します。
  • ArgumentList – 使用するために変数を明示的にブロックに渡します。

この目標を達成するための2つの方法($usingまたはArgumentList)を探るために続けて読んでください。

$usingキーワードの使用(推奨アプローチ)

レジストリキーが存在することを確認した後、次のステップはその配列をローカルで読み取り、それをリモートコンピュータ上のスクリプトで使用することです。この偉業を達成する方法の1つは、$usingキーワードを使用してリモートセッションでローカル変数を参照することです。

このスクリプトを作成してリモートコンピュータで実行し、指定されたレジストリパスを確認します。このスクリプトは、各パスが存在するかどうかについてフィードバックを提供します。

このアプローチを使用すると、ローカル変数に$using接頭辞を追加するだけで済みます。この操作により、PowerShellはリモートコンピュータでコードを実行する前にローカル変数registryKeyPathsを参照するように指示されます。

$remoteScriptBlock = {
    ## Check to see if the registry keys exist on the computer
    foreach ($path in $using:registryKeyPaths) {
        if (Test-Path -Path $path) {
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

その後、リモートコンピュータでコードを実行するためのリモートコマンドを呼び出すことができます:

Invoke-Command -ScriptBlock $remoteScriptBlock -ComputerName SRV2

レジストリキーがそこにも存在するようです。

ArgumentListパラメータの使用

$usingキーワードの他のオプションであるArgumentListパラメータを使用して、変数をリモートセッションに送信することもできます。

$usingキーワードを使用したものと似ているスクリプトを作成し、ArgumentListパラメータを介して渡された値にアクセスするために$args配列を使用します。

この方法では、ArgumentListパラメータを介してリモートセッションに送信する1つ以上の変数を指定します。スクリプトブロック内で、ローカル変数を$argsで置き換え、PowerShellはArgumentListを介して渡された値で自動的に$argsを埋めます。

$remoteScriptBlock = {
    ## Check to see if the registry keys exist on the computer
    foreach ($path in $args) {
        if (Test-Path -Path $path) {
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

次に、次のコマンドでスクリプトを実行します:

Invoke-Command -ScriptBlock $remoteScriptBlock -ComputerName SRV2 -ArgumentList $registryKeyPaths

両方の方法は同じ出力を生成し、リモートコンピュータにレジストリキーが存在することを確認します。

これらの手順に従うことで、PowerShellリモーティングを効果的に設定し、リモートシステムでコマンドやスクリプトを実行することができます。

結論

このチュートリアルでは、Active Directory環境でのPowerShellリモーティングの設定方法、リモートシステムでのコマンドやスクリプトの実行、変数の効果的な受け渡しについて学びました。これらの基本的なスキルは、管理タスクを自動化し、システムを効率的に管理するために不可欠です。

基本をマスターした今、さらに高度なトピックを探求してみてください。永続的なPowerShellセッション、リモートエラーの処理、またはバルク操作を処理する再利用可能なスクリプトの作成について調べてみてください。

PowerShellリモーティングには無限の可能性があります—さあ、実験を始めて、あなたのワークフローをより効率的にしましょう!

Source:
https://adamtheautomator.com/powershell-remoting-guide/