C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ハードディスクかどうかの判定


(過去ログ 97 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■58182 / inTopicNo.1)  ハードディスクかどうかの判定
  
□投稿者/ たか@WEB屋 (15回)-(2011/03/28(Mon) 16:16:35)

分類:[.NET 全般] 

2011/03/28(Mon) 16:18:11 編集(投稿者)

パソコンの固有キーを元に ライセンス情報を登録し複数のパソコンで使えないよう管理しています。

その固有キーの情報の一つとしてハードディスク(Cドライブ)のボリュームシリアルナンバーを取得しているのですが
Cドライブがハードディスクではないという環境でエラーになってしまいます。

//現在のソース
ManagementObject disk = new ManagementObject("Win32_LogicalDisk.DeviceID=\"C:\"");
foreach (PropertyData property in disk.Properties) {
if (property.Name == "VolumeSerialNumber") {
return property.Value.ToString();
}


そこでCがダメならD、E・・・と対象を変えていこうと思うのですが
このユーザーの環境を確認したところ C〜GまでがリムーバブルディスクかCDROMドライブで
Hドライブでやっとハードディスクが出てくるようで・・・
(Cドライブはリムーバブルディスクでした)

リムーバブルディスクやCDROMドライブは起動する度に変わる可能性があるので 最初に発見したハードディスクのボリュームラベルを取得して
固有キーに使おうと思っていますがどのように判定すればいいのでしょうか?
いいアイディアあったら教えてください。

もしくはWindowsが入ってるディスクを取得する方法があればそれが一番安全かな?とも思っていますが方法がわかりませんのでわかったら教えてください。


あとふと思ったのですが 最近はSSDのみのパソコンも出てきていますが SSDの場合上記のソースでボリュームシリアルナンバー取れるんでしょうか?

お心当たりのかたいましたらよろしくお願いいたします。

書き忘れましたが環境は .netframework3.5SP1です。
引用返信 編集キー/
■58183 / inTopicNo.2)  Re[1]: ハードディスクかどうかの判定
□投稿者/ shu (569回)-(2011/03/28(Mon) 16:32:06)
No58182 (たか@WEB屋 さん) に返信

VB.NETですが
こんなんでどうでしょう?

       For Each di In DriveInfo.GetDrives
            Console.Write(String.Format("{0}:", di.Name))
            Select Case di.DriveType
                Case DriveType.CDRom
                    Console.WriteLine("CDROM")
                Case DriveType.Fixed
                    Console.WriteLine("Fixed")
                Case DriveType.Network
                    Console.WriteLine("NetWork")
                Case DriveType.Removable
                    Console.WriteLine("Removable")
                Case DriveType.Unknown
                    Console.WriteLine("Unknown")
            End Select
        Next

引用返信 編集キー/
■58184 / inTopicNo.3)  Re[1]: ハードディスクかどうかの判定
□投稿者/ 囚人 (603回)-(2011/03/28(Mon) 16:34:08)
全然回答じゃないですけど、ハードディスクなんて取り替えるパーツランキング上位なのに、そういう事に使うのどうなのって思った。

引用返信 編集キー/
■58185 / inTopicNo.4)  Re[1]: ハードディスクかどうかの判定
□投稿者/ 774RR (585回)-(2011/03/28(Mon) 16:36:29)
System.Environment.GetFolderPath
http://msdn.microsoft.com/ja-jp/library/14tx8hby(v=VS.90).aspx

こういう目的からすると SSD って単に HDD の速い奴にすぎないから、
ハードディスクにできることはすべてシリコンディスクで可能。

で。
俺の個人的意見を言わせてもらえば、こういうくだらないプロテクトはナンセンス。
破る方法などいくらでもあるし、ディスクがクラッシュしたら大騒ぎになるし、
フツーでないユーザの元で(この事例がまさにそう)トラブルが発生するだけだし。

それだけの価値があるなら ドングル でも使うほうがマシ。

引用返信 編集キー/
■58188 / inTopicNo.5)  Re[2]: ハードディスクかどうかの判定
□投稿者/ たか@WEB屋 (16回)-(2011/03/28(Mon) 17:00:46)
>shuさん
ありがとうございます。
早速試してみたいと思います。
たぶんこれでいけそうですね。助かりました。



>囚人さん
OS入ってるハードディスク変えたら再インストール時にエラーになってもしかたないと思ってくれるかな?と。
個別に連絡もらったらライセンス情報リセットして対応しています。

この掲示板の過去ログでも固有キーの話は出てて ハードディスクのボリュームシリアルナンバーとか
LANカードのMACアドレスとかいろいろ出てはいたけど 簡単に取得できる物で偽装しにくいのだと
ハードディスクかな?と。

>774RRさん
情報ありがとうございます。

ダウンロード販売で1件5000円程度で販売しているので まぁこれぐらいでいいかな?というレベルの認証でやってます。
マイクロソフトやAdobeだって相当お金かけて不正利用できないようがんばってるけど それでも不正版はあっという間に出回るのだから
個人レベルでどうがんばっても無理だと思ってるので たいして力は入れてません。
ただ 何もなしだとダウンロード販売なこともありすぐコピー版が出回ってしまうだろう?ってことでこうしています。
おかげで今のところ不正利用者は(たぶん)いないし 気に入って一人で複数購入してくれる人も結構いてうまく回ってますよ

逆コンパイルして該当部分をブリッジして・・・と確かにやる人がやればできるでしょうが
たかが5000円のためにそこまでやる人はそんないないだろうし 仮にいてもしょうがないと割り切りでやってます。


解決済み
引用返信 編集キー/
■58206 / inTopicNo.6)  Re[3]: ハードディスクかどうかの判定
□投稿者/ Azulean (719回)-(2011/03/28(Mon) 23:15:33)
No58188 (たか@WEB屋 さん) に返信
> この掲示板の過去ログでも固有キーの話は出てて ハードディスクのボリュームシリアルナンバーとか
> LANカードのMACアドレスとかいろいろ出てはいたけど 簡単に取得できる物で偽装しにくいのだと
> ハードディスクかな?と。

念のため。ボリューム シリアル番号を書き換えるツールは存在します。

# ぐぐったらさくっと見つかる範囲かと思います。
解決済み
引用返信 編集キー/
■58208 / inTopicNo.7)  Re[3]: ハードディスクかどうかの判定
□投稿者/ 魔界の仮面弁士 (2145回)-(2011/03/29(Tue) 00:03:29)
2011/03/29(Tue) 01:09:20 編集(投稿者)

No58188 (たか@WEB屋 さん) に返信
>>> 最初に発見したハードディスクのボリュームラベルを取得して
WMI ベースで問い合わせるならこんな感じ。

// MediaType = 12 は固定ディスク
var wql = "SELECT DeviceID, VolumeSerialNumber FROM Win32_LogicalDisk WHERE MediaType = 12";

using(var query = new ManagementObjectSearcher(wql))
using(var disks = query.Get())
{
 foreach( var mo in disks )
 {
  object dev = mo["DeviceID"];
  object vol = mo["VolumeSerialNumber"];
  Console.WriteLine("{0} - {1}", dev, vol);
  mo.Dispose();
  return (string)vol;
 }
}
return null;


> 気に入って一人で複数購入してくれる人も結構いてうまく回ってますよ
HDD シリアルとは異なり、HDD のボリュームシリアルは、
単体では固有キーになりえませんので注意してください。
(MACアドレスなど、他のキーと組み合わせて使う分には良いですが)

たとえばディスクイメージをコピーした場合、ボリュームシリアルも複製されます。

それゆえメーカー製PCの場合、同系統の型番だと、複数台の PC で
ボリュームシリアルが同一になっていることも、さほど珍しくありません。
複数台の PC を一括導入した事業所などでライセンスされた場合、
それらが同じ文字列を返してくる可能性があることを考慮しておきましょう。
解決済み
引用返信 編集キー/
■58215 / inTopicNo.8)  Re[4]: ハードディスクかどうかの判定
□投稿者/ たか@WEB屋 (17回)-(2011/03/29(Tue) 12:00:48)
2011/03/29(Tue) 12:02:22 編集(投稿者)

>Azuleanさん
ありがとうございます。これは知りませんでした。
確かにぐぐったらあっさり見つかりました^^

まぁボリュームシリアルナンバー単体をそのまま使ってるわけじゃなくてほかのキーと組みあわせて
暗号化したものを認証サーバーに送って認証しているので まず大丈夫かなぁ?と。
逆コンパイルに近いことして解析されたらアウトだけど まぁそこまで考えてやられたらしょうがない、ってことで
割り切ってます。



>魔界の仮面弁士さん
ありがとうございます。

>たとえばディスクイメージをコピーした場合、ボリュームシリアルも複製されます。

>それゆえメーカー製PCの場合、同系統の型番だと、複数台の PC で
>ボリュームシリアルが同一になっていることも、さほど珍しくありません。

これはどちらも知りませんでした。
単にボリュームシリアルが同一なだけなら大丈夫だけど
ディスクイメージごとコピーされたらもしかしたらアウトかもしれないなぁ
というかVMにインストールされてそのイメージを使いまわされたらたぶんどうしようもないなぁw

あまり詳しく書くと 自分で自分の首絞めることになりかねないので 仕様に関する詳しい部分は伏せさせていただきますが。。。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -