- PR -

【C#】システム・マシン固有情報の取得方法?

投稿者投稿内容
初心
会議室デビュー日: 2004/06/23
投稿数: 15
投稿日時: 2006-02-27 14:47
いつも皆様の意見を参考にさせていただいています。

C#(2005)を使用してスマートクライアントにて開発を行っています。
そこで一つ壁に突き当たってしまい、皆様のアドバイス等をお聞かせ頂ければと思い、
投稿させていただきました。

スマートクライアントにてサーバーアプリ側でクライアント数等の制限を行いたいと思っています。
そこでクライアントのプログラム上にてシステムか、マシンの固有情報を取得したいと思っています。
過去のレス等を参考にしていると、マシン名を使用している方が多いようなのですが、
マシン名だと容易に変更可能なのがネックとなってしまいます。

可能であれば、CPUのIDやWindowsの固有ID等が取得できれば良いと考えています。

良いお知恵、ならびに取得方法等があればご教授頂ければ幸いです。
よろしくお願いします。

甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-02-27 15:45
引用:

初心さんの書き込み (2006-02-27 14:47) より:
スマートクライアントにてサーバーアプリ側でクライアント数等の制限を行いたいと思っています。


スマートクライアントと言うのは技術用語じゃないです。ASP.NETやClickOnceやWEBサービスやOfficeやPocketPCを使ってリッチなクライアントサーバーアプリケーションを作りましょう。って話でしかないです。どんな要素技術を使っているのかきっちり書きましょう。

引用:

可能であれば、CPUのIDやWindowsの固有ID等が取得できれば良いと考えています。


CPUのIDや、Windowsの固有IDなんて物は無いです。

一番現実的なのは、全ユーザーにユーザーIDとパスワードを配ってログインしている人数をカウントする事。もちろん一定時間操作を行っていないユーザーは強制的にログアウトって事で。
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-02-27 22:12
マシン固有のIDと言うわけではありませんが,ある程度マシン固有で,取得可能で,変更が面倒というものでよければ,ハードディスクのボリュームシリアル番号があります。

(参考)VB2005での取得方法
参照設定:System.Management
コード:

Imports System.Management

Public Function VolumeSerialNumber() As String
Dim Disk As New ManagementObject("Win32_LogicalDisk.DeviceID=""C:""")
For Each PropertyData As PropertyData In Disk.Properties
If PropertyData.Name = "VolumeSerialNumber" Then
Return PropertyData.Value.ToString
End If
Next
Return Nothing
End Function


参考資料:PINVOKE.NET GetVolumeInformation


[ メッセージ編集済み 編集者: YAS 編集日時 2006-02-27 22:16 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-28 01:32
引用:

初心さんの書き込み (2006-02-27 14:47) より:

可能であれば、CPUのIDやWindowsの固有ID等が取得できれば良いと考えています。


MAC アドレスだろうと何だろうと完全にユニークであると保証があるものは存在しません。

引用:

過去のレス等を参考にしていると、マシン名を使用している方が多いようなのですが、
マシン名だと容易に変更可能なのがネックとなってしまいます。


普通は変更してしまった場合にログインできないようにするのが一般的なんじゃないでしょうか?
成りすまし防止のために「パスワード」があるわけですし。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-28 06:18
引用:

甕星さんの書き込み(2006-02-27 15:45)より:

CPUのIDや、Windowsの固有IDなんて物は無いです。


甕星さんにじゃなくて。

 一部、ID のある CPU がありますが、デフォルトでは「通知しない」ので、無いに等しいです。

 Windows では、インストール時に入力するプロダクト ID が一見固有の ID になりそうですが、契約形態によっては事業所内のすべてのコンピュータのプロダクト ID が同一ということは十分あり得ます。
# HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/ProductId

 ホスト名は、すぐに変更可能ですが、同じ LAN 上に複数の同じ名前が存在できませんし、変更後は再起動しないと反映されませんから、今接続中のユーザの数、に限れば、ある程度有効でしょう。
 同じように、IP アドレスも、同一セグメント内にファイアーウォールを通して接続しているなどという形態でない限り、有効でしょう。


 ASP.NET で、Web アプリケーション形態であれば、クライアントの固有な情報は IP アドレスくらいしか取れません。もっとも、IP アドレスがマシン固有かというと、疑問ですが。

 クライアントで実行するアセンブリがあるなら、そのアセンブリがホスト情報を取得することが出来る可能性はあります。しかし、よく考えてください。「スパイウェア」って、そういう情報を取って、どこか知らないところへ送信するんじゃないですか?というわけで、クライアントアプリケーションの配布形態によっては、セキュリティ例外が発生します。
初心
会議室デビュー日: 2004/06/23
投稿数: 15
投稿日時: 2006-02-28 11:06
甕星様
大変申し訳ありません。
イメージで伝えようとしてしまったのが裏目に出てしまいました。

>一番現実的なのは、全ユーザーにユーザーIDとパスワードを配ってログインしている人数をカウントする事。もちろん一定時間操作を行っていないユーザーは強制的にログアウトって事で。
本来ならこの形で行う方が良いですよね。
現行のシステムでは、自己登録型になってしまっています。
自分のログインユーザーは、管理者が登録して自分でメンテナンスを行う形式です。
また、ログインしないユーザーを別途同一テーブルで管理してしまっています。
なので、なんとかクライアントプログラムがインストールされているマシンを個別に識別出来ない物かと考えておりました。

YAS様
ソースまで記述して頂きありがとうございます。
ハードディスクのボリュームシリアル番号も候補の中に入れさせて頂き協議してみます。

じゃんぬねっと様
やはり完全にユニークであると保証されるものはありませんよね。
ただ頻繁に変更する事が少ないものを選出したいと思っておりました。
また、変更してしまった場合には、別途プログラムにて変更のメンテナンスを行う事を前提としております。
但し、管理の頻度を下げられるだけ下げて行きたいと思っています。

Jitta様
>一部、ID のある CPU がありますが、デフォルトでは「通知しない」ので、無いに等しいです。
やはりそうですよね。簡単に取得可能であればセキュリティ上問題が発生しかねないとも思っておりました。
しかしながら、そういった状況になった場合、皆様ならどのような対応をしているのかと思いまして。(そのような状況にならないのが望ましいと思いますが・・・)

>コンピュータのプロダクト ID
これについても社内にて検証した結果、Jitta様の言うとおり社内で共通となっておりました。
現在、IPアドレス、ホスト名等が候補もあります。また、残念ながら(?)クライアントにて実行するアセンブリは存在しません。やはりどうしてもセキュリティが絡んでしまいますよね。

IPアドレス、ホスト名、ハードディスクのボリュームシリアル番号等の幾つかを提案させて頂きたいと思います。
大変勉強になりました。(と共に、自分の勉強不足を痛感致しました)
皆様、本当にありがとうございました。





Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-28 21:26
引用:

初心さんの書き込み(2006-02-28 11:06)より:

IPアドレス、ホスト名、ハードディスクのボリュームシリアル番号等の幾つかを提案させて頂きたいと思います。


 いえ、あの、HDD のボリュームシリアル番号は、クライアントにインストールするものがないと取得できませんよ?!
 これ、WMI だけど、他のコンピュータに接続して、そのコンピュータの情報を取得って、出来るのかな?


 それで、

> クライアントプログラムがインストールされているマシン
と、
> クライアントにて実行するアセンブリは存在しません。

が、矛盾しているんですけど???「アセンブリ」という言い方が悪かった?「プログラム」のことです。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-02-28 21:30
引用:

Jittaさんの書き込み (2006-02-28 21:26) より:
 いえ、あの、HDD のボリュームシリアル番号は、クライアントにインストールするものがないと取得できませんよ?!
 これ、WMI だけど、他のコンピュータに接続して、そのコンピュータの情報を取得って、出来るのかな?



Default だと Administrators Group に所属していないと無理ですね。
DCOM の設定と WMI の Security 設定を緩和させれば、一般 Users にも
開放することはできます。

.NET では検証していないので、あしからず。
# ほかに設定が必要かも?・・

スキルアップ/キャリアアップ(JOB@IT)