エクセルのプロダクトIDを検出する方法と操作の制限について

このQ&Aのポイント
  • エクセルのプロダクトIDを検出する方法とは何でしょうか?また、検出したプロダクトIDを利用してエクセルの操作制限を行うことは可能でしょうか?
  • エクセルのプロダクトIDを検出する方法とエクセル操作の制限について教えてください。
  • エクセルのプロダクトIDを検出し、そのプロダクトIDを利用してエクセルの操作制限を行いたいです。どのように実現できるでしょうか?
回答を見る
  • ベストアンサー

エクセル プロダクトIDを検出する方法が解りましたか゛それを使ってエクセルの操作ができませんか

Sub プロダクトIDを表示する() バージョン = Application.Version 一意識別子 = Application.ProductCode レジストリキー = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\" _ & バージョン & "\Registration\" & 一意識別子 & "\ProductID" プロダクトID = CreateObject("WScript.Shell").RegRead(レジストリキー) MsgBox プロダクトID, , "プロダクトID" End Sub この様なコードを発見しました プロダクトIDを使って エクセルが起動した時にプロダクトIDを検出して保存しておいて このプロダクトIDと違ったもので起動した時に開かないように   そんな事が実現できますでしょうか ご指南ください

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.7

'ThisWorkbookModule Option Explicit Private Sub Workbook_Open()   Const HKEY = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\"   Dim v As String  'Version   Dim p As String  'ProductCode   Dim a As String  'Path   Dim k As String  'Key   Dim x   Dim ws As Worksheet   On Error Resume Next   With ThisWorkbook     Set ws = .Worksheets("mysheet")     If ws Is Nothing Then       Set ws = .Worksheets.Add       ws.Name = "mysheet"     End If   End With   ws.Visible = xlSheetVeryHidden      On Error GoTo errH   With Application     v = .Version     If Val(v) < 10 Then       a = HKEY & v & "\Registration\ProductID\"     Else       p = .ProductCode       a = HKEY & v & "\Registration\" & p & "\ProductID"     End If   End With   k = CreateObject("wscript.shell").Regread(a)     x = ws.Range("A1").Value   If IsEmpty(x) Then     ws.Range("A1").Value = k   Else     If x <> k Then       MsgBox "no"       'ThisWorkbook.Close False     Else       MsgBox "ok"     End If   End If   Set ws = Nothing   Exit Sub errH:   MsgBox Err.Number & ":" & Err.Description   'ThisWorkbook.Close False End Sub ...こんな感じです。 後は工夫してみてください。

tompapa56
質問者

お礼

とっても 勉強になりました 本当にありがとう御座いました。

その他の回答 (6)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.6

ProductIDをどこかに記録する必要があります。 レジストリあるいは非表示シートのどこかのセル、など。 非表示シートの場合、マクロから表示されないようパスワード付きでBookの保護も必要。 例えばSheet1のA1セルに記録するとしたら、 'ThisWorkbookModule Option Explicit Private Sub Workbook_Open()   Const HKEY = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\"   Dim v As String  'Version   Dim p As String  'ProductCode   Dim a As String  'Path   Dim k As String  'Key   Dim x   On Error GoTo errH   With Application     v = .Version     'Excel2000の場合キー位置が違う。(と思う)     If Val(v) < 10 Then       a = HKEY & v & "\Registration\ProductID\"     Else       p = .ProductCode       a = HKEY & v & "\Registration\" & p & "\ProductID"     End If   End With   k = CreateObject("wscript.shell").Regread(a)   'MsgBox k      '隠しシートにProductIDを記憶するようにする。   x = Sheet1.Range("A1").Value   If IsEmpty(x) Then     Sheet1.Range("A1").Value = k   Else     If x <> k Then       MsgBox "no"       'ThisWorkbook.Close False     Else       MsgBox "ok"     End If   End If   Exit Sub errH:   MsgBox Err.Number & ":" & Err.Description End Sub マクロ無効化対策については下記ページを参考に工夫してください。 http://homepage2.nifty.com/kmado/kvba.htm (ここの E00M090 [マクロを無効にする]で開くと使えないxlsファイル )

tompapa56
質問者

補足

ご指南ありがとう御座います うまくいきました 本当にありがとう御座います たとえば '隠しシートにProductIDを記憶するようにする なのですが オープン時mysheetを作ってi65535にIDを格納の場合 どのように すれば 良いのでしょうか  よろしくお願いいたします

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

> 初めて起動した時にフォームを出してID入力をさせて というのも マクロが実行できることが前提です マクロを禁止されてしまえば意味を成しません マクロ起動が出来るのであれば UserFormに適切なコントロールとイベントハンドラを記述すれば可能です

tompapa56
質問者

補足

どのようにすればよいのでしょうか ご指南よろしくお願いいたします

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

>マクロを使用禁止 ----使用可能しか選択させないです >Shift+クリック--------禁止にしたいです これは無理でしょ マクロの使用禁止はユーザーが ツール > マクロ > セキュリティで設定変更が可能です あなたが渡す人に強制は出来てもそこから二次配布された先へ強制する術はありません Shift+Clickに関しても Excel自体を改変しなければ対処不能です こちらも 少し調べれば簡単にマクロを起動時に実行させない方法としての情報が得られます 保存時のパスワードならあなたが配布した一次配布先の人間がパスワードを漏らさない限り二次配布先で読み込まれるのを大部分において回避できるように思います ただ1つの弊害は一次配布先でも起動時に毎回パスワードを要求される点でしょう

tompapa56
質問者

補足

お返事ありがとう御座います >一次配布先の人間がパスワードを漏らさない限り二次配布先 漏らしてしまうと意味がないので 色々と悩んでいます たとえば 初めて起動した時にフォームを出してID入力をさせて開くたびにIDチェックをさせ違ったIDで開くと開かない同じID開くとフォームは出ない その様は事の実現は無理でしょうか よろしくお願いいたします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

マクロを使用禁止にしていたりShift+クリックで起動した場合の対処はどのようにしますか マクロは万能ではありませんよ

tompapa56
質問者

補足

マクロを使用禁止 ----使用可能しか選択させないです Shift+クリック--------禁止にしたいです よろしくお願いいたします

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

疑問 1回目と2回目以降プロダクトIDが違う場合は、同じパソコンで実行していると、ありえないように思いますが。 他パソコンにコピーされて(あるいは実行プログラムを記録した媒体を他のパソコンに移して)実行されないようにしたいのでしょうか? この場合は1度目にファイルにプロダクトIDを記録するとして、記録しても、他のパソコンに、プロダクトIDを書いたそのファイルが(本体ソフトとともに一緒に)移る仕組みが難しいと思うが。

tompapa56
質問者

補足

ありがとう御座います。 >他パソコンにコピーされて実行されないようにしたいのでしょうか 其の通りです。 渡した相手が他の人に渡した場合使用出来ないようにしたいのです。 よろしくお願いいたします

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ThisWorkbookモジュールのWorkbook_Openイベントで プロダクトIDをレジストリーから取得して違ったら バージョン = Application.Version 一意識別子 = Application.ProductCode レジストリキー = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\" _ & バージョン & "\Registration\" & 一意識別子 & "\ProductID" プロダクトID = CreateObject("WScript.Shell").RegRead(レジストリキー) if プロダクトID <> "xxxxx-xxx-xxxxxxx-xxxxx" then ThisWorkbook.Close end if などを実行すればいいのでは 私なら ブックの保存時のパスワードを設定するほうをお勧めしますが

tompapa56
質問者

補足

何時もありがとう御座います。 説明不足ですいません 1回目にファイルを開いた時にプロダクトID 取得 2回目以降は其の取得したIDとの整合性をチェックして開くか開かないかを決める。2回目以降を違うIDで開けない。 そんなを実現したいのです よろしくお願いいたします。 

関連するQ&A

  • EXCELのプロダクトID取得について

    システム部門のPC管理者です。 PC資産管理のため、各PCに入っているExcelのライセンスやプロダクトIDを取得する必要があります。 EXCELVBAを使って取得する方法は分かったので、Excelをメールで送ってボタンを押してもらうだけのアプリを作ったのですが、EXCELは必ずワーニングが出ることから、なかなか開いて貰えません。 そこで、強制的にログインスクリプトの中に入れてしまうことを考えております。VBAのソースを移植して、他のプロパティは成功したのですが、ProductCode というプロパティだけ取り出せません。 ver = Application.Version prd_cd = Application.ProductCode reg = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\" _ & ver & "\Registration\" & prd_cd & "\ProductID" prd_id = CreateObject("WScript.Shell").RegRead(reg) Excelのバージョンは何種類かあるので、共通の方法で取り出す方法はあるのでしょうか? ネットで検索してみましたが、探し方が悪いのか見つかりませんでした。経験のある方がおられましたら、アドバイスお願いします。

  • WindowsXPのシリアルナンバー確認方法とプロダクトIDとの違い

    いつもお世話になっております。 WindowsXPのインストール済みPC上で、 シリアルナンバーを確認方法する方法を探しています。 ご存知の方がいれば教えていただけないでしょうか? プロダクトIDであればレジストリの以下の場所に記述があることはわかったのですが、シリアルナンバーの調べ方は見つかりませんでした。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion のProductId よろしくお願いいたします。

  • Officeをインストールせずに、プロダクトIDを確認したい

    会社に、複数のOfficeがあります。 誰がどの製品でインストールしているかが曖昧で、それを調べたいです。 知りたいことは以下の2点です。 どうかよろしくお願い致します。 1)ヘルプ-バージョン情報で、プロダクトIDが表示されますが、Officeをインストールせずにこれを確認する方法はありますか? (CDの\FILES\SETUP\SETUPという設定ファイルを開くと、上の方に「ProductCode={…」とありますが、こちらですか?) 2)アップグレード版をインストールした際、IDは古いもののままで据え置かれるのですか?それともアップグレードしたものに置き換わるのでしょうか。

  • 一意なID

    コンピュータ内でなるべく不変で一意な値を組み合わせて、ネットワーク上でほぼ確実に一意な識別子を作りたいと思います。 ユーザー名やコンピュータ名だけでは一意性に欠けるので、ユーザーIDとOSシリアルナンバー、MACアドレスなども足したいのですが、それらは何を参照すればいいのでしょうか? レジストリのパスや関数名などあれば教えてください。 ユーザーIDはHKEY_USERS\S-?-?-??-???・・・に入っていますが、たまにここに複数あって、どれが自分のIDなのかわかりません。 MACアドレスもNICが複数刺さっている場合のプライマリの検出方法など。 ほかにもここに挙げたもの以外に、何かできるだけ一意で不変なものがあったら、教えてください。 IPなど頻繁に変わる可能性があるものはだめです。 開発環境 XP Pro SP1 + VB.NET 言語はVB.NETですが、これに依存しない手段でもかまわないのでVBのカテゴリには入れてません 実行環境 2000またはXP

  • WSH レジストリのキーが存在するかチェックしたい

    WSHを使って、アプリケーションのインストール作業を行っています。 その際、現在インストールされているアプリケーションのバージョンをチェックするのですが、レジストリのキーが存在するかどうかの確認方法が分かりません。 現状は、RegReadにて、キーが存在するかどうかをチェックしようとしているのですが、キーを読み込んだ場合、規定値を読み込むため、規定値が「値の設定なし」になっている場合、エラーになってしまいます。 (キーが存在しない場合とエラーコードが同じのようで、エラーによるチェックも出来ません) 例)WScript.Echo WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\maker\softwere\5.0\") 何か、良い方法はありませんでしょうか?

  • WindowsのプロダクトIDを取得する方法について

    WindowsのプロダクトIDを取得する方法について Active Basic 4.24.00を使用してプログラムを書いています。 (AB5はバグがあるためまだ使用していません。) http://www.ruriplus.com/msaccess/tch/tch_036.html 上記のサイト様を参考に、WindowsのProduct IDを取得しようとしています。 (参考というより、コピペなのですが・・・) しかし、きちんと取得してくれません。 AB用に以下のように書き直しました。 Function GetWinProductId() As String Dim stSubKey As String Dim stProductid As String Dim hkeyRoot As HKEY Dim lErr As Long Dim OSVER As OSVERSIONINFO Dim dummy As Long stProductid=ZeroString(256) OSVER.dwOSVersionInfoSize = Len(OSVER) lErr = GetVersionEx(OSVER) If lErr = 0 Then Exit Function If OSVER.dwPlatformId = VER_PLATFORM_WIN32_NT Then stSubKey = "SOFTWARE\Microsoft\Windows NT\CurrentVersion" Else stSubKey = "SOFTWARE\Microsoft\Windows\CurrentVersion" End If lErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, stSubKey, &0, KEY_READ, hkeyRoot) If lErr <> 0 Then MessageBox(0,"ERROR","1",0) Exit Function End If lErr = RegQueryValueEx(hkeyRoot, "ProductId", &0, REG_SZ,stProductid, 256) If lErr <> 0 Then MessageBox(0,"ERROR","2",0) Exit Function End If lErr = RegCloseKey(hkeyRoot) If lErr <> 0 Then MessageBox(0,"ERROR","3",0) Exit Function End If GetWinProductId = Left$(stProductid, 255 /*InStr(1, stProductid, vbNullChar, vbBinaryCompare)*/) End Function MessageBox(0,GetWinProductId(),0,0) ※ Left$(stProductid, 255 /*InStr(1, stProductid, vbNullChar, vbBinaryCompare)*/) この部分は、よく分からなかったので、とりあえず放置しています。 その前に、変数『stProductid』に値が帰ってこないのです。 (RegQueryValueExでエラーが返る。FormatMessageでエラーを見ると、正常終了している。・・・が、0以外の値が返ってくる) すいませんが、ご存知の方、やり方をご教示ください。 お願いします。

  • スパイウェアと疑わしいファイルの削除方法

    先日ad-awareを使用してスパイウェアを削除しようとしたところ、下記のレジストリキーとファイルが削除できませんでした。 CnsMin key:HKEY_CLASSES_ROOT\clsid\{b83fc273-3522-4cc6-92ec-75cc86678da4}\ CnsMin key:HKEY_CLASSES_ROOT\cnshelper.ch\ CnsMin key:HKEY_CLASSES_ROOT\cnshelper.ch.1\ CnsMin key:HKEY_CLASSES_ROOT\interface\{df692509-d9ef-48a0-9cd0-3aa5b81f6f68}\ CnsMin key:HKEY_LOCAL_MACHINE\software\3721\ CnsMin key:HKEY_CURRENT_USER\software\3721\ CnsMin key:HKEY_LOCAL_MACHINE\software\interchina\ CnsMin key:HKEY_LOCAL_MACHINE\software\microsoft\internet explorer\advancedoptions\!cns\ CnsMin key:HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\uninstall\cnsmin\ CnsMin key:HKEY_CLASSES_ROOT\typelib\{aab6bce3-1df6-4930-9b14-9ca79dc8c267}\ CnsMin key:HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\explorer\shellexecutehooks\{b83fc273-3522-4cc6-92ec-75cc86678da4} CnsMin file:C:\WINDOWS\Downloaded Program Files\cnsio.dll cnsio.dllのほうは検索にも引っかからないし、 レジストリキーも削除しても再起動するとしっかり入っています。 これらを完全に削除する方法はないでしょうか?

  • VBにて特定のレジストリキーの削除について

    PC起動時に特定のキー以下すべてを削除するツールを検討しています。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_****&PID_**** が目的のキーです(当然ですが****には特定の値が書き込まれています)。 同一メーカのUSB機器を検査するためにとっかえひっかえ接続することでプロダクトID別のSUBキーが 作成されます。 いずれSUBキーが膨大になってしまうことを回避するための予防策と考えています。 環境はVB 2008EE です。 OpenSubKeyもしくはCreateSubKeyにて開けばよいことはわかりましたが SecurityExceptionが発生して開くことができません。 HKEY_LOCAL_MACHINE\SYSTEM\ は問題なく開くことができています。 VB6+API関数で実行しても同様の結果となるので VB側ではなくむしろレジストリ(Windows側)の制約なのでしょうか。 何か良い手立てはあるのでしょうか。 また、「わざわざ作らなくても、これがあるよ」という情報も歓迎しています。 諸先輩方、お力をお貸しください。

  • Windows95と98のユーザー登録情報変更法を

    Windows95と98について ユーザー登録情報を変更するという場合です。  バージョン情報で表示されるユーザー登録情報を変更する方法について。 スタートボタンから 「ファイル名を指定して実行」でregeditと入力し、レジストリエディタを起動する。その中のHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion まではたどり着けるのです。 そこから どのフォルダに以下があるのか教えていただけますか。 ProductId(CDキー) RegisteredOrganization(会社名) RegisteredOwner(ユーザー名)

  • インストールしたソフトのライセンス管理について

     ライセンス管理について教えてください。  私の会社ではMS-Office(バージョン不明)を2000本ほど使用しているのですが、この2000本がどのような用途で購入したのかわかりません。  (パッケージ or プリインストール or ボリュームライセンス)  インベントリ収集ツールなどを使用して、現在インストールしてあるOfficeが、どのような形態で購入したのかを識別する方法はないでしょうか?  例えば、インストールした際に付与されるプロダクトIDをインベントリ収集ツールなどで収集し、そのプロダクトIDを一定の法則で整理し、購入方法を識別するなど、です。 (プロダクトIDで識別できるかどうかは、定かではありませんが・・・)  誰かお助けください。よろしくお願いします。