リモート コンピューター上の WMI への接続
WMI を使用して、リモート コンピューター上の WMI データを管理したり、アクセスしたりすることができます。 WMI でのリモート接続は、Windows ファイアウォールと DCOM の設定の影響を受けます。 ユーザー アカウント制御 (UAC) で、一部の設定の変更が必要になる場合もあります。 ただし、いったん正しい設定を備えれば、リモート システムに対する呼び出しはローカル WMI 呼び出しとよく似ています。 しかしさまざまな資格情報、代替認証プロトコル、その他のセキュリティ機能を使用して、それをより複雑にすることもできます。
リモート接続用のコンピューターの構成
WMI を使用してリモート システムにアクセスする前に、いくつかのセキュリティ設定を調べて、アクセスできることを確認する必要が生じる場合があります。 具体的な内容は次のとおりです。
Windows には、リモート システム上のスクリプトへのアクセスをブロックする場合がある多数のセキュリティ機能が含まれています。 そのため、WMI 呼び出しを行う前に、システムの Active Directory と Windows ファイアウォールの設定を変更する必要がある場合があります。 詳細については、「リモート WMI 接続の設定」と「リモート WMI 接続のトラブルシューティング」を参照してください。
リモート接続を機能させるには、正しい DCOM 設定を有効にする必要があります。 DCOM の設定を変更すると、権限の低いユーザーがリモート接続のためにコンピューターにアクセスできるようになります。 詳細については、「リモート WMI 接続のセキュリティ保護」を参照してください。
また、固定ポート経由で WMI を実行したい場合があります。 これを行うには、設定も変更する必要があります。 詳細については、「WMI 用の固定ポートの設定」を参照してください。
Connecting to a Remote Computer
WMI を使用してリモート システムに接続する場合、その中心にあるのは、システムにアクセスするための適切なアクセス許可を持っていて、接続が適切に構成されていることを確認することです。 いったんこれら 2 つの要素を実現すれば、接続自体は比較的単純です。 たとえば、既定のセキュリティ資格情報を使おうとしている場合は、次のコードを使用して、リモート システム上の WMI にアクセスできます。
-
Get-WmiObject などの、ほとんどの WMI コマンドレットに共通の -ComputerName パラメーターを使用します。
$strComputer = "Computer_B" $colSettings = Get-WmiObject Win32_OperatingSystem -ComputerName $strComputer
-
GetObject の呼び出しで、リモート システムの名前が含まれるモニカーを使用します。
strComputer = "Computer_B" Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colSettings = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
-
現在のバージョンの WMI マネージド インターフェイス (Microsoft.Management.Infrastructure) では、CimSession オブジェクトを使用してリモート ホストへの接続を表します。
using Microsoft.Management.Infrastructure; ... string Namespace = @"root\cimv2"; string OSQuery = "SELECT * FROM Win32_OperatingSystem"; CimSession mySession = CimSession.Create("Computer_B"); IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace, "WQL", OSQuery);
-
v1 バージョンの WMI マネージド インターフェイス (System.Management) では、ManagementScope オブジェクトを使用してリモート ホストへの接続を表します。
using System.Management; ... ManagementScope scope = new ManagementScope("\\\\Computer_B\\root\\cimv2"); scope.Connect(); ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
-
IWbemLocator::ConnectServer メソッドを使用し、strNetworkResource パラメーターでリモート コンピューターの名前を指定します。
hres = pLoc->ConnectServer( _bstr_t(L"\\\\COMPUTER_B\\root\\cimv2"), _bstr_t(useToken?NULL:pszName), // User name _bstr_t(useToken?NULL:pszPwd), // User password NULL, // Locale NULL, // Security flags _bstr_t(useNTLM?NULL:pszAuthority),// Authority NULL, // Context object &pSvc // IWbemServices proxy );
前出のコード サンプルは、おそらく、WMI を使用して実行できる最も基本的なリモート接続です。 具体的には、サンプルでは以下のことを前提としています。
- あなたはリモート コンピューターに関する管理者です。 ユーザー アカウント制御のため、リモート システム上のアカウントは、Administrators グループのドメイン アカウントである必要があります。 詳細については、「ユーザー アカウント制御と WMI」を参照してください。
- 現在のローカル コンピューターのパスワードは空白ではありません。 これは基本的に、パスワードを使用してシステムにログオンしている必要がある、Windows のセキュリティ要件です。
- ローカル コンピューターとリモート コンピューターの両方が同じドメイン内にあります。 ドメイン境界を越える必要がある場合は、追加の情報を提供するか、少し異なるプログラミング モデルを使用する必要があります。
- あなたは自分のアカウントを使用してリモート コンピューターにアクセスしています。 異なるアカウントへのアクセスを試みる場合には、追加の資格情報を指定する必要があります。 (現在のアカウントとは異なる資格情報を使用して WMI にローカルでアクセスすることは許可されないことに注意してください。)
- どちらのコンピューターも IPv6 を実行しています。 WMI では、IPv6 を実行しているコンピューターへの接続がサポートされています。 ただし、ローカル コンピューターと "Computer_B" の両方で IPv6 を実行している必要があります。 いずれかのコンピューターが IPv4 も実行している可能性があります。 詳細については、「WMI での IPv6 と IPv4 のサポート」を参照してください。
- スクリプトに委任は必要はありません。つまり、対象のリモート コンピューターを介して追加のリモート コンピューターにアクセスする必要はありません。 詳細については、「WMI での委任」を参照してください。
- リモート プロセスを作成するのではなく、特定の呼び出しを行おうとしています。 詳細については、「WMI を使用したリモートでのプロセスの作成」を参照してください。
これらの制限を念頭に置くと、リモート WMI 呼び出しはローカル WMI 呼び出しとよく似ています。唯一の違いは、リモート システムの名前を指定する必要がある点です。 ただし、これらの機能の多くは、異なる資格情報を使用するか、サード パーティのコンピューター経由で呼び出しをルーティングするか、異なるドメインにアクセスすることで変更できます。