次の方法で共有

パソコンをユニークに識別するためにMacアドレスを使うという方法について

Anonymous
2020-09-13T02:56:16+00:00

2020年5月初旬に

パソコンをユニークに識別するために「デバイスID」をVBAで取得できるかについて

質問をし、「Macアドレス」はどうかと回答をいただき、その方法で識別するよう

VBAを作りました。開発・テストしているパソコン(Win10,Excel2019)はWifiと

つなぐだけで、LANケーブルをつないでいません。

Wifiルータの線が抜けていて電源が供給されていない状態、これはたまたまです、

でそのVBAが動いたとき、Macアドレスは取得できませんでした。

ネットワークカードにふられたアドレスだから、

パソコンの電源が入っていたら大丈夫かといいかげんに思っていましたが

Wifiにつながっていないとか、LANケーブルがつながっていなければ

Macアドレスが取得できないということなら、もともとの

「パソコンをユニークに識別するためデバイスID」の代わりにできません。

質問は2つ

(1)Wifiにつながっていないとか、LANケーブルがつながっていなければ

 Macアドレスが取得できない のでしょうか? 理由は?

(2)上記①がもしそういうことなら他の手段を教えていただきたい。

「線くらいつないどけよ」という回答はあるかもしれませんが、

これ以外の回答を希望します。

よろしくお願いします。

Microsoft 365 と Office | Excel | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

11 件の回答

並べ替え方法: 最も役に立つ
  1. Hebikuzure aka Murachi Akira 320.6K 評価のポイント MVP ボランティア モデレーター
    2020-09-13T05:44:32+00:00

    MAC アドレスはハードウェアアドレスなので、対象のネットワーク インターフェースが有効であれば、接続の有無にかかわらず取得可能です。

    管理者コマンドプロンプトで 

    getmac

    コマンドを実行してみてください。接続の有無にかかわらず(例えば「メディアが切断されています」)MAC アドレスが取得できるでしょう。

    取得できないのは取得のためのロジックに問題があるのだと思います。

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  2. Anonymous
    2020-09-13T05:41:51+00:00

    Windows 10の場合ですが、Configuration Managerが使っているデバイス識別子は、[設定]-[システム]-[バージョン情報]で表示されるデバイスIDで、以下のところにあります。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SQMClient

    MachineId

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  3. Anonymous
    2020-09-13T03:00:22+00:00

    こんにちは。

    VBAに関しては専用のフォーラムが存在するため、下記へご投稿ください。

    より有効な回答が得られるかと思います。

    https://social.msdn.microsoft.com/Forums/ja-JP/...

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  4. Anonymous
    2020-09-13T11:05:08+00:00

    返信ありがとうございます。

    回答の内容でVBAを作って動かしてみようと思ったものの

    うまくいきません。

    先頭のDim sql As String = "SELECT * ・・・・は

    Constに直せましたが、

    2行めは New に (sql)の引数がエラーになり、それをはずしても

    どこに持っていくかわかりません。 文法はVBAではなく

    C#のものでは?

    コメントだけの表面的な感じから、提示していただいたものは、

    質問した「Wifiにつながっていないとか、LANケーブルがつながっていなくても」

    Macアドレスが取得できるものでないのでは。

    「アダプタが有効であるか確認」してそうでなければ「Disabled」と出すという

    ことから。

    以前に質問してMacアドレスでとなったときに

    サンプルのURLを教えてもらい

    作って使っているものは、今「半分、役立たず」ですが、

    以下の通りです。

    Public Function Macアドレスを取得() As String

    'WMI を用いて Macアドレスを取得

    Dim WMIオブジェクト     As Object    'WMIオブジェクト

    Dim Adapterオブジェクト As Object    'ネットワークアダプタ

    Dim Macアドレス         As String

    Macアドレス = "" ' 初期値

    Set WMIオブジェクト = GetObject("winmgmts:\.\root\cimv2").ExecQuery _

    ("Select * From Win32_NetworkAdapterConfiguration " & _

    "Where IPEnabled = True")

    ' ネットワークアダプタ参照

    For Each Adapterオブジェクト In WMIオブジェクト

    'Macアドレス参照(最初に見つけたもので確定)

    Macアドレス = Adapterオブジェクト.MacAddress

    Exit For

    Next

    Macアドレスを取得 = Macアドレス

    End Function

    再度質問を整理します。

    (1)今回のTakashi NISHIIEさんの回答からも

    Wifiにつながっていないとか、LANケーブルがつながっていなくても

    取得はできなさそうですが、そうならその理由、

    どんなしくみ?

    (2)Macアドレスの代わりに「パソコンをユニークに

    識別する情報は?

    もともと「デバイスID」を取得できるかという質問に

    「Macアドレス」になったのですが。

    ※識別するためにネットワークに正しく接続していないと

    ダメという条件をつけるのかに疑問 ということで。

    0 件のコメント コメントはありません
  5. Anonymous
    2020-09-13T07:38:05+00:00

    Macアドレスにこだわるなら、以下の方法があります。

    https://devblogs.microsoft.com/scripting/powertip-use-powershell-to-find-mac-address/

    要するにWMIクラスのWin32_NetworkAdapterConfigurationオブジェクトから必要な情報を拾ってくればいい。

        ' WMI からネットワークアダプタ設定のすべてを取得する

        Dim sql As String = "SELECT * FROM Win32_NetworkAdapterConfiguration"

        Dim s As ManagementObjectSearcher = New ManagementObjectSearcher(sql)

        ' 実際に取得

        Dim objects As ManagementObjectCollection = s.Get()

        For Each obj As ManagementObject In objects

            ' アダプタ名

            Console.WriteLine(obj("Caption"))

            ' アダプタが有効であるか確認

            If (DirectCast(obj("IPEnabled"), Boolean)) Then

                Console.WriteLine("Enabled") ' 有効

                ' MACアドレスを取得

                Console.WriteLine("MAC アドレス = " + obj("MacAddress"))

                ' IPアドレスを取得(IPv4 IPv6 ともに取得できる)

                For Each ip As String In DirectCast(obj("IPAddress"), String())

                    Console.WriteLine("IP アドレス = " + ip)

                Next

            Else

                Console.WriteLine("Disabled") ' 無効

            End If

        Next

    0 件のコメント コメントはありません