OSのプロダクトIDを取得するには?

解決


ゆきお  2004-08-12 03:30:27  No: 10358

度々お世話になります。

プログラムのコピー防止が目的なのです。

OSのプロダクトID(12345-OEM-1234567-12345みたいな)を
最初の起動時に取得して、どこかに隠したファイルに書き込み(ファイル内容が空なら書き込み、空の場合のみ書き込み)、ファイル内容が空でない2回目以降の起動時にはそのファイル内容とOSのプロダクトID
を照らし合わせて正規の物かコピーしたものかを判別しようと思います。
IDの取得はできますでしょうか?

また、できたとして書き込みを行う
ファイルは私の能力ではテキストファイル位なのですが、万が一ファイルの
格納場所が分かってしまったら簡単に中身が見れてしまいます。
このような場合、別の方法はありますでしょうか?

ご指導いただけますよう宜しくお願い申し上げます。


jok  2004-08-12 08:24:36  No: 10359

>IDの取得はできますでしょうか?

わたしの Win2k ではレジストリの

HKEY_LOCAL_MACHINE|Software\Microsoft\Windows\CurrentVersion

から取れるようです。またいろいろな暗号化のコンポーネントがたくさんある
ようです。


Win98健在  2004-08-12 20:51:13  No: 10360

>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion  

Win98でも同じキーに ProductIdが登録されてます。多分WinXPでも同じでしょう。
だけど、プロダクトIDをファイルに書き込んだのが正規品なのかコピー品なのか、その区別は出来ない気がするんですが…(?_?)


にしの  2004-08-12 20:55:49  No: 10361

XPにも同じところにありました。
暗号に使うなら、これよりもネットワークカードなどのMACアドレスや、ハードディスクのシリアル番号を使った方がよろしいかと。


ゆきお  2004-08-13 01:58:18  No: 10362

みなさまこんにちは。貴重なアドバイスありがとうございます。
jokさん、にしのさん、先日はありがとうございました。
win2k、98、xpいろいろなOSの事が分かりすごくありがたいです。
ただ残念なのが
>HKEY_LOCAL_MACHINE|Software\Microsoft\Windows\CurrentVersion
をどのような方法で活かせば良いのか分かりません。
>HKEY_LOCAL_MACHINE
をF1のヘルプで見ても出てこず、グーグルで検索をかけても
それらしきものがみつかりませんでした。引き続き調べてみます。
Win98健在さんへ、
>プロダクトIDをファイルに書き込んだのが正規品なのかコピー品な
>のか、その区別は出来ない気がするんですが…(?_?)
その通りだと思うのですが、私が考えられる方法が今回の方法位だった
ので正規品だと信じるしかないのです。(残念です)
にしのさんへ、
>暗号に使うなら、これよりもネットワークカードなどのMACアドレスや、
>ハードディスクのシリアル番号を使った方がよろしいかと。
確かにシリアル番号の方が分かりにくそうですね。かなり良さそうな
気がしますので、やり方を同時に調べてみようと思います。


ゆきお  2004-08-13 03:32:27  No: 10363

こんにちは。
にしのさんにいただいたヒントを調べていたら、こちらの過去ログに
たどり着きまして、そこににしのさんがソースを書いてくれていました。

procedure TForm1.Button1Click(Sender: TObject);
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 // ファイルシステムの名前を格納するバッファのサイズ
);
edit1.Text:=VolumeName;
edit2.Text:=floattostr(VolumeSerialNumber);
edit3.Text:=floattostr(MaximumComponentLength);
edit4.Text:=floattostr(FileSystemFlags);
edit5.Text:=FileSystemName;
end;

少し追加して確認したら5項目も取得できたので、これでいけるかな
と思ったのですが一応同時期に購入したパソコン2台で実行したら、
2台とも全く同じ内容でした。
せっかく取得できた情報ですので、この情報とOSのプロダクトIDを
からめた機能にしようと思います。引き続きレジストリの
>HKEY_LOCAL_MACHINE|Software\Microsoft\Windows\CurrentVersion
を調べてプロダクトID取得に向かいます。
取り急ぎ報告でした。


jok  2004-08-13 04:37:53  No: 10364

以前にもインストールされているオフィスのプロダクトIDを取得して、コピー
プロテクトにする、とかのような質問があったのですが、そのときにも疑問に
思ったことは、そのパソコンにユニークな何かを取得できたとしても、それを
使ってどうやってコピープロテクトするつもりなのかさっぱり分からないこと
です。

ゆきおさん、おおよその論理だけで結構ですのでどうするつもりなのか教えて
ください。


Taku  2004-08-13 10:23:22  No: 10365

OSのプロダクトIDではなくハードウエアー情報なら個別化できると思います。
レジストリーのHARDWARE\DESCRIPTION\System\CentralProcessorには
CPUの情報がありますし
実際にCPUクロックを測定する方法もあります

又、下のコードでメモリーサイズを取得しても宜しいかと
function GetPcMemorysize:DWORD;
var ms:TMemoryStatus;
begin
     try
  ms.dwLength:=sizeof(TMemoryStatus);
       GlobalMemoryStatus(ms);
       result:=ms.dwTotalPhys;
     except
         result:=0;
     end;
end;

jokさんへ  
PC個別のユニークな情報が取得できれば、それを元にIDを発行すれば良いと思います
例えば搭載メモリーサイズが123456として、IDは単純に123456や979899100101102など
方法はアイデアしだいで


jok  2004-08-13 13:33:04  No: 10366

Taku さん

> PC個別のユニークな情報が取得できれば、それを元にIDを発行すれば良いと思います

回答ありがとうございます。うーん、これは「PC個別のユニークな情報」を申告
するのでしょうか。動的にプログラムで取得するなら、コピー先でも区別できない
と思うんですが。そのソフトのユーザに気づかれないように「PC個別のユニーク
な情報」を、IDを発行する側(プログラムではなく)が知らなければならないと
思うんですが。


Taku  2004-08-13 18:16:12  No: 10367

そうですね。
ゆきおさんの最初の質問に戻ると
最初の起動時に取得して、2回目以降に照らし合わせると有りますが
それ自体では、ソフトのコピー防止にならないと思います。
「最初の起動時」の処理をソフトが動的に行なった場合、ほかのPCでも同じ事が可能で
ファイルを作成しても何の意味もありません。

質問の内容から、1台のPCをターゲットにして、それ以外では使えない方法と解釈しましたが
その場合は、どうしてもPCを特定する必要があると思います。

ちなみの、最初の質問ではファイルを隠すようにお考えですが
例えば、インストール時にPCを特定しない暗号のファイルを作成したとして
それを元に、IDを発行したとします。
使用者は、そのファイルを見つけて他のPCにコピーすれば同じように使用可能ですが
PCを特定したファイルであれば、それを他のPCにコピーしても
ソフト起動時にその情報とPCの個別情報を照合する事でコピーを阻止できますので
あえてファイルを隠す必要は無いと思います。


ゆきお  2004-08-14 01:15:31  No: 10368

jokさん、Takuさん、こんにちは。ご親切にありがとうございます。
今回の質問の根本は、プログラム自体はコピーされてしまう事はしよ
うがないので、コピーした場合のみプログラムが動かないようにした
くてと言う事でした。
以前はエクセルファイルを読み込む機能が付いていたのでオフィスの
IDを求めていたのですが、その機能を外したので
PC個別のユニークな情報が取得(ファイル化)できれば、プログラム
上での取得情報と比較すれば良いと思いました。
冷静に考えた結果、Takuさんのおっしゃるとおり
プログラムは基本的に私がインストール(と言ってもフォルダのコピー
だけです)することになっていますので、その時別プログラムで色々
なPC個別のユニークな情報を入れたファイルを同じフォルダ内に作り
今回のプログラムでその情報とPC上で取得した情報を照合するように
しようと思います。
情報はこれまで参考にさせていただいた「ハードウエアー情報」、
「メモリーサイズ」を照合しようと思います。OSのIDにこだわっ
たのは基本的に同一のIDが世界に1つしかないからと思ったからで
した。
説明が稚拙申し訳ありません。今後の向上のためにもう少しOSの
ID取得方法を調べてみようと思います。
宜しくお願いいたします。


ゆきお  2004-08-17 20:14:09  No: 10369

みなさまおはようございます。色々お手数おかけしました。
やっと当初の目的(OSのプロダクトID取得)を達成する事ができ
ました。
これを皆様の教えてくださった情報に絡めてやってみようと思います。
どうもありがとうございました。感謝申し上げます。


タムラ  2004-08-30 04:56:18  No: 10370

解決済みなのに申し訳ありません。
私も同じ問題に取り組んでいまして。

マシン固有のIDを取得して、そのIDから独自の方法で生成したキーを発行、それを入力しなければ起動しない、というような、ほぼ同じような考え方です。
で、問題は「マシン固有のID」の妥当なものは?という点です。
●プロダクトIDはレジストリを書き換えられるかもしれない
●ディスクのボリュームシリアル番号はフォーマットしたら変わる
要件としては、
●再インストールやフォーマットしても変化しない
●マシン固有のID
なのですが、何が妥当なところなのでしょう。
ウィンドウズアクティベーションで使われているハードウェアハッシュというのが使えそうな気もしますが、これの取得方法も解りません。
どなたか情報お持ちでしたら、お教えいただけないでしょうか。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加