PowerShellのヒントとコツ

最終更新日: 20 年 2023 月 XNUMX 日

組み込みPowerShellスクリプト コマンドレットを介して管理データを提供するWindowsシステムからデータを取得するための優れた方法です。 PowerShellを最大限に活用するための次のいくつかのヒントとコツ。

PowerShellでカスタムデバイスプロパティを使用する

次の行に沿ってPowerShellスクリプトに標準のデバイスプロパティを取り込むことに加えて ## system.hostname ##、次のようなカスタム定義のデバイスプロパティを使用することもできます ## my.custom.property ##。 PowerShellインタープリターを実行する前に、この形式で指定された各プロパティは、そのデバイスに格納されている値に置き換えられます。

指定されたプロパティがデバイスに定義されていない場合、置換はActiveDiscoveryスクリプトとDataCollectionスクリプトの間で異なる方法で処理されることに注意してください。 Active Discoveryスクリプトでは、指定されていないデバイスプロパティは置換されないため、コードは次のように記述されます。

$foo = '##my.custom.property##';

置換なしで、ここに示されているとおりに正確に実行されます。 Active Discoveryスクリプトで、デバイスプロパティが設定されていないかどうかをテストする場合は、置換がないかどうかをテストします。

# was my.custom.property set for this device?
if ($foo eq '##my.custom.property##')
{
    # no. handle this case 
}

データ収集スクリプトでは、これは別の方法で処理され、指定されていないデバイスプロパティが空の文字列として置き換えられます。 これは、データ収集スクリプトでこれと同じテストを行う場合は、条件を次のように記述することを意味します。

# was my.custom.property set for this device?
if ($foo eq '')
{
    # no. handle this case
}

PowerShell認証

次のようなPowerShellコマンドレットのいくつか 取得-WMIObject リモートシステムに直接クエリを実行できます。 以下で説明するPowerShellRemoting機能を含む他の多くの機能では、リモート資格情報を直接提供する必要があります。

リモート資格情報を活用するには、それらを資格情報オブジェクトにバンドルしてから、このオブジェクトをパラメーターとしてリモート認証を必要とするコマンドレットに渡す必要があります。 次のように、LMに保存されているデバイスプロパティから資格情報オブジェクトを作成できます。

$ hostname = '## SYSTEM.HOSTNAME ##'; $ userid = '## THIS.USER ##'; $ passwd = '## THIS.PASS ##'; #資格情報オブジェクトを作成します$ secure_passwd = ConvertTo-SecureString `-String $ passwd -AsPlainText -Force; $ user_credential = New-Object `-typename System.Management.Automation.PSCredential`($ userid、$ secure_passwd); 再起動-コンピューター-ComputerName $ hostname -Credential $ user_credential;

PowerShell Remoting –初期設定

のような標準のPowerShellコマンドレットのほんの一握りですが 取得-WMIObject リモートシステムでメトリックをクエリできるようにします。通常は、セットアップする必要があります PowerShellリモート処理 コレクターによって監視されているリモートシステムでコマンドレットを実行します。 これを行うには、次の一連の手順で概説するように、もちろん両方のシステムの管理者権限が必要です。

注: ターゲットマシンのホスト名は、コレクターによって解決可能である必要があります。

  1. 特定のコレクターによって監視されている各ターゲットWindowsシステムで、WinRMサービスを開始し、自動起動用に構成し、WS-Management通信のファイアウォール例外を追加する必要があります。 これらすべてをXNUMXつのコマンドで実行できます。
    Enable-PSRemoting
  2. また、ターゲットシステムでは、リモート接続を許可する「信頼できるホスト」としてコレクターを指定する必要があります。
    Set-Item WSMan:\localhost\Client\TrustedHosts CollectorHostName
  3. 次に、コレクターシステムで、各ターゲットホストをコンマ区切りのリストとしてTrustedHostsに追加する必要があります。 または、任意のホストへの接続が許可されていることを指定します。
    Set-Item WSMan:\localhost\Client\TrustedHosts *
  4. また、コレクターでは、 リモートシェルクォータ 十分な数のシェルを許可するには:
    winrm set winrm/config/winrs '@{MaxShellsPerUser="50"}'
  5. 最後に、両方のホストでWinRMサービスを再起動して、これらの設定が有効になるようにします。
    Restart-Service WinRM

これを構成したら、コレクターから以下を実行して動作を確認できます。

Invoke-Command -ComputerName <target hostname> -ScriptBlock { Write-Host "Running Remotely on ${env:computername}" } -Credential <domain>\<user>

これにより、指定したユーザーのパスワードの入力を求められ、認証が成功すると、それが実行されているリモートシステムの名前が報告されます。

PowerShell Remoting –Invoke-Commandを使用した例

コレクターとリモートシステム間のリモート設定が正常に完了したら、リモートコマンドを操作する方法がいくつかあります。 この最初の例では、 Invoke-Command コマンドレット。XNUMXつのリモートコマンドのみを操作する必要がある場合に使用します。 この手法を使用してVeeamバックアップジョブのリストを生成する方法は次のとおりです。

#LMデバイスのプロパティからホスト名と資格情報を取り込みます$ hostname = '## SYSTEM.HOSTNAME ##'; $ userid = '## THIS.USER ##'; $ passwd = '## THIS.PASS ##'; #資格情報オブジェクトを作成します$ secure_passwd = ConvertTo-SecureString `-String $ passwd -AsPlainText -Force; $ user_credential = New-Object `-typename System.Management.Automation.PSCredential`($ userid、$ secure_passwd); #リモートホストへのセッションを開始します$ session = New-PSSession `-ComputerName $ hostname` -Credential $ user_credential; #コマンドをスクリプトブロックに入れて実行します$ scriptBlock = {Add-PSSnapin VeeamPSSnapin; Get-VBRJob -WarningActionsilentlyContinue; }#リモートホストでコマンドを呼び出し、出力を保存します$ veeam_jobs = Invoke-Command `-Session $ session` -ScriptBlock $ scriptBlock#バックアップジョブのリストを繰り返しますforeach($ job in $ veeam_jobs){#インスタンスを取得しますこのジョブの情報$ instance_id = $ job.Name; $ instance_desc = $ job.Description; #各ジョブのインスタンスを書き出すWrite-Host "$ instance_id ## $ instance_id ## $ instance_desc"; }#セッションを切断しますRemove-PSSession $ Session; #成功を示す戻りコードで終了します。戻り値0。

PowerShellリモーティング–Import-PSSessionを使用した例

リモートコマンドを実行する別のアプローチは、 インポート - PSSession コマンドレットをセッションにインポートします。 これは、単一のセッションにプルしたいコマンドが多数ある場合に役立つことがあります。 この場合、この手法を使用して、ExchangeServerメールボックスデータベースコピーに関する統計をレポートします。

#ホスト名、インスタンス、および必要な資格情報を取り込みます$ hostname = '## SYSTEM.HOSTNAME ##'; $ userid = '## THIS.USER ##'; $ passwd = '## THIS.PASS ##'; $ instance_id = '## WILDVALUE ##'; #資格情報オブジェクトを作成します$ secure_passwd = ConvertTo-SecureString `-String $ passwd -AsPlainText -Force; $ user_credential = New-Object `-typename System.Management.Automation.PSCredential`($ userid、$ secure_passwd); #リモートホストへのセッションを開始します$ session = New-PSSession `-ComputerName $ hostname` -Credential $ user_credential; #指定したコマンドレットをセッションにインポートします$ import_session = Import-PSSession $ session `-CommandName Get-MailboxDatabaseCopyStatus` -AllowClobber; #インポートされたコマンドレットを実行し、指定されたインスタンスに対してフィルターをかけます$ mailbox_db_copy = Get-MailboxDatabaseCopyStatus | `Where-Object {$ _。Name-eq $ instance_id} | `Select-Object Status、CopyQueueLength、ReplayQueueLength、ContentIndexState; 書き込みホスト "ステータス:" $ mailbox_db_copy.Status; 書き込みホスト "CopyQueueLength:" $ mailbox_db_copy.CopyQueueLength; 書き込みホスト "ReplayQueueLength:" $ mailbox_db_copy.ReplayQueueLength; 書き込みホスト "ContentIndexState:" $ mailbox_db_copy。 ContentIndexState; #セッションを切断しますRemove-PSSession $ Session; #成功を示す戻りコードで終了します。戻り値0。
記事上で