DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Macアドレスの取得の仕方

環境/言語:[C# .NEt Frame Work4.0 Windows 7]
分類:[.NET]

いつもお世話になっています

プログラミングをしている途中にOSを再インストールしても変わらないがパソコンによって値が違うのを取得したいとおもいます
値がかわらないのといったらMacアドレスしかない!とおもって取得の仕方を教えてほしいです

IPからMacを取得するみたいなんですがIPの取得がわかりません
本当はMacアドレスの取得の仕方もわかりません

できればソース付きで教えてください
参考サイトでもいいです

よろしくお願いします
たとえば、「MACアドレス取得 C#」と Google などで検索されましたか?
検索されてわからなかったのであれば、どの部分がわからないかより具体的な質問をすべきでしょう。(ルールにある「安易な質問」ではないというところを見せてください)

■No28983に返信(meruruさんの記事)
> 値がかわらないのといったらMacアドレスしかない!とおもって取得の仕方を教えてほしいです

たとえば、LAN ボードがない&オンボード LAN がない場合、MAC アドレスは存在しません。また、複数の LAN ボードがある場合は複数の MAC アドレスが存在します。
これらの場合、どうするのでしょうか?

また、MAC アドレスを変えられる LAN ボードも存在します。
MAC アドレスでの認証は脆弱といえるかと思います。使い道次第かもしれませんが。
ごめんなさいm(_ _)m
ろくに検索もせずに質問してしまいました!

Macアドレスは取得できるようになったのですがなぜか一致しないのにエラーがでなくて困っています

Macアドレス以外にパソコンを認証させることのできる方法はないでしょうか
■No28990に返信(meruruさんの記事)
> Macアドレスは取得できるようになったのですがなぜか一致しないのにエラーがでなくて困っています
一致しない理由を調べることができるのは、そのコードを持ち、
それを実行させているmeruru さん自身だけです。

実際のコードを見たわけでも無い我々には、取得方法が間違っているのか
比較方法が間違っているのか、あるいは環境に問題があるのかも分かりません。

第三者にも状況がわかるような情報開示をお願いします。

> Macアドレス以外にパソコンを認証させることのできる方法はないでしょうか
闇雲にいろいろな方法に手を出すのではなく、先に
 「Mac アドレスでは何故要件を満たせなかったかのか」
を分析してみてください。その分析結果を基に、その問題を解決できる手法を
探すようにしていかないと、問題の解決が遅れてしまうと思いますよ。
ソースコードはこれです
public static string macadd()
{
// ネットワークが利用できない場合は終了する
if (!NetworkInterface.GetIsNetworkAvailable())
return null;

// 各ネットワークインタフェース毎に処理を行っていく
NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in adapters)
{
if (adapter.OperationalStatus.Equals(OperationalStatus.Up))
{
IPInterfaceProperties properties = adapter.GetIPProperties();
foreach (IPAddressInformation ipInfo in properties.UnicastAddresses)
{
IPAddress ip = ipInfo.Address;
if (!IPAddress.IsLoopback(ip))
{
Console.WriteLine("IP = " + ip);
return adapter.GetPhysicalAddress().ToString(); ;
}
}
}
}
return null;
}
最初のMacアドレスを取得して、このMacアドレスが一致するかどうかを確認します

工程はこんなかんじです

>Macアドレス保存<
// Macアドレスを取得
iniファイルに記録
ini.Write(datagroup, "macadd", macadd());
// iniファイルを暗号化して勝手に編集されないようにする

>Macアドレス認証<
// iniファイルを複号する
string mac = macadd();
if (ini.Read(datagroup, "macadd") != mac)
throw new Exception("Macアドレスが一致しない");

わかりやすく編集した状態がこんな感じです
その他の処理はまったく別の処理なので省略します
ini変数はiniファイル編集クラスです
inimgr ini = new inimgr(filename, false);
これはファイルを素の状態(暗号化されてない状態)で読み込みます
暗号化と復号化の処理も省略します
2011/09/06(Tue) 05:59:07 編集(投稿者)

■No28990に返信(meruruさんの記事)

> Macアドレスは取得できるようになったのですがなぜか一致しないのにエラーがでなくて困っています

とありますが、

> >Macアドレス保存<
> // Macアドレスを取得
> iniファイルに記録
> ini.Write(datagroup, "macadd", macadd());
> // iniファイルを暗号化して勝手に編集されないようにする

> >Macアドレス認証<
> // iniファイルを複号する
> string mac = macadd();
> if (ini.Read(datagroup, "macadd") != mac)
> throw new Exception("Macアドレスが一致しない");

これではiniファイルに書き込んだものと比較する値が等しくなっているので、エラーにならないのではないでしょうか?
変数のmacの値の中身とiniファイルから読み込んだ値がどうなっているのか調べることから始めましょう。

そもそも、なぜパソコン単体に対する認証が必要なのでしょうか?
その背景を説明してもらえれば代替策はあるかも知れません。
■No28992に返信(meruruさんの記事)
> ソースコードはこれです
> public static string macadd()

取得できなかったときに、このメソッドは null を返すのですよね。

このメソッドを利用する側では、常に null チェックを実施する必要が
ありますが、それは組み込まれていますでしょうか。
(null が返された時、それをそのまま ini に保存して良いのでしょうか?)

実際のコードでは null 判定も行っているというのであれば良いのですが、
もしも、利用側での null チェックが省略される可能性があるのなら、
いっそ、取得できない場合には例外を発するように作っておいた方が、
問題箇所を見落としにくくなるかと思います。


> 最初のMacアドレスを取得して、このMacアドレスが一致するかどうかを確認します
物理デバイスだけでなく、仮想NICも列挙される可能性がありますが、そうした
複数の Mac アドレスが返される環境において、「最初のMacアドレス」が、
目的としている Mac アドレスを指しているかどうかを検証されましたか?

また、ハードウェア構成によっては、稀にデバイスの認識順によって
列挙順が変化する可能性もあったりしますが、その場合の対策は
取られていますか?

# たとえば、Mac が 3 つ取得される環境においては、そのうちの
# いずれか 1 つが ini に記録された物と一致すればよいという動作にするとか。


> 暗号化と復号化の処理も省略します
一方向暗号化(ハッシュ)ではなく、可逆暗号化なのですよね。

であれば、比較段階で「保持していた Mac値」と「今取得した Mac値」が
それぞれ具体的にどういう値になっており、そしてその値が、期待していた
Mac 値を指しているかどうかを目視確認してみてください。


期待値が返されないなら、macadd() を見直す必要があるでしょうし、
保持値が不正なら、ini への保存と読取の部分をチェックせねばなりません。

また、それぞれの値は問題無いのに、比較判定がうまくいかないのであれば、
検証処理の部分や暗号化/複合化の部分を見直す必要があるでしょう。
回答ありがとうございますm(_ _)m

nullチェックは行っています
このプログラムはファイルを暗号化するプログラムで、同じパソコンのみファイルを複号する機能です。
パソコンを認証できるなら何でもいいですが、違うOSでも同じパソコンなら同じ必要があります

Macアドレスの戻り値は
0090F*****21のような感じでした
(念のため*で隠しましたが16進数でした)
Macアドレスの数は2つでした
最後のはルーターのIPみたいな感じです

認証の方式は最初のMacアドレスが一致するかどうかで決めます
複数のMacアドレスは保存していません

ファイルを暗号化/複合化する工程には問題ないようです


テストした環境は自分のPCと友達のPCで契約してるプロパイダーも住所もぜんぜん違います

正直に言うとMacアドレスじゃない方法でもいいんですけどね...
■No29000に返信(meruruさんの記事)
> このプログラムはファイルを暗号化するプログラムで、同じパソコンのみファイルを複号する機能です。
自PCのみの暗号化だけなら、NTFS で ACL と EFS を併用すれば対処できるかも
知れませんが、これだとOSを入れ替えた場合には対処できないですね…。

> パソコンを認証できるなら何でもいいですが、違うOSでも同じパソコンなら同じ必要があります
ドングル代わりの運用だとすると、USBタイプのNICを利用している場合には
容易にハード構成を持ち出せてしまいます。それに先述したように、
環境によってはインターフェイスの列挙順が変わってしまう事も稀にあります。

なので、他の情報も組み合わせて複合的にチェックした方が良いかも知れません。
http://www.atmarkit.co.jp/fwin2k/qanda/002wpa/wpa_02.html

また最近では、仮想環境も考慮が必要になってくるかもしれません。

たとえば VirtualPC 上で動作させた場合、MAC 値を
<ethernet_card_address type="bytes"> あたりで容易に調整できるため、
仮想的な「同じパソコン」が物理的に異なる場所で展開される可能性があります。
http://itpro.nikkeibp.co.jp/prembk/NBY/techsquare/20041025/151673/


> Macアドレスの戻り値は
> 0090F*****21のような感じでした
0090F* 系のベンダーだと、ELECOM や CISCO あたりかな?


> 認証の方式は最初のMacアドレスが一致するかどうかで決めます
だとすれば、先ほどの
>> なぜか一致しないのにエラーがでなくて困っています
については、どういう値とどういう値とが比較されたのでしょうか。

不一致として判定されるはずが、誤って一致と誤認されてしまうのでしょうか。
それとも、不一致であることは検出できたものの、その後のエラー処理に
コーディング上の問題があったということなのでしょうか。

> ファイルを暗号化/複合化する工程には問題ないようです
つまり、暗号化/復号化の工程を省いたテストコードであっても、
>> なぜか一致しないのにエラーがでなくて困っています
の理由はまだ見つけられていない、という事でしょうか?


> 正直に言うとMacアドレスじゃない方法でもいいんですけどね...
Mac 以外で変更しにくいところでは、マザーボードでしょうかね。

Win32_BaseBoard クラスで集められる情報だと不足気味かも知れないので、
Win32_SystemEnclosure あたりも併用してみるとか。

あとは、USBデバイスのベンダIDとプロダクトIDとか。

いずれにせよ単体での利用は避け、複数の情報を統合して扱った方が良いかも。
返信ありがとうございますm_( _)m
やはりOSを再インストールしても変わらない情報を取得するのは難しいので
入れなおしても情報は変わらないけど、損情報を変えることができないようなものはないでしょうか

Biosの情報についても頑張って取得できるように頑張ってみます
ざっと読み直しましたが、いまいち何をやりたいのか見えてきませんでした。
やりたいこと、要件などを整理していただけませんか?
そして、本当にパソコンを識別しないといけないんですか?
現状、要素になり得るものはいくつか出てくるでしょうけれども、あなたの要求・制約を満たすものかを検証できません。

文面で保障がなくて動作実績から判断する可能性のあるもの、それを識別するためには開発・検証コストがかかるもの、かんたんに実現できるけど少し技術的にかじれば偽装できるものがあると思います。
総合的にあなたが求めるレベルのものを組み合わせるべきですが、それはあなたにしか判断できないので、「何かよいものないでしょうか」と問われても厳しいと思います。
識別させるのは機能として取り入れようと思ったのですがライセンス認証にも使いたいと思います。
絶対に必要な機能…という訳ではありません

現在はBIOSのシリアルを取得することで落ち着きました。

一様MACアドレスの取得方法はわかたので解決済みにします。
解決済み!
■No29095に返信(meruruさんの記事)
> 現在はBIOSのシリアルを取得することで落ち着きました。
どのようにして取得したのかが書かれていなかったので、
関連しそうな情報を代わりに貼っておきます。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=26328&forum=7


> 一様MACアドレスの取得方法はわかたので解決済みにします。
「一様(いちよう)」ではなく
「一応(いちおう)」かと。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板