Winrm を使用すると、DCOM ではなく WS-MAN プロトコル経由で WMI をクエリできます。ただし、DCOM 実装では、クエリするさまざまなクラスのさまざまなプロパティのデータ型を取得できます。ただし、winrm を使用すると、値のみが返されます。データ型をクエリする方法はありますか?
たとえば、c:> winrm enum wmicimv2/* -dialect:wql -filter:"Select * FROM Win32_ComputerSystem"
次のようなものが返されます
<wsman:Results xmlns:wsman="http://schemas.dmtf.org/wbem/wsman/1/wsman/results">
<p:Win32_ComputerSystem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_ComputerSystem" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common" xsi:type="p:Win32_ComputerSystem_Type" xml:lang="en-US">
<p:AdminPasswordStatus>3</p:AdminPasswordStatus>
<p:AutomaticManagedPagefile>true</p:AutomaticManagedPagefile>
<p:AutomaticResetBootOption>true</p:AutomaticResetBootOption>
<p:AutomaticResetCapability>true</p:AutomaticResetCapability>
<p:BootOptionOnLimit xsi:nil="true"/><p:BootOptionOnWatchDog xsi:nil="true"/>
<p:BootROMSupported>true</p:BootROMSupported>
<p:BootupState>Normal boot</p:BootupState>
.....
ただし、ご覧のとおり、データ型はそこにありません。これは標準の Win32 オブジェクトなので、データ型はわかっています。スキーマはオンラインであり、静的に把握できます。ただし、カスタム クラスがある可能性があります。DCOM Wmi アプローチを使用すると、プロパティをクエリして、データ型や配列かどうかなど、プロパティに関する詳細をもう少し調べることができます。同じことを winrm/wsman で実行できますか。これは PowerShell で実行できることは知っています。PowerShell ではなく、winrm/wsman アプローチを探しています。
ありがとう
答え1
これを複数の方法で実行して、定義されたデータ型のすべてを含むオブジェクトを返すことができます。その後、このオブジェクトを取得して、各値のデータ型を取得できます。
$WMI = get-wmiobject -class Win32_ComputerSystem -ComputerName <RemoteComputer>
$WMI.PSObject.Members | where membertype -match "Property"
これにより、WMI オブジェクトが提供され、そこから必要な操作を実行できます。$WMI.psobject.Members は各値を列挙し、オブジェクトをループして各値を調べることができます。
Get-WmiObjectはリモートコンピュータへの接続にWS-Managementを使用していないため、リモートマシンにWS-Managementが構成されている必要はありません。ここではDCOMを使用しています。WinRMを使用する場合は、
$Results = Invoke-Command -scriptblock { get-wmiobject -class Win32_ComputerSystem } -computerName <ComputerName>
この場合の変数は Deserialized.System.Management.ManagementObject#root\cimv2\Win32_ComputerSystem になりますが、いくつかのプロパティが追加されます。