Macアドレスの取得方法と確率について

このQ&Aのポイント
  • Macアドレスを取得する方法は2つあります。1つ目の方法はWin32_NetworkAdapterConfigurationを使用し、MACアドレスがnullでない場合に取得します。2つ目の方法はIPGlobalPropertiesとNetworkInterfaceを使用し、GetAllNetworkInterfacesメソッドを呼び出してMACアドレスを取得します。
  • どちらの方法を使用してもMACアドレスを取得することができますが、確率には差があります。1つ目の方法はWin32_NetworkAdapterConfigurationを使用するため、より高い確率でMACアドレスを取得できます。2つ目の方法はIPGlobalPropertiesとNetworkInterfaceを使用するため、一部のネットワークインターフェースでMACアドレスが取得できない場合があります。
  • IPアドレスが複数ある場合については、どちらの方法でも問題ありません。MACアドレスはネットワークインターフェースごとに一意な値を持っており、複数のIPアドレスを持つ場合でも正確にMACアドレスを取得することができます。
回答を見る
  • ベストアンサー

Macアドレスの取得(ソースは書けたが不安です)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '1番目の方法 Dim Objquery As New Management.ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress is not null") Dim ObjCollection As Management.ManagementObjectCollection = Objquery.Get Dim Obj As Management.ManagementObject For Each Obj In ObjCollection If (CType(Obj("IPEnabled"), Boolean) = True) Then Label1.Text = Replace(Obj("MacAddress"), ":", "") End If Next '2番目の方法 Dim computerProperties As IPGlobalProperties = IPGlobalProperties.GetIPGlobalProperties() Dim nics As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces() Dim adapter As NetworkInterface For Each adapter In nics Label2.Text = adapter.GetPhysicalAddress().ToString() Exit For Next adapter End Sub いつもお世話になっております。 以上の2種類の方法のどちらかでMACアドレスを取得したいのですが、あいにく知識不足で、どちらの方がより高い確率で取得できるのでしょう。 ちなみにソースを見る限り、IPアドレスなどは複数持つことができるようです。かなりかなり不安です。 お願いいたします。

noname#147912
noname#147912

質問者が選んだベストアンサー

  • ベストアンサー
  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.2

詳しいくないので、役に立たない情報かも知れませんが…… > ネットワークの設定が不十分の場合、 物理的に NIC が端末に接続されていたとしても Windows から認識されていない状態と 「無効」としている場合も取得できないと思います。 (ドライバのインストールは完了していて、デバイスとして認識されていても) > 物理的なものと、もう一つ「MSアダプタ!?」みたい論理的 Visual Basic 2005 で可能な方法でということと、NIC の種別を絞りこむということであれば 下記のようなもの組み合わせれば可能かも知れません。 1. NetworkInterfaceType 見れば Ethernet であると判断できます。 2. Description の値からはデバイスマネージャに出てくるものと同じようなものが得られるので ある程度は判断の参考にはなるかと思います。 ※ 記述例としてはこんな感じ Label2.Text = adapter.Description 3. MAC アドレスの 24 ビットはベンダIDになっているのでそれで識別するという方法も ありますが、リストを持っている必要があるのであまり現実的ではないと思われます。 ※ 次のようなサイトで検索して探すことも可能ですが…… Vendor/Ethernet MAC Address Lookup and Search http://www.coffer.com/mac_find/ > 目的は、このパソコンはユニークの個体であるのを判別 ※ これは余計なことなのでスルーして頂いてかまいません。 # ソフトウェアの使用制限にでもお使いになるのでしょうか? # だとしたら、どれを使って登録するかをユーザに選ばせてその条件で # 登録コードなどを発行するほうが無難ではないでしょうか?

noname#147912
質問者

お礼

ありがとうございました。

その他の回答 (1)

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.1

> どちらの方がより高い確率で取得できるのでしょう。 コードからして、おそらく .NET Framework 環境だとは思いますが 個人的には「二番目」のほうが無難かと思います。 読解力不足で申し訳ありませんが、この「より高い確立」とは何を 意味されてのことでしょうか? このコードで気になるのは次のことです。 # 動作確認のためのコードでこうなっているだけかとは思いますが ※ 引用が前後してしまいますが > For Each adapter In nics > Label2.Text = adapter.GetPhysicalAddress().ToString() > Exit For NIC が複数存在する場合、最初に見付かった NIC が必ずしも所望の インターフェースであるとは限らないので、限られた環境(NIC が 一つしかない)の場合以外で運用される場合は避けるべきではない でしょうか?

noname#147912
質問者

補足

ご回答ありがとうございます。薄識のため、万が一適当なことを言ったらごめんなさい。VB2005です。ちなみに上のソースコードは System.Managementに参照設定、Imports System.Net.NetworkInformationを追加する必要があります。 >「より高い確立」とは何を意味されてのことでしょうか? 聞いた話ではありますが、ネットワークの設定が不十分の場合、接続中のケーブルの刺し抜きとか、ネットワークアダプタがあっても必ず取得できるとは限らないそうです。(これはWindowsの仕様ですと言う方もいます) >NIC が複数存在する場合 ここらへんがよく分かりません、一つしかない環境でも物理的なものと、もう一つ「MSアダプタ!?」みたい論理的なものがあって、一つ目だけを取得しようとしたため、このようなソースコードになっております。 目的は、このパソコンはユニークの個体であるのを判別するためするためです。通信など高度なことに挑戦していませんが、確実にMACアドレスを取得したいです。 お願いいたします。

関連するQ&A

  • VBA Windows8 MACアドレス取得

    Windows7(32bit)の場合、次のコードでMACアドレスを取得できたのですが、 Windows8(64bit)の場合は失敗…ご教授宜しくお願い致します。 'マックアドレス:最初の1個だけ調べる。 Sub MacAddress() Dim oNetwork As Object Dim wNetworkSql As String wNetworkSql = "Select * From Win32_NetworkAdapter Where MACAddress Is Not Null" For Each oNetwork In GetObject("winmgmts:").ExecQuery(wNetworkSql) MsgBox oNetwork.MacAddress Exit For Next End Sub

  • VisualBasic.NETでのソースの意味がわかりません…。

    Dim misscount As Integer Dim istypemode As Boolean Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim s() As String = New String() {"datemasamune", "sanadayukimura", "tyousokabemototika", "morning", "hyper", "newspaper"} Dim word As String = s(New Random().Next(0, s.GetUpperBound(0) + 1)) Label1.Text = word Label2.Text = "" istypemode = True End Sub Private Sub Form1_keypress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress If istypemode And Not Char.IsControl(e.KeyChar) Then If e.KeyChar = Label1.Text.Chars(Label2.Text.Length) Then Label2.Text &= e.KeyChar End If End If End Sub ------------- 以上のソースがあるのですが、どこでどうなっているというのを教えてほしいです。 もし意味不明な部分とかありましたら教えてください。

  • WMIスクリプトを使用してMACアドレスをASPで取得

    タイトルの通りですが、 WMIスクリプトを使用して、 ASPでMACアドレスの取得を行なっているのですが、 なかなか上手くいきません。 <%@ LANGUAGE="VBSCRIPT"%> <HTML> <HEAD> </HEAD> <BODY> <% Dim QfeSet Dim QfeSets Dim Qfe Dim Locator Dim Service Dim Ret on error resume next Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Service = Locator.ConnectServer If Err = 0 then Set QfeSet = Service.Get("Win32_NetworkAdapterConfiguration") QfeSet.Security_.impersonationLevel = impersonate Set QfeSets = QfeSet.Instances_ End If For Each Qfe In QfeSet If Qfe.IPEnabled = True Then Ret = Qfe.MACAddress & vbCrLf Response.write("MACADDRESS:" & Ret & "<BR>") End If Next %> </BODY> </HTML> CreateObjectやService.Getのところが 原因ではないかと思うのですが・・・。 どなたか教えて戴けますでしょうか? 宜しくお願い致します。

  • 全てのサブフォーム名を取得したい

    オフィス2007です。 Sub test() Dim obj As AccessObject For Each obj In CurrentProject.AllForms Debug.Print obj.Name Next End Sub --------------------------------- 上記のコードでデータベースのすべてのフォーム名は取得できますが フォーム1に乗っかっている複数のサブフォームを取得するにはどうすればいいのでしょうか? サブフォームに独自の名前を付けて、IFステートメントを使うしかないですか?

  • EXCELVBAであるセルに設定されている条件式書式を取得したいと

    EXCELVBAであるセルに設定されている条件式書式を取得したいと 以下のマクロを組みました。しかし、3つ設定されている条件式のうち 1つの条件が3回表示されるため、困っています。 何が悪いのかご教授ください。 Public Sub FormatConditionsTest() Dim obj As Range Set obj = Cells(108, 10) Dim colFmt As FormatConditions Set colFmt = obj.FormatConditions Dim item As FormatCondition For Each item In colFmt MsgBox (item.Formula1) Next End Sub

  • フォーム上の全てのコントロールを取得したい

    フォーム上の全てのコントロールを取得したいです。 (サブフォームも含め) 自分なりにVBAで考えてみたのがこれです。 Sub test() Dim 数 As Long For Each 数 In Form_フォーム1.Controls.Count ’Debug.Print ? End If Next End Sub でもこれだけでもデバックしてみると 「コンハ゜イルエラー for Eachは、コレクション オブジェクトまたは配列でのみ繰り返しを実行します。」 となります。 答えを教えてください! よろしくお願いします。 (アクセス2003です)

  • エラー時カーソルを戻したいのですが?

    エクセルVBAに入出荷(在庫管理)を作成しているのですが テキスト1に品番を入力して品番が無かった場合 テキスト1などを空白にしてテキスト1にカーソルを 戻したいのですが下記のように書き込むとテキスト2に カーソルが行ってしまいます。どこを直せばいいでしょうか? Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim i As Integer If KeyCode = 13 Then For i = 4 To 400 If Sheets("倉庫在庫(記入用)").Cells(i, 1) = TextBox1 Then Label6 = Sheets("倉庫在庫(記入用)").Cells(i, 4) Label7 = Sheets("倉庫在庫(記入用)").Cells(i, 5) TextBox2.SetFocus Exit Sub End If Next i MsgBox "品番がありません!" TextBox1 = "" Label6 = "" Label7 = "" End If TextBox1.SetFocus End Sub

  • スライド内のオブジェクトを消すマクロ

    PowerPointのVBAマクロで、スライド中にspaceという文字列のみのテキストボックス以外のオブジェクトを消すマクロを以下のように作成したのですが、このマクロを実行しても、いくつかのオブジェクトが残ってしまいます。 Sub foo()  Dim f As Boolean  Dim sl As Slide  Dim sh As Shape   For Each sl In ActivePresentation.Slides    For Each sh In sl.Shapes     If sh.HasTextFrame Then         If sh.TextFrame.TextRange.Text <> "space" Then             sh.Delete         End If     End If    Next   Next End Sub コレクションをFor eachで回しているので、漏れはないはずなのですが、どなたか原因・対策をご教示いただけないでしょうか?

  • Excel VBA でExecuteExcel4Macro("GET.OBJECT(48,

    エクセル2000です。 以前、ワークシートに配置したフォームツールのラベルの参照元を取得するマクロをご教示いただき、以下のTest01は問題なく作動しています。 Sub test01() Dim obj As Object Dim i As Integer Dim obj_n As String 'オブジェクトの名前 With ActiveSheet For Each obj In .Labels i = i + 1 .Cells(i, 2) = obj.Name: obj_n = obj.Name .Cells(i, 3) = obj.TopLeftCell.Address 'GET.OBJECT で、リンクがないものを取ると、False になる .Cells(i, 5) = ExecuteExcel4Macro("GET.OBJECT(48,""" & obj_n & """)") .Cells(i, 6) = obj.OnAction Next End With End Sub 今回、同一シートではなく別シートに表示させようと以下のTest02を書いたのですが、やってみると .Cells(i, 5) はすべて#VALUE!エラーになってしまいました。 ExecuteExcel4Macro("GET.OBJECT(48~がどのようなものかわからずやっているので応用がききません。(そもそも48って?) どのようになおしたらよいのかご教示いただければ幸いです。 Sub test02() Dim obj As Object Dim i As Integer Dim obj_n As String Dim ws As Worksheet, ns As Worksheet Set ws = ActiveSheet Set ns = Worksheets.Add With ns For Each obj In ws.Labels i = i + 1 .Cells(i, 2) = obj.Name: obj_n = obj.Name .Cells(i, 3) = obj.TopLeftCell.Address .Cells(i, 5) = ExecuteExcel4Macro("GET.OBJECT(48,""" & obj_n & """)") .Cells(i, 6) = obj.OnAction Next End With End Sub

  • アクセス フォームが存在するかを一発で取得したい

    フォームが50個くらいあるのですが 該当のフォームが存在するかvbaで取得したいのですが If CurrentProject.AllForms("フォーム1").IsLoaded Then のように、一発で取得する方法はありますか? 今は Sub Sample1() Dim DB As DAO.Database Dim f As DAO.Document Set DB = CurrentDb Dim strForm As String Dim flg As Boolean strForm = "Fメインメニュー" For Each f In DB.Containers!Forms.Documents If strForm = f.Name Then flg = True Exit For End If Next If flg = False Then MsgBox strForm & "は存在しません" End If End Sub のような感じで、すべてのフォームをループしているのですが 無駄が多い気がします。 改善策があればお願いします。

専門家に質問してみよう