2017-01-25 8 views
0

次のスニペット:JScript.NET:列挙WMIコレクションJScript.NETで

%windir%\Microsoft.NET\Framework64\v4.0.30319\jsc.exe /platform:x64 wmi.js 

と実行されますが、とWMI呼び出しを変更:

col=wmi.ExecQuery("SELECT * From Win32_Process", "WQL", 32); 

wmi.js 
------ 
var wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2"), 
    col =null, prc=null; 
col=wmi.ExecQuery("SELECT * From Win32_Process", "WQL", 32); 
//col=wmi.InstancesOf("Win32_Process"); 
var e = new Enumerator(col); 
for (; !e.atEnd(); e.moveNext()){ 
    prc = e.item(); 
    print(prc.CommandLine); 
} 

がでコンパイル

コンパイルはまだ動作しますが、実行時には次のようになります。

Unhandled Exception: System.InvalidCastException: 
Unable to cast COM object of type 'System.__ComObject' to interface type 'System.Collections.IEnumerable'. 
This operation failed because the QueryInterface call on the COM component for the interface with IID '{496B0ABE-CDEE-11D3-88E8-00902754C43A}' failed due to the following error: 
'No such interface supported (Exception from HRESULT: 0x80004002       

InstancesOfExecQuery両方のドキュメントが言うので、私は、理由を理解していない。また

If successful, the method returns an SWbemObjectSet

、WSHのJScriptはInstancesOf収集とExecQueryの両方を列挙することができます。

答えて

1

最初にまずwbemFlagForwardOnlyのフラグを削除し、ExecQueryが期待どおりに動作するオブジェクトを返します。

var wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2") 
    , col =null, prc=null; 

col=wmi.ExecQuery("SELECT * From Win32_Process"); 
//col=wmi.InstancesOf("Win32_Process"); 

var e = new Enumerator(col); 
for (; !e.atEnd(); e.moveNext()){ 
    prc = e.item(); 
    print(prc.CommandLine); 
} 

ここでは、暗闇の中でのショットです(私は毎日Jscript.NETでは動作しませんし、私は専門家でもありません)。 https://msdn.microsoft.com/en-us/library/ms974547.aspxから

「WMIはSWbemObjectSet内のオブジェクトへの参照を保持していないために、前方のみの列挙は、デフォルトの列挙子よりもはるかに高速実行」

エラーから:

"'System .__ ComObject'タイプのCOMオブジェクトをインターフェイスタイプ 'System.Collections.IEnumerabl'にキャストすることができませんe。 "

コレクションを列挙子に変換すると、キャストされるオブジェクトへの参照が必要になると思われます。 wbemFlagForwardOnlyフラグを指定すると、キャストが失敗するように参照が渡されません。

これは私がこれをどのように読むのかです。それが価値あるものであればそれを取ってください。

調査時に見つけた興味深いもの:wscript/cscriptとjsc/cscのexeを実行してこの列挙子にエラーはありません。

また、VBScriptにはこれらのフラグで列挙する問題はありません。例をチェックし、https://msdn.microsoft.com/en-us/library/ms525775(v=vs.90).aspxを比較してください。

関連する問題