• ベストアンサー

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; }

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

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

自分では試してないので自信なしですが、 このあたり↓が参考になるかも(?)知れません。 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
likeacofee
質問者

お礼

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

likeacofee
質問者

補足

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

その他の回答 (1)

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.2

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

likeacofee
質問者

お礼

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

関連するQ&A

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

    下に示す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]の場合には、当然配列としてアクセスできるのに。。。) 一般的な初期化方法のほかにも何かコメントでも良いので経験あるかたいらっしゃいましたら教えてください。 宜しくお願いいたします。

  • 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だけのようですので、出来ればこの関数を使って解決したいと考えています。どうか、よろしくお願いします。

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

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

  • ローカルエリア接続用イーサネットアダプタのMACアドレスを取得したい

    コマンドプロンプトで ipconfig /all を実行すると出てくる情報の中で,「イーサネット アダプタ ローカル エリア接続:」というタイトルで表示されるアダプタのMACアドレスを取得するプログラムを書きたいのです。 MACアドレスを取得する方法として,(1)NetBIOSを使う方法,(2)IP Helper APIのGetIfTable関数を使う方法,(3)IP Helper APIのGetAdaptersInfo関数を使う方法 を試しましたが,(1)はアダプタの種類は判別できず,(2)と(3)はイーサネットアダプタだけを選び出すことはできますが,複数のイーサネットアダプタが存在する場合(例えばBluetoothデバイス装着時),それらの中から「Bluetooth接続」のアダプタなどを除外して「ローカル エリア接続」のアダプタ『だけ』を選び出すための情報は得られないようです。 できれば,LANに接続していない状態(ケーブルを外した状態)で取得したいのですが,どなたかお知恵をお貸し下さい。 なお,「説明」の内容を使う方法,例えば GetAdaptersInfo関数のTIP_ADAPTER_INFO構造体のDescriptionメンバの文字列に「Bluetooth」が入っているものを除外するというような方法は使いたくありません。 よろしくお願い致します。

  • 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言語で、構造体の変数の値を取得したいのですが、その際、 他の変数に格納してある文字列を元に動的に行いたいのですが、可能でしょうか? イメージとしては、 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言語でも出来ないものかと思っております。 よろしくお願いします。

  • ポインタのサイズ

    ポインタのサイズが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の仕様的には正しいのでしょうか? よろしくお願いします。

  • char型の配列の初期化について

    char型の配列の初期化の仕方について教えて下さい。 一般的に変数は宣言と同時に初期化するのが良いと言われているので、 char cName[64] = {'\0'}; のように記述すべきだと思うのですが、 char cName[64]; memset( cName, 0x00, sizeof( cName ) ); のような記述を多く目にします。 最初の記述のほうが無駄な処理がないように思えるのですが、 memsetを使うメリットは何かあるのでしょうか?

  • 正しいsizeofの使い方とcharのポインタについて教えてくださいm(__)m

    C言語なのですが、 例えば、次のように実験してみました。 char * rec_fld[12]; int x,y; char tt[11]; ※rec_fld[1]には”私は完全な素人” という文字が入っていると思ってください。 x = sizeof( rec_fld[1] ); strcpy( tt, rec_fld[1] ); y = sizeof( tt ); すると、xは4とかいう数字が格納されていて、 yには11という数字が格納されていました。 ttが11なのは分かりやすいのですが、 なんで、xは、文字数の14とかにならないのでしょうか? sizeofの中の書き方が違うのでしょうか? あと、char *で配列宣言するのと、charで宣言するのとは 何が違うのでしょうか? どなたか、教えて下さいませ。