始めまして。
10月に始めてプログラミング言語、もといPCに触った超・超どしろうとです。
質問なのですが、特定のPCでしか動作しないプログラムを作るには、どうしたらよいのですか?
パスワードなどは使わないようにしたいのですが・・・。
思いつく方法は2つです。
1つはMACアドレスを取得して、それを見て動作可能かどうか調べる方法。
もう1つは、特定するための機械を付けているPCのみ動作するようにする方法。
1つ目の方法は、APIのNetBios関数でMACアドレスを取得します。
使用方法は、winsock2のヘルプをみてください(英語です)。
ただし、Windows2000ではMACアドレスを変更できるようです。Windows9xでも変更できるらしいです。普通に使っている限り、変更はしないと思います。
# レジストリを変更することでできます
MACアドレスを先に調べて、プログラムに組み込むことが出来るなら手軽でよいです。
2つ目は、シリアルポートにちょっとしたコネクタをつけて、そのコネクタ(=ドングルと呼ばれるもの)があるかどうかによって、特定のPCを区別します。
MacromediaのDirectorなどがそうです。
シリアルポートでなくても、マウスでもPCIバスでも、判別するための機械を取り付けて、それの有無をチェックするということです。
逆に、ハードウェアスペックを調べて、そのスペックにあうPCだった場合に動作するというようにすると、機械の追加は必要ないのでドングルを用意するよりは簡単です。
この場合は同じスペックのPCで動作してしまいます。
他にも例外的に、指紋センサー、声紋チェック、アイリスチェックなどもありますが、これだと「特定のPC」でなく、「特定の人」になりますね。
MACアドレスですか。
調べてみます。ありがとうございます。
(まずMACアドレスとはなんぞや?からですが・・・情けない・・・)
いろいろ調べたり、また周りの友人(=同じ課題に苦しめられている仲間っす)と相談したりしていたんですが、「シリアルナンバー」って使えないのでしょうか?
友人は、ハードディスクのナンバーが絶対に存在するはずだ!と言っています。
Delphiでは、ハードディスクのシリアルナンバーが取得できるような関数があるのでしょうか?
ハードディスクのシリアルナンバーとは、フォーマットするとできる番号のほうですよね?
ハードディスク機械のラベルに書いてあるシリアル番号はわかりません、たぶん。
例です。適当に変更してみてください。
var
VolumeSerialNumber,
MaximumComponentLength,
FileSystemFlags: Cardinal;
VolumeName: array[0..260] of char;
FileSystemName: array[0..260] of char;
begin
GetVolumeInformation(
'C:\', // ドライブ
VolumeName, // ボリュームネームが入る
260, // ボリュームネームを格納するバッファのサイズ
@VolumeSerialNumber, // ボリュームシリアルナンバーが入る
MaximumComponentLength, // ファイル名は何文字までか、が入る
FileSystemFlags, // ファイルシステムの情報が入る
FileSystemName, // ファイルシステムの名前が入る
260 // ファイルシステムの名前を格納するバッファのサイズ
);
ありがとうございます!
なにか数値が取ってこれました!
フォーマットするとできる番号と言うことは・・・フォーマットするたびに違う番号になるのでしょうか???
ツイート | ![]() |