tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルMACアドレスが取得できなくなりました
記事No7415
投稿日: 2008/04/28(Mon) 14:42
投稿者よっくん
こんにちは。

XP pro
VB2005

今まで正常にMACアドレスが取得できていたのですが、
Windows Updateを行った後からMACアドレスが取れなくなって
しまいました。

        Dim X As Object
        Dim S As String
        Dim MyMAC As String

        S = "SELECT * FROM Win32_NetworkAdapter WHERE MACAddress IS NOT NULL"

        For Each X In GetObject("winmgmts:").ExecQuery(S)

            MyMAC = UCase(Replace(X.MACaddress, ":", "-"))

            MsgBox(MyMAC)

        Next X

というコードで取得していたのですが、
For Each X In GetObject("winmgmts:").ExecQuery(S)
でフリーズしてしまいます。
(エラーも特にでません)

どこかファイルが壊れたのかもしれないのですが、
どこを見直せばいいのかさっぱりわかりません。

「ここを確認!」「あれを再インストール!」等
ご指摘頂けないでしょうか。

宜しくお願い致します。

[ツリー表示へ]
タイトルRe: MACアドレスが取得できなくなりました
記事No7416
投稿日: 2008/04/28(Mon) 16:03
投稿者魔界の仮面弁士
> For Each X In GetObject("winmgmts:").ExecQuery(S)
> でフリーズしてしまいます。
> (エラーも特にでません)

WMI のサービス起動に時間がかかっている、という事はありませんか?

> どこを見直せばいいのかさっぱりわかりません。

・WMI のサービスが起動状態になっているかどうか。
・\root\\cimv2:Win32_NetworkAdapter 以外のクラスであれば取得できるのか。
・Windows Update による更新をロールバックした場合、取得できるようになるのか。

[ツリー表示へ]
タイトルRe^2: MACアドレスが取得できなくなりました
記事No7417
投稿日: 2008/04/28(Mon) 17:08
投稿者よっくん
魔界の仮面弁士様
アドバイスありがとうございます。


> WMI のサービス起動に時間がかかっている、という事はありませんか?
> ・WMI のサービスが起動状態になっているかどうか。

サービスで確認したところ、状態は開始になっておりました。
Windows Management Instrumentationを
念のため停止→開始を行いましたが、一緒でした。

> ・\root\\cimv2:Win32_NetworkAdapter 以外のクラスであれば取得できるのか。

私自身、WMIをよくわかっていないのですが
Win32_LogicalDisk の Description を取得するように変えて
実行したところ、やはりフリーズしました。

> ・Windows Update による更新をロールバックした場合、取得できるようになるのか。

これが一番問題でして…。
実は、通常にWindows Updateを行ったのではなく、リカバリソフトによる
差分データ配信を使って行っております。
(一台でWindows Update→差分データ抽出→差分データを他PCへ配信)
なので、ロールバックができません。

↑が原因で、どこかしらのファイルが壊れたのかなぁと思い
もし再インストールできるものがあれば と思い質問させて頂きました。

かなり通常ではない環境ではありますが
何かやってみる事はあるでしょうか… orz



----------------------------------------------------------------------------
'Win32_LogicalDiskの取得ソース

        Dim objServices As Object
        Dim objObjectSet As Object
        Dim objObject As Object

        objServices = GetObject("winmgmts:{impersonationLevel=impersonate}")
        objObjectSet = objServices.InstancesOf("Win32_LogicalDisk")

        For Each objObject In objObjectSet
            If IsDBNull(objObject.description) = False Then
                MsgBox(objObject.description)
            End If

        Next

[ツリー表示へ]
タイトルRe^3: MACアドレスが取得できなくなりました
記事No7418
投稿日: 2008/04/29(Tue) 11:39
投稿者魔界の仮面弁士
ExecQuery の iFlags 引数(省略時は wbemFlagReturnImmediately)に、
wbemFlagReturnImmediately Or wbemFlagForwardOnly ( = &H30 )を
指定してみてはどうでしょう。
http://msdn2.microsoft.com/en-us/library/ms974547.aspx


ただ、フリーズするほどに遅いなら、インストール情報の不整合で、
サービス内部で Windows Installer の整合性チェックまたはエラー処理が
呼ばれている可能性もあるかも知れません。想像ですけれども。
http://support.microsoft.com/kb/265194/ja

WMI の場合にも当てはまるかどうかは分かりませんが、この場合、
早くて数秒、遅い物だと数時間ほど応答が無くなる事もあるので…。


ちなみに、どのユーザで実行しても駄目でしたか?
新規にユーザーアカウントを追加し、それを Administrators グループに
所属させてから呼び出してみては如何でしょう。

[ツリー表示へ]
タイトル【エセ解決】Re^4: MACアドレスが取得できなくなりました
記事No7428
投稿日: 2008/04/30(Wed) 20:56
投稿者よっくん
魔界の仮面弁士様
アドバイスありがとうございます。

アドバイス頂いたものを試しましたが、
特に結果は変わりませんでした。

緊急を要する対応だったため、
恥かしながらVBからDOSコマンド ipconfig/all を実行して
その結果をテキストファイルに吐き出して
そのテキストを読み込む

という処理で対応しました。

WMIがだめならAPIで と思いAPIを試しましたが
値がとれませんでした。

応急対応をしつつ、結局PCの再構築を行っております…。

アドバイス ありがとうございました。

[ツリー表示へ]