[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/01/17(Wed) 13:02
投稿者名:わんこ
Eメール:
URL :
タイトル:
WMIの利用条件について
いつもお世話になっております。

お手数ですが以下の件に関してご教授下さい。

WMIを利用して実行中のプロセスに関する情報を
以下のように取得しております。

以下、サンプルとしてソースの一部です。(Win32_Processクラスを使用しております。)

'変数の宣言
Dim Proc As Object
Dim Msg  As String
    
'プロセス情報を取得するループ
For Each Proc In GetObject("winmgmts:").InstancesOf("Win32_Process")
 lstProcess.AddItem "ファイル名: " & Proc.Name & " プロセスID: " & Proc.ProcessID
Next

上記を実行ファイル(.exe)にして、開発環境が
何も入っていないPCで実行させようとすると、
For Each〜の部分で実行が止まってしまい、
実行プロセスの取得が行えません。
#VB6.0等が入っているPCだと正常に実行できます。

私の開発環境があるPCのOSはWindowsXP Proで、
実行させたい開発環境のないPCはWindowsXP
Embeddedです。また開発はVB6.0で行っております。

何故に実行出来ないのでしょうか??
どなたか修正案を教えて下さい。

以上、宜しくお願い致します。

投稿時間:2007/01/17(Wed) 14:27
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: WMIの利用条件について
> For Each〜の部分で実行が止まってしまい、

どのようなエラーメッセージが表示されるのでしょうか?
正確なエラーメッセージをキーに検索すれば、情報が見つかるはずですが。

> 私の開発環境があるPCのOSはWindowsXP Proで、

Win2000 以降で動作するはずですが。

投稿時間:2007/01/17(Wed) 16:39
投稿者名:わんこ
Eメール:
URL :
タイトル:
Re^2: WMIの利用条件について
ご回答頂きありがとう御座居ます。

> どのようなエラーメッセージが表示されるのでしょうか?
> 正確なエラーメッセージをキーに検索すれば、情報が見つかるはずですが。

エラーメッセージは特に出ておりません。For Each〜を無視して
すり抜けてしまっているように思います。
#WMI以外の問題なのでしょうか??

> Win2000 以降で動作するはずですが。

確かに、Windows2000以降の環境で動作するはずと思って
おりましたので、特に開発環境の有無は関係ない気がしている
のですが、他に理由が見付からないので悩んでいる次第です。

ちなみに、VB6.0の参照設定で「WMICntl 1.0 Type ライブラリ」というのが
ありましたが、これを参照してないとダメとかありますか??

私のPCでは特に参照しなくてもプロセスの取得が行えたので、
設定しておりません。

以上、宜しくお願い致します。

投稿時間:2007/01/17(Wed) 17:18
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: WMIの利用条件について
> エラーメッセージは特に出ておりません。For Each〜を無視して
> すり抜けてしまっているように思います。
前回は止まっていると書いておられ今回はすり抜けている?
本当にそのプログラムは起動しているのでしょうか?
まず確認する事では。

環境によっては、下記が影響しているかも知れませんが?(よく解りません)
http://support.microsoft.com/kb/913538/ja

投稿時間:2007/01/17(Wed) 19:04
投稿者名:わんこ
Eメール:
URL :
タイトル:
Re^4: WMIの利用条件について
ご回答頂きありがとう御座居ます。

> 前回は止まっていると書いておられ今回はすり抜けている?
> 本当にそのプログラムは起動しているのでしょうか?
> まず確認する事では。

誠に申し訳ありません。On Frror に入った際に以下のエラーが出力されておりました。
「ErrorCode:-2147221020,オートメーション エラーです。構文が無効です 」

構文に問題があるのでしょうか??

以上、宜しくお願い致します。

投稿時間:2007/01/17(Wed) 18:07
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: WMIの利用条件について
> 私の開発環境があるPCのOSはWindowsXP Proで、
> 実行させたい開発環境のないPCはWindowsXP
> Embeddedです。また開発はVB6.0で行っております。

おっと、XPe ですか…。未経験なので、私には分かりません。

# とりあえず、無意味に google 結果を貼ってみる。
# http://groups.google.co.jp/groups/search?hl=ja&q=embedded+wmi


> For Each〜の部分で実行が止まってしまい、
見た感じでは、For Each 部分に、処理を積み込みすぎだと思います。まずは、
 Set a = GetObject("winmgmts:")
 Set b = a.InstancesOf("Win32_Process")
 For Each c In b
のように分割して、どの部分に問題があるのかを確認すべきかと。


On Error トラップで、エラーが無視されている、とか…。
いずれかのオブジェクトのインスタンス生成に長い時間がかかっている、とか…。
.InstancesOf("Win32_Process") の件数が 0 件と看做されている、とか…。


あとは、環境面でチェックする項目として、
 1) そもそも、WMI のサービスが起動しているか否か。
 2) Win32_Process クラスは存在しているのか。
 3) 省略表記せず、名前空間まで明示指定した場合には動作するのか。
 4) GetObject からのシンタックスではなく、CreateObject から順に生成した場合はどうか。
などでしょうか。(未経験ゆえ、具体的な確認方法まではアドバイスはできませんが…)


> #VB6.0等が入っているPCだと正常に実行できます。
これは、「(XP Proではなく) XPe に、VB6 開発環境を入れると動作した」という意味ですか?

投稿時間:2007/01/17(Wed) 19:01
投稿者名:わんこ
Eメール:
URL :
タイトル:
Re^2: WMIの利用条件について
ご回答頂きありがとう御座居ます。

> For Each〜の部分で実行が止まってしまい、
>見た感じでは、For Each 部分に、処理を積み込みすぎだと思います。まずは、
> Set a = GetObject("winmgmts:")
> Set b = a.InstancesOf("Win32_Process")
> For Each c In b
>のように分割して、どの部分に問題があるのかを確認すべきかと。

先程修正して、

Set A = GetObject("winmgmts:{impersonationLevel=impersonate}")
Set B = A.InstancesOf("Win32_Process")
    
'実行中のプロセス情報を取得する
For Each C In B


のようにして実行させたのですが、NGでした。

>On Error トラップで、エラーが無視されている、とか…。
>いずれかのオブジェクトのインスタンス生成に長い時間がかかっている、とか…。
>.InstancesOf("Win32_Process") の件数が 0 件と看做されている、とか…。

誠に申し訳ありません。On Frror に入った際に以下のエラーが出力されておりました。
「ErrorCode:-2147221020,オートメーション エラーです。構文が無効です 」

構文に問題があるのでしょうか??

> あとは、環境面でチェックする項目として、
>  1) そもそも、WMI のサービスが起動しているか否か。
こちらは起動している事を確認致しました。

>  2) Win32_Process クラスは存在しているのか。
あります。参考までに↓
http://msdn2.microsoft.com/en-us/library/aa394372.aspx

>  3) 省略表記せず、名前空間まで明示指定した場合には動作するのか。
省略しない場合もNGです。上記サンプルの通り↑

>  4) GetObject からのシンタックスではなく、CreateObject から順に生成した場合はどうか。
> などでしょうか。(未経験ゆえ、具体的な確認方法まではアドバイスはできませんが…)
私もこの方法は分かりません。ちょっと調べます。

> > #VB6.0等が入っているPCだと正常に実行できます。
> これは、「(XP Proではなく) XPe に、VB6 開発環境を入れると動作した」という意味ですか?
入れるとというか、XPeにVB6.0が入っていたPCではOKでした。
ちょっと他のPCでも確認致します。

以上、宜しくお願い致します。

投稿時間:2007/01/17(Wed) 23:51
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: WMIの利用条件について
>>のように分割して、どの部分に問題があるのかを確認すべきかと。
> 先程修正して、
> 〜
> のようにして実行させたのですが、NGでした。
そうではなくて……それらの「どの部分」が NG だったのかが重要だ、という事です。
実際に、どの行を実行するときにエラーになるのですか?

# 問題箇所を突き止めるために、処理を分断するという事であって、
# 処理を分断すれば解決する、という意味ではありません。m(_ _)m


> 誠に申し訳ありません。On Frror に入った際に以下のエラーが出力されておりました。
> 「ErrorCode:-2147221020,オートメーション エラーです。構文が無効です 」
『"On Frror" (On Error?) に入った際』というのは、どの部分の事ですか?

> 構文に問題があるのでしょうか??
メッセージを見る限りでは、そういう事なのでしょうね。
(ただし、構文を修正することで解決するのかどうか、というのは、また別の話)

>>  2) Win32_Process クラスは存在しているのか。
> あります。参考までに↓
> http://msdn2.microsoft.com/en-us/library/aa394372.aspx
資料末尾の Requirements の Client に、"Windows XP" が含まれているのは存じていますが、
Embedded とは書かれていないので、ちょっと心配だったのです。

私は、CE 系の Embedded OS しか経験が無いので、XP Embedded において、Win32_Process が
「常に実装される」ものなのか、「実装可能(optional)」なのか、「非対応」なのかを
知らないので、今使用している OS 自体にそれが含まれていることを、Wbemtest.exe 等で
確認した方が良いのではないかな…と思ったのです。
(optional だとしたら、その機器へのOS実装状況によって、使用可否が異なりますよね)


>>  3) 省略表記せず、名前空間まで明示指定した場合には動作するのか。
> 省略しない場合もNGです。上記サンプルの通り↑
どの部分でエラーになるのですか? またそれは、同じエラー内容でしたか?


>>  4) GetObject からのシンタックスではなく、CreateObject から順に生成した場合はどうか。
> 私もこの方法は分かりません。ちょっと調べます。
手順的には、参照設定して New する場合と全く同じ方法で OK ですよ。
New する部分を、CreateObject するだけです。

> 入れるとというか、XPeにVB6.0が入っていたPCではOKでした。
この VB6.0 というのは、ランタイムではなく、「開発環境」の意味ですよね。
(ランタイムが無ければ、動かないのは当然なので)

「VB6.0が入っていた」というのは、Embedded の提供ベンダが、あらかじめ VB6 開発環境を
インストール済みの状態で出荷している……という意味でしょうか?
それとも、わんこさん以外の人が、事前に VB6 開発環境を入れていた、という意味ですか?

投稿時間:2007/01/18(Thu) 12:41
投稿者名:わんこ
Eメール:
URL :
タイトル:
Re^4: WMIの利用条件について
ご回答頂きありがとう御座居ます。

> そうではなくて……それらの「どの部分」が NG だったのかが重要だ、という事です。
> 実際に、どの行を実行するときにエラーになるのですか?

最初の
 Set A = GetObject("winmgmts:{impersonationLevel=impersonate}")
の部分でエラーになります。

> 『"On Frror" (On Error?) に入った際』というのは、どの部分の事ですか?

***********************************************
Private Function XXXXXXXXXX
On Error GoTo ErrorHandler

-- 処理 --

ExitFunction:
    On Error Resume Next
    Exit Function

ErrorHandler:
  ★
    Resume ExitFunction
    Resume Next
***********************************************

上記、★の部分です。

> >>  3) 省略表記せず、名前空間まで明示指定した場合には動作するのか。
> > 省略しない場合もNGです。上記サンプルの通り↑
> どの部分でエラーになるのですか? またそれは、同じエラー内容でしたか?

上記と同じ、
 Set A = GetObject("winmgmts:{impersonationLevel=impersonate}")
の部分でエラーになります。

> >>  4) GetObject からのシンタックスではなく、CreateObject から順に生成した場合はどうか。
> > 私もこの方法は分かりません。ちょっと調べます。
> 手順的には、参照設定して New する場合と全く同じ方法で OK ですよ。
> New する部分を、CreateObject するだけです。

お手数ですが、CreateObjectにする場合のサンプルを頂けませんか??
また必要な参照設定等あれば、それもご教授下さい。

> 「VB6.0が入っていた」というのは、Embedded の提供ベンダが、あらかじめ VB6 開発環境を
> インストール済みの状態で出荷している……という意味でしょうか?
> それとも、わんこさん以外の人が、事前に VB6 開発環境を入れていた、という意味ですか?

後者、他の誰かがVB6 開発環境を入れていたという意味です。

投稿時間:2007/01/19(Fri) 11:41
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^5: WMIの利用条件について
>> XP Embedded において、Win32_Process が
>> 「常に実装される」ものなのか、「実装可能(optional)」なのか、「非対応」なのかを
>> 知らないので、
どうやら対応しているみたいですね。(optional かどうかは読み取れませんでしたが…)
http://www.microsoft.com/japan/windows/embedded/xp/evaluation/sp2fea/embedded_func.asp


> お手数ですが、CreateObjectにする場合のサンプルを頂けませんか??
「SWbemLocator」というキーワードで検索してみてください。
たとえば、"WMI Fun" というサイトや、Microsoft のサイトなどで、幾つかの例を得られます。

VB6 用だけでなく、VBScript 用や C++ 用のサンプルがヒットしてしまうこともありますが、
その場合でも、基本的なコードは同じなので、参考にはなるかと思います。


> また必要な参照設定等あれば、それもご教授下さい。
使うのは、Microsoft WMI Scripting libarary です。
もっとも、参照設定せずにレイトバインドでも利用できると思いますよ。


>「ErrorCode:-2147221020,オートメーション エラーです。構文が無効です 」
> 他の誰かがVB6 開発環境を入れていた
もしかしたら、開発環境を入れる前後で、DCOM 設定に変化があるのかも。
dcomcnfg.exe を使って、
 コンポーネント サービス\コンピュータ\マイコンピュータ
および、
 コンポーネント サービス\コンピュータ\マイコンピュータ\DCOMの設定\Windows Management and Instrumentation
のプロパティで、ローカルに対する COM 起動/アクティブ化 のセキュリティが
変化していないか、確認してみてはいかがでしょう?
本当に DCOM の問題かどうかは分からないので、保証はできかねますけど。

投稿時間:2007/01/24(Wed) 17:11
投稿者名:わんこ
Eメール:
URL :
タイトル:
Re^6: WMIの利用条件について
ご回答頂きありがとう御座居ました。

色々調べました所、原因が判明致しましたので、
ご報告させて頂きます。

対象PCの<C:\WINDOWS\system32\wbem>下に、WMIで
使用している以下のコンポーネントがありませんでした。
- wbemdisp.dll
- wbemdisp.tlb

MSの関連ページは以下の通りです。
http://www.microsoft.com/japan/msdn/columns/scripting/scripting06112002.aspx

上記を他から取得し、対象PCに投入した所、
問題無くAPが実行されました。

お忙しい中何度もご教授頂き大変申し訳ありませんでした。

今回学ばせて頂いた内容をきちんと自分のモノに出来るように、
一から勉強し直します。ありがとう御座居ました。

以上、宜しくお願い致します。