- ベストアンサー
Accessで任意のWindowsユーザー名のみ起動可能なフォームを作成することは可能でしょうか
Accessで作成したフォームに不特定のコピーを防止するための制限をかけたいのですが可能でしょうか。 任意のWindowsユーザー名のみ起動可能にできれば最も望ましいのですが。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
お待たせしました。 エラー検証が出来ましたので、再度… マクロの「プロシージャの実行」で指定できる関数は、Function関数のみでした。スミマセン。 したがって、この部分を書き直してください。 Public Sub sub起動チェック() ↓ Public Function sub起動チェック() これで実行できます。 試しに、このモジュールとマクロを組み込んだMDBを作成しエクスフローラから実行してみました。 「db1.mdbが見つかりません。パスおよびファイル名が正しいか~確認してください」というメッセージが出ますが、これは起動直後にあっという間に終了させたため表示されるメッセージです。 終了させる時にメッセージを表示させればこのエラーは出なくなります。 ↓修正バージョン Function sub起動チェック() If Environ("USERNAME") <> "vaio" Then MsgBox "使用できない旨のメッセージ", vbOKOnly + vbExclamation DoCmd.Quit acQuitSaveNone End If End Function
その他の回答 (4)
- PrintScree
- ベストアンサー率25% (538/2091)
>を貼り付けてみたのですが、普通に起動しダメみたいです。 貼り付けただけではダメですよ(汗; この関数をmdbを読み込んだ時に実行するよう仕掛けが必要です。 例えば、マクロを新規作成し、以下のように記述します。 ・アクション:プロシージャの実行 プロシージャ名:sub起動チェック() と記述し、AutoExecという名前で保存します。 こうすると、mdbを開いた時に AutoExec マクロが自動実行され記述されているアクション(この場合はsub起動チェック())が実行されます。 マクロを保存したら一旦Accessを終了させ、再度mdbを開くと思い通りに動くと思います。
お礼
ありがとうございます 丁寧な解説助かります。 マクロを実行すると 「Access が見つけることができない関数名が含まれています」とメッセージが出ます。 式ビルダでみると、作ったプロシージャでは下段の3つのウインドウの右端になにもでてきません。 すみません。とんちんかんなことをいっているでしょうか・・ ちなみにAccess 2000です
s_husky です。 具体的なコードを見るとガッカリしますよ! 次の3行を某関数に仕組むだけです。 If Not FileExists("C:\Windows\Client.dll") Then Application.Quit End If Startupのコードは1行です。 FileWrite "C:\Windows\Client.dll", "んlffklfんkl;kl;" ******************************************************************************* Public Function FileExists(ByVal FileName As String) As Boolean Dim fso As FileSystemObject Set fso = New FileSystemObject FileExists = fso.FileExists(FileName) End Function Public Function FileWrite(ByVal FileName As String, _ ByVal Text As String) As Boolean On Error GoTo Err_FileWrite Dim fso As FileSystemObject Dim txs As TextStream Set fso = New FileSystemObject Set txs = fso.CreateTextFile(FileName, True) txs.Write Text FileWrite = True Exit_FileWrite: Exit Function Err_FileWrite: MsgBox Err.Description & "(FileWrite)", vbExclamation, " 関数エラーメッセージ" Resume Exit_FileWrite End Function
お礼
ありがとうございます 難しいですね。 コードはさっぱりです。
No1さんの回答が基本です。 ですから、これは、読み流してもらって結構です。 1、MDEファイルに変換する。 ・これで、事実上、フォームのコピーは無意味になります。 2、他のPCでの使用を禁止する。 大概のフォームで使っている関数の一つにコピーを感知して終了する仕掛けを施す。 ・Windwosフォルダーに Client.dll などのさも在りそうなファイルを仕込む。 ・一つの関数でClient.dllの有無を調べて、無ければ終了する。 ・MDEにしておれば、この仕組みは解析不能です。 ※Startup.exe を用意してClient.dll を忍ばせる訳ですが、結構、ばれません!
お礼
ありがとうございます。 おもしろい方法ですね。 ぜひ試してみたいのですが、具体的なコードをお教え願えないでしょうか?
- PrintScree
- ベストアンサー率25% (538/2091)
mdbファイルのコピーを制限するのは難しいと思います。 mdb自体にパスワードを設定して、パスワードを知っている人だけ使えるようにすることは出来ます。 特定のログオンユーザーでだけ実行できるようにするのは、 環境変数 USERNAME の内容を調べ、特定の文字列(ユーザー名)と一致しなかったら終了するというプロシージャを起動モジュールとして指定すれば、望ましい形になるのではないでしょうか? Public Sub sub起動チェック() If Environ("USERNAME") <> "ここに任意のユーザー名を記述" Then ' 複数のユーザー名を指定したい場合は Or を使用する。 DoCmd.Quit acQuitSaveNone Endif End Sub ただ、Shiftを押しながら起動させると、起動時の設定で指定された部分は無視されるので、完璧ではありません。
お礼
ユーザー名が vaio のパソコンで、Option Compare Database の下の行に Public Sub sub起動チェック() If Environ("USERNAME") <> "vaio" Then DoCmd.Quit acQuitSaveNone Endif End Sub を貼り付けてみたのですが、普通に起動しダメみたいです。 追加アドバイスをいただけるとうれしいのですが
お礼
おかげさまで無事できました。 丁寧な解説で最後までおつきあいいただき本当にありがとうございました。 お手数をおかけいたしました。