データ アクセス オブジェクトを使用してユーザレベル セキュリティを設定する方法

◆概要
 この資料は、Microsoft Accessでデータ アクセス オブジェクトを使用してユーザレベル セキュリティを設定する方法について記載しています。


Accessのメニュー コマンドを使ってアプリケーションに対してユーザレベル セキュリティを設定する代わりに、Visual Basicのコードでセキュリティを制御するデータ アクセス オブジェクト(DAO)を操作して、セキュリティを設定することもできます。


ユーザーレベルのセキュリティのため、テーブル、クエリー、フォーム、レポート、マクロ、モジュールなどのすべてのAccessオブジェクトは、ドキュメントとして扱われ、DocumentオブジェクトとDocumentsコレクションから操作されます。これらには、UserオブジェクトとGroupオブジェクト、またUsersコレクションとGroupsコレクションがあります。UsersコレクションおよびGroupsを操作すると、どのユーザーがどのグループに所属するかを管理できます。権限とは、特定のUserオブジェクトおよびGroupオブジェクトに割り当てられたDocumentオブジェクトのプロパティです。

DAOオブジェクトと、そのプロパティおよびメソッドを利用すると、次のことが行えます。

  • ユーザー アカウントとグループ アカウントの作成
  • パスワードの変更と削除
  • オブジェクトの所有権の変更
  • オブジェクトに対する権限の割り当て

また、DAOオブジェクトを使うと、メニュー コマンドで行うことのできない操作を実行できます。たとえば、セキュリティ定数dbSecDBCreateを使ってコードを記述すると、ユーザーが新規データベースを作成できなくなります。また、dbSecCreate定数を使ってTables Containerオブジェクトに対する権限を無効にすると、ユーザーはデータベース内で新しいテーブルやクエリーを作成できなくなります。


参照 ユーザーによる新規データベースの作成を禁止する方法の詳細については、後の「ユーザーによる新規データベースの作成禁止」を参照してください。セキュリティ定数の詳細については、オンラインヘルプの[キーワード]タブで「データ アクセス定数」の項目を検索し、説明を参照してください。


▼ページトップに戻る

ユーザーが通常は権限を持っていないために実行できない処理を実行するコードをアプリケーションに記述することもできます。そのためには、データベースが作成されたときに使われていたワークグループ情報ファイルの[管理者グループ]グループのメンバーなど、現在ログオンしているユーザーよりも強い権限を持つユーザー アカウントのユーザー名およびパスワードを使って新しいWorkspaceオブジェクトを作成します。

たとえば、ノースウィンド サンプル データベースのセキュリティが設定されたコピーのフォームのコマンドボタンに、次のコードを追加できます。ユーザーがこのボタンをクリックすると、[管理者グループ]グループのメンバーの名前とパスワードを使って新しいWorkspaceオブジェクトが作成されます。そのワークスペースでデータベースのコピーが開かれ、カレント ユーザーにそのフォームに対するすべての権限が一時的に与えられます。


フォームの"BackColor/背景色"プロパティが[赤]に変更されてから、ユーザーの権限が通常の権限に戻されます。

Private Sub ChangeBackColor_Click()
    On Error GoTo ChangeBackcolor_Err
    
    Dim wsNew As Workspace
    Dim dbs As DATABASE
    Dim ctr As Container
    Dim doc As Document
    Dim lngCurrentPermissions As Long
    
    ' 砂時計アイコンを表示し、画面の更新を抑制します。
    DoCmd.Hourglass True
    DoCmd.Echo False
    
    ' SteveBの名前とパスワードを使って新しい Workspace オブジェクトを作成し、
    ' 新しいワークスペースでデータベースを開きます。
    Set wsNew = DBEngine.CreateWorkspace("NewWorkspace", _
        "SteveB", "32msaig54")
    Set dbs = wsNew.OpenDatabase(CurrentDb.Name)
    
    ' Container オブジェクトに Forms を設定してから
    ' Document オブジェクトにカレント フォームを設定します。
    Set ctr = dbs.Containers!Forms
    Set doc = ctr.Documents(Me.Name)
    
    ' フォームのカレント ユーザーを指定し、そのユーザーの現在の権限を保存し、
    ' 次にそのユーザーにすべての権限を与えます。
    doc.UserName = CurrentUser
    lngCurrentPermissions = doc.Permissions
    doc.Permissions = dbSecFullAccess
    
    ' デザイン ビューに切り替えて、Detail セクションの背景色を赤に変更し、フォームを
    ' 保存します。
    DoCmd.DoMenuItem 0, 2, 0, , acMenuVer80
    CodeContextObject.Selection(0).BackColor = 255
    DoCmd.Save acForm, CodeContextObject.Name
    
    ' フォーム ビューに戻り、ユーザーの権限を元の権限に戻します。
    ' 次にデータベースと新しいワークスペースを閉じます。
    DoCmd.DoMenuItem 3, 2, 1
    doc.Permissions = lngCurrentPermissions
    dbs.Close
    wsNew.Close
    
ChangeBackcolor_ErrCont:
    
    DoCmd.Hourglass False
    DoCmd.Echo True
    
    Exit Sub
    
ChangeBackcolor_Err:
    MSGBOX Err.Description
    Resume ChangeBackcolor_ErrCont
        
End Sub

この操作を行う場合は、コードを配置するフォームが適切に保護されているようにする必要があります。これは、フォームに対する[構造の読み取り]権限のあるユーザーは、ユーザー名およびパスワードを見ることができるからです。


以下に、一般的な操作をするためのVisual Basicのコードを使ったユーザーレベルのセキュリティ処理の例を示します。


参照 データ アクセス オブジェクト(DAO)コードをユーザーレベルセキュリティの設定に使用する方法の詳細については、「Microsoft Jet データベース エンジン プログラマーズ ガイド」(アスキー出版局発行)を参照してください。