- ベストアンサー
ACCESS ログイン名によるセキュリティ
再度、こちらで質問させて頂きます。 フォームを開く時に、ログイン名を判断して開閉することは可能でしょうか? テーブルに複数のログイン名をマスタとして持ち、登録されているログイン名だった場合、フォームを開き、違った場合、メッセージが出るようにしたいです。 VBAの場合、初心者ですので、どう組み立てればよいかわかりません。 構文の例も挙げていただけると、助かります。 宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
すみません分かりにくいのでこちらを参考にしてください。 ■標準モジュール Option Compare Database Option Explicit Declare Function GetUserName Lib "advapi32.dll" Alias _ "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long Public Function GetUsrName() As String Dim buf As String * 255 Dim ret As Long ret = GetUserName(buf, Len(buf)) GetUsrName = Left(buf, InStr(buf, vbNullChar) - 1) End Function ■チェック画面(フォーム) Private Sub Form_Load() Do While UserID.Value <> "" If GetUsrName = UserID.Value Then MsgBox ("認証成功") 'Unload Me 動作確認用にコメント化 Exit Sub End If DoCmd.GoToRecord , , acNext Loop MsgBox ("認証失敗") 'Unload Me 動作確認用にコメント化 End Sub ■マスターテーブル(テーブル) フィールド1:UserID テキスト型 ※主キー フィールド2:UserName テキスト型 ☆マスターテーブルを仮に[T_UserList]として作成し、フォームウイザードを使用して[T_UserList]の単票フォームを作ります。 このフォームのコードを変更すると簡単にチェック用画面が作れます。 動作確認が済んだらチェック用画面のテキストボックスを不可視にしたほうがセキュリティ上いいです。 余談ですがアクセスの起動時の設定でアクセスを立ち上げると自動的にチェック用画面が立ち上がる設定で使用するわけですが・・・。 アクセスをWクリックなどで起動した直ぐにシフトキーを押しっぱなしにするとこの自動起動が殺されチェック画面が起動しません。 悪用されないよう気をつけてください。
その他の回答 (5)
- avanzato
- ベストアンサー率54% (52/95)
#4の回答です。 >フォームの開く時イベントにイベントプロシージャに設定し、「認証成功」と「認証失敗」を表示することができました。 おめでとうございます。 >しかし、ログイン名を取得できません。 >標準モジュールにコピー後、そのまま何もしないのでしょうか? >APIとは? >標準モジュールにコピー後どうしたらよいのでしょうか? フォームを開くときのコードに If GetUsrName = UserID.Value Then と言う箇所があります。 このGetUsrNameを定義しているのが標準モジュールのAPI関数になります。 API関数とは簡単に言えばVBの拡張機能だと思って貰えればいいと思います。 もしログイン名を確認したいようでしたら MsgBox ("認証成功")を MsgBox (GetUsrName) に変更して見てください。 正常に動いていればログインユーザー名が表示されます。
- avanzato
- ベストアンサー率54% (52/95)
>なかなか理解できず、申し訳ないです。 いえ、こちらこそうまい説明が出来ず申し訳ない。 #3で書いたAPIを標準モジュールに、それ以降の部分はチェック用のフォームのコードになります。 マスターテーブルの名前はフォームプロパティのレコードソースに指定する為コードには出てきません。 現状での状態を画像で載せます。
補足
何度もありがとうございます。 フォームの開く時イベントにイベントプロシージャに設定し、「認証成功 」と「認証失敗」を表示することができました。 しかし、ログイン名を取得できません。 標準モジュールにコピー後、そのまま何もしないのでしょうか? APIとは? 標準モジュールにコピー後どうしたらよいのでしょうか? 宜しくお願いします。
- avanzato
- ベストアンサー率54% (52/95)
そういうことであれば標準モジュールに次の構文を追加してください。 Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long Public Function GetUsrName() As String Dim buf As String * 255 Dim ret As Long ret = GetUserName(buf, Len(buf)) GetUsrName = Left(buf, InStr(buf, vbNullChar) - 1) End Function ↑APIを使用します。 次に#1のコードを Private Sub Form_Load() Do While UserID.Value <> "" If GetUsrName = UserID.Value Then MsgBox ("認証成功") 'Unload Me 動作確認用にコメント化 Exit Sub End If DoCmd.GoToRecord , , acNext Loop MsgBox ("認証失敗") 'Unload Me 動作確認用にコメント化 End Sub ↑チェック用画面読込にコードを走らせます。 >説明不足ですみません。 いえ、実は内心こちらかもと思ってコードは組んでました^^;
補足
コード作ってくださっていたんですね。 ありがとうございます。 また質問になってしまうのですが、 同標準モジュールにどちらも貼り付けて宜しいのでしょうか? またマスタテーブルの名前がまだ決まっていないので、決まり次第変更したのですが、どの部分にあたりますか?? なかなか理解できず、申し訳ないです。 宜しくお願いします。
- avanzato
- ベストアンサー率54% (52/95)
- avanzato
- ベストアンサー率54% (52/95)
こんにちは。 最初にユーザチェック用のフォームを表示させログイン名を入力し認証させる方法でしたらこちらでどうでしょうか? Option Compare Database Option Explicit Private Sub Cmd_Check_Click() Do While UserID.Value <> "" If UserIDCheck = UserID.Value Then MsgBox ("認証成功") Exit Sub End If DoCmd.GoToRecord , , acNext '次のレコードへ移動 Loop MsgBox ("認証失敗") End Sub 認証成功となっているところに次のフォームを表示させ、失敗であれば警告を表示させる感じになります。 添付画像を参考にお願いします。
お礼
こんにちは。 無事に成功しました。 長々とお付き合い頂いた上に、丁寧な対応に感謝しきれません。 ありがとうございました。