• ベストアンサー
  • 困ってます

Macアドレスの取得方法

こんにちは、 Macアドレスの取得方法で悩んでいます。 現在NetBiosを使った方法で取得する方法までは出来たのですが、ネットワークに接続していない環境も想定しているため、ネットワークカードが稼動していない場合取得が出来ないようです。色々調べて見ましたがこの方法しか見つかりませんでした。 どなたか、ネットワークに接続されていない(LANケーブルがつながっていない)PCのMacアドレスの取得方法をご存知の方いらしましたら、ご教授願います。 //NetBiosを使った取得のソースコードを以下に示します。 #include "stdafx.h" #include "Nb30.h" typedef struct _ASTAT_ {  ADAPTER_STATUS adapt; NAME_BUFFER NameBuff[30]; }ASTAT, * PASTAT; ASTAT Adapter; bool GetMacAddress(char* pMacAddress) { NCB Ncb; UCHAR uRetCode; // reset memset( &Ncb, 0, sizeof(Ncb) ); Ncb.ncb_command = NCBRESET; Ncb.ncb_lana_num = 0; uRetCode = Netbios( &Ncb ); // get memset( &Ncb, 0, sizeof (Ncb) ); Ncb.ncb_command = NCBASTAT; Ncb.ncb_lana_num = 0; strcpy( (char*)Ncb.ncb_callname, "*" ); Ncb.ncb_buffer = (UCHAR*)&Adapter; Ncb.ncb_length = sizeof(Adapter); uRetCode = Netbios( &Ncb ); if ( uRetCode == 0 ) { char strBuffer[12]; sprintf(strBuffer, "%02x%02x%02x%02x%02x%02x", Adapter.adapt.adapter_address[0], Adapter.adapt.adapter_address[1], Adapter.adapt.adapter_address[2], Adapter.adapt.adapter_address[3], Adapter.adapt.adapter_address[4], Adapter.adapt.adapter_address[5] ); strcpy(pMacAddress, strBuffer); return true; } return false; }

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数1230
  • ありがとう数4

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

  • ベストアンサー
  • 回答No.1
  • z64423
  • ベストアンサー率53% (26/49)

自分では試してないので自信なしですが、 このあたり↓が参考になるかも(?)知れません。 http://www003.upp.so-net.ne.jp/geek/programming/iphlpapi/index.html

参考URL:
http://www003.upp.so-net.ne.jp/geek/programming/iphlpapi/index.html

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。早速、試してみます。

質問者からの補足

z64423さんの方法で試した結果うまくいきました。ありがとうございました。PlatFormSDKは使ったことが無かったので、インストールするのに手間取りましたが何とか目的の動作を得ることが出来ました。WIN98以降対応のようですので欲を言えば98よりまえの環境ではどうすればいいのかなあと言うところが気になっています。

その他の回答 (1)

  • 回答No.2

蛇足ながら、補足に対して。 > WIN98以降対応のようですので欲を言えば98より > まえの環境ではどうすればいいのかなあと言うところが > 気になっています。 Win98より前の環境、というのは、マイクロソフトのサポート外になってしまうので、昔のWin32 SDKなどを探すしかないです。また、昔のWin32SDKはマイクロソフトは絶対に配布してくれませんので、既に持ってる人からもらうしかないです。(なお、再配布は不許可だったはずなので、これまた違法です。) ということなので、昔の環境は無視して結構かと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答、ありがとうございます。そうですか、マクロソフトのサポート外ですか。Win32SDKはもしかしたらあるかもしれないので、時間を作って探してみます。現在のプロジェクトではwin95,winNt4.0は考慮しなくてよいという上司の判断が下されましたので、とりあえず、現状で進めていこうと思います。

関連するQ&A

  • iphlpapiのGetAdaptersInfoでNICのMacアドレスを取りたいのですが...

    こんにちは、 質問No.4996に関連して、VC++でiphlpapiのGetAdaptersInfoを使って、NICのMACアドレスを取得しようと考えています。WIN XP、WIN2000では、目的のアドレスが取得できるのですが、WIN98、WIN MEではNIC以外にPPP AdapterやAOL Adapterといった、ダイアルアップ用のアドレスも同時に取れてしまい、大変困っています。取得したものを見れば検討は付くのですがプログラム的により分ける方法が分かりません。確実にNICのMACアドレスだけを取得する方法はないでしょうか?NetBiosやiphlpapiの他の関数も検討しましたが、ネットワークが構築されていないPCから取得できるのはGetAdaptersInfoだけのようですので、出来ればこの関数を使って解決したいと考えています。どうか、よろしくお願いします。

  • バッファオーバーランの危険性検出について

    下に示すmsg_file.txtの内容を読み込んで表示するプログラムを使ってバッファオーバーランの危険性を検出するプログラムを作りたいのですが、どのように書き換えたら良いでしょうか。 プログラムソース 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define FILEPATH "msg_file.txt" 6 7 int main(); 8 void vuln(const char* line); 9 void stack_dump(void* ptr, int counts); 10 void hello(); 11 12 int main() 13 { 14 char linebuf[1024]; 15 FILE *fp; 16 long mark1 = 0x11111111; 17 memset(linebuf, 0, sizeof(linebuf)); 18 19 fp = fopen(FILEPATH, "r"); 20 fgets(linebuf, sizeof(linebuf)-1, fp); 21 fclose(fp); 22 23 vuln(linebuf); 24 25 printf("------------- end of main() -------------\n"); 26 } 27 28 void vuln(const char* line) 29 { 30 char msg[20]; 31 long mark2 = 0x22222222; 32 memset(msg, 0, sizeof(msg)); 33 34 strcpy(msg, line); 35 36 stack_dump(&mark2, 13); 37 38 printf("INPUT[%s]\n", msg); 39 } 40 41 void stack_dump(void* ptr, int counts) 42 { 43 int i; 44 unsigned long *ulong_ptr = (unsigned long *)ptr; 45 unsigned char uchar_buf[4]; 46 47 printf("-----------------------------------------\n"); 48 printf(" address | long var | +0 +1 +2 +3 | 0123\n"); 49 printf("-----------------------------------------\n"); 50 for(i=0; i<counts; i++) { 51 printf(" %08x| %08x", &ulong_ptr[i], ulong_ptr[i]); 52 memcpy(uchar_buf, &ulong_ptr[i], sizeof(uchar_buf)); 53 printf(" | %02x %02x %02x %02x", 54 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 55 if(uchar_buf[0]<32 || uchar_buf[0]>126) uchar_buf[0] = '.'; 56 if(uchar_buf[1]<32 || uchar_buf[1]>126) uchar_buf[1] = '.'; 57 if(uchar_buf[2]<32 || uchar_buf[2]>126) uchar_buf[2] = '.'; 58 if(uchar_buf[3]<32 || uchar_buf[3]>126) uchar_buf[3] = '.'; 59 printf(" | %c%c%c%c\n", 60 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]); 61 } 62 printf("-----------------------------------------\n"); 63 } 64 65 void hello() 66 { 67 printf("+----------+\n"); 68 printf("| HELLO! |\n"); 69 printf("+----------+\n"); 70 exit(0); 71 }

  • 動的メモリの初期化方法について。

    char *p = new char[SIZE]; 上記の方法で動的メモリを確保した場合 確保したメモリの初期化は、 memset(p, 0x00, SIZE); のほかに方法はありますでしょうか? 個人的にSIZEを指定してしまうのがキレイではないような気がしています。 memset(p, 0x00, sizeof(p)); では、sizeof(p)はchar* のサイズなので正しく初期化できず、 for (int i = 0; i < SIZE; i++){ memset(p[i], 0x00, sizeof(p[i])); } では、コンパイルエラーが出てしまいます。 (new char[SIZE]で確保した場合には、p[i]のように配列としてアクセスできないのでしょうか? 単にchar p[SIZE]の場合には、当然配列としてアクセスできるのに。。。) 一般的な初期化方法のほかにも何かコメントでも良いので経験あるかたいらっしゃいましたら教えてください。 宜しくお願いいたします。

  • 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

  • 構造体の変数の値を、動的に取得する方法を教えてください

    C言語で、構造体の変数の値を取得したいのですが、その際、 他の変数に格納してある文字列を元に動的に行いたいのですが、可能でしょうか? イメージとしては、 struct Entry{ char name[20]; char address[80]; char email[40]; }; struct Entry data; strcpy(data.name, "Taro"); strcpy(data.address, "Tokyo"); strcpy(data.email, "taro@taro"); char var_name[20]; strcpy(var_name, "email"); printf("%s", data.var_name); ↑この行の構造体の変数へのアクセス方法が間違っているのはわかっていますが、このような時に「taro@taro」と出力させたいのです。 var_nameの値を「name, address, email」に換える事により「Taro, Tokyo, taro@taro」と出力を切り換えたいと思っています。 普段は他の言語をよく使用しており、そちらではこの手法を時々使っていたのですが、C言語でも出来ないものかと思っております。 よろしくお願いします。

  • 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アドレスなどは複数持つことができるようです。かなりかなり不安です。 お願いいたします。

  • PCC-S-02322 未定義の識別子・・・

    こんばんは、Pro*C初心者です。 プリコンパイルを行った際に下記エラーが表示されてしまいます。 *-----------------------------------------------------------------------* PCC-S-02322,未定義の識別子が見つかりました。 セマンティック・エラーです。(行252、列23、ファイルC:\HDataSYU\test.pc): EXEC SQL CONNECT :username IDENTIFIED BY :password USING :db_string; ...........................................1 *-----------------------------------------------------------------------* ちなみに下記はプログラムの一部です。 char username[32]; char password[32]; char db_string[32]; memset(username, 0, sizeof(username)); memset(password, 0, sizeof(password)); memset(db_string, 0, sizeof(db_string)); strcpy(username, USERNAME); strcpy(password, PASSWORD); strcpy(db_string, DB_STRING); EXEC SQL CONNECT :username IDENTIFIED BY :password USING :db_string; 原因など些細な事で構いませんので、お分かりになる方ご教示下さい。 お願いします。 【環境】 os:Windows oracleのバージョン:oracle9.2.0

  • C言語にて、以下のような配列を定義した場合の初期化(0埋め)方法が分か

    C言語にて、以下のような配列を定義した場合の初期化(0埋め)方法が分からずに困っています。 char name[50][30]; <現在やっている事> memset(&name[0][0], 0x00, sizeof( name )); 上記の方法では、sizeofの値が正しくないように思っている (正しい値は30と考えています)のですが、 正しくはどのように行うものでしょうか。 どなたか教えていただけると幸いです。 以上ですが、よろしくお願いいたします。

  • 入れ子になった構造体について

    以下のように定義した、2重に入れ子になった構造体があります。 これを、mallocを使ってエリアを確保した後、初期化しています。 例では、各構造体の項目数が少ないのですが、 項目が増えた場合、下記のような初期化方法だと面倒だと思います。 もっとよい方法があるのだろうと思っているのですが・・・。 下記は私の試行錯誤結果なので、「普通はこうやるんじゃないの?」という方法などがあればご教授願います。 /* -- 構造体定義 -- */ typedef struct {   char data[16] ; }D_TAG ; typedef struct {   char name[16];   D_TAG *d ; }F_TAG ; typedef struct {   char name[16] ;   F_TAG *f ; }T_TAG ; /* -- 変数定義 -- */ T_TAG *t ; /* -- エリア確保 -- */ t=(T_TAG*)malloc(sizeof(T_TAG)*10); for(i=0;i<10;i++) {   t[i].f=(F_TAG*)malloc(sizeof(F_TAG)*10);   for(j=0;j<10;j++) {     t[i].f[j].d = (D_TAG*)malloc(sizeof(D_TAG)*10);   } } /* -- 初期化 -- */ for(i=0;i<10;i++) {   memset(t[i].name , 0x00, sizeof(t[i].name));   for(j=0;j<10;j++) {     memset( t[i].f[j].d, 0x00, sizeof(D_TAG)*10);     memset( t[i].f[j].name , 0x00, sizeof(t[i].f[j].name));   } } よろしくお願いいたします。

  • ポインタのサイズ

    ポインタのサイズがintと同じになるのは知っているのですが、 以下のコードの場合、 typedef struct hoge{ char buf1[8]; char buf2[16]; }HOGE; void test_func(HOGE *pHoge) { printf("型[%d],実際[%d]\r\n", sizeof(HOGE), sizeof(*pHoge)); memset(pHoge, 0x00, sizeof(*pHoge)); } 正しくサイズが取得できるのですが、 この使い方はC99の仕様的には正しいのでしょうか? よろしくお願いします。