5

私は実際に2つの質問があります:

1. Access データベースを使用しているユーザーを確認するにはどうすればよいですか?

  • 例: Access データベースを開いて .ldb ファイルを作成した人がいます。そのデータベースを開いたユーザーのリストを表示したいと思います (複数のユーザーである可能性があります)。

2. リンクされたテーブルを使用しているユーザーを確認するにはどうすればよいですか?

  • 例: 10 個の異なる Access データベースがあり、それらすべてが同じリンク テーブルを使用しています。そのリンクされたテーブルを誰が使用しているかを確認したいと思います。

本当に可能かわかりませんが、よろしくお願いします!

参考までに: 主な問題は、多くの人が同じネットワーク ドライブで同じ Access を使用していることです。そのため、変更する必要がある場合は、それらをすべて追い出さなければなりませんが、実際に誰がそれを使用しているかはわかりません。

4

4 に答える 4

7

更新: .ldb/.lacdb ファイルを読み取って解析するよりも、ナレッジ ベースの記事で説明されているように、Access OLEDB プロバイダーの "User Roster" 機能を使用する方が適切です。

https://support.microsoft.com/en-us/kb/285822

そして他のSOの質問で

VBA を使用して laccdb ファイルの内容を取得する


元の答え:

少し前に以下をまとめました。有望に見えましたが、コンピューターが切断されたときに、コンピューターがロックファイルからすぐに削除されないことがわかりました。代わりに、Jet/ACE はそれらを (内部的に) 非アクティブとしてマークしているようです。ComputerA が切断され、次に ComputerB が接続された場合、ComputerB はロック ファイル内の ComputerA のエントリを上書きします。

それでも、それは種類のリストを提供します。誰かが洗練のための提案を提供できる場合に備えて、ここに投稿しています。

バックエンド データベースに 2 つのテーブルを作成しました。

Table: [CurrentConnections]
computerName  Text(255), Primary Key

Table: [ConnectionLog]
computerName  Text(255), Primary Key
userName      Text(255)

バックエンド データベースの VBA モジュールには、ロック ファイル (のコピー) を読み取り、[CurrentConnections] テーブルを更新する次のコードが含まれていました。

Public Sub GetCurrentlyConnectedMachines()
    Dim cdb As DAO.Database, rst As DAO.Recordset
    Dim fso As Object  '' FileSystemObject
    Dim lck As Object  '' ADODB.Stream
    Dim lockFileSpec As String, lockFileExt As String, tempFileSpec As String
    Dim buffer() As Byte

    Set cdb = CurrentDb
    cdb.Execute "DELETE FROM CurrentConnections", dbFailOnError
    Set rst = cdb.OpenRecordset("SELECT computerName FROM CurrentConnections", dbOpenDynaset)

    lockFileSpec = Application.CurrentDb.Name
    If Right(lockFileSpec, 6) = ".accdb" Then
        lockFileExt = ".laccdb"
    Else
        lockFileExt = ".ldb"
    End If
    lockFileSpec = Left(lockFileSpec, InStrRev(lockFileSpec, ".", -1, vbBinaryCompare) - 1) & lockFileExt

    '' ADODB.Stream cannot open the lock file in-place, so copy it to %TEMP%
    Set fso = CreateObject("Scripting.FileSystemObject")  '' New FileSystemObject
    tempFileSpec = fso.GetSpecialFolder(2) & "\" & fso.GetTempName
    fso.CopyFile lockFileSpec, tempFileSpec, True

    Set lck = CreateObject("ADODB.Stream")  '' New ADODB.Stream
    lck.Type = 1  '' adTypeBinary
    lck.Open
    lck.LoadFromFile tempFileSpec
    Do While Not lck.EOS
        buffer = lck.Read(32)
        rst.AddNew
        rst!computerName = DecodeSZ(buffer)
        rst.Update
        buffer = lck.Read(32)  '' skip accessUserId, (almost) always "Admin"
    Loop
    lck.Close
    Set lck = Nothing
    rst.Close
    Set rst = Nothing
    Set cdb = Nothing
    fso.DeleteFile tempFileSpec
    Set fso = Nothing
End Sub

Private Function DecodeSZ(buf() As Byte) As String
    Dim b As Variant, rt As String
    rt = ""
    For Each b In buf
        If b = 0 Then
            Exit For  '' null terminates the string
        End If
        rt = rt & Chr(b)
    Next
    DecodeSZ = rt
End Function

フロントエンド データベースの Main_Menu フォームの次のコードは、[ConnectionLog] テーブルを更新しました。

Private Sub Form_Load()
    Dim cdb As DAO.Database, rst As DAO.Recordset
    Dim wshNet As Object  '' WshNetwork

    Set wshNet = CreateObject("Wscript.Network")
    Set cdb = CurrentDb
    Set rst = cdb.OpenRecordset("SELECT * FROM ConnectionLog", dbOpenDynaset)
    rst.FindFirst "ComputerName=""" & wshNet.computerName & """"
    If rst.NoMatch Then
        rst.AddNew
        rst!computerName = wshNet.computerName
    Else
        rst.Edit
    End If
    rst!userName = wshNet.userName
    rst.Update
    Set wshNet = Nothing
End Sub

最後に、バックエンドデータベースの次のフォームには、現在の接続が一覧表示されています [その最善の推測]

ShowActiveUsers

それは「連続フォーム」フォームRecord Sourceです。

SELECT CurrentConnections.computerName, ConnectionLog.userName 
FROM CurrentConnections LEFT JOIN ConnectionLog 
    ON CurrentConnections.computerName = ConnectionLog.computerName 
ORDER BY ConnectionLog.userName; 

コードビハインドは単純です

Private Sub Form_Load()
    UpdateFormData
End Sub

Private Sub cmdRefresh_Click()
    UpdateFormData
End Sub

Private Sub UpdateFormData()
    GetCurrentlyConnectedMachines
    Me.Requery
End Sub
于 2013-04-09T23:00:07.487 に答える
4

簡単。.ldb ファイルをメモ帳 (または任意のテキスト エディター) で開くと、マシン名が表示されます。

于 2013-04-09T20:26:10.397 に答える
4

RE: Access データベースを使用しているユーザーを確認するにはどうすればよいですか? •例: Access データベースを開いて .ldb ファイルを作成した人がいます。そのデータベースを開いたユーザーのリストを表示したいと思います (複数のユーザーである可能性があります)。


何か他のものを探しているときに偶然これに出くわしたので、これのために私がしていることを共有できると思いました. これは、ホスト コンピューター (データベース ファイルが存在するコンピューター) がファイル共有を使用してファイルへのアクセスを提供することを前提としていることに注意してください。

ホスト コンピュータ上にいるか、そのマシンに接続する権限を持っている必要があります。

[スタート] をクリックし、[マイ コンピュータ] を右クリックして [管理] を選択します。

ホスト コンピューターを使用していない場合は、[コンピューターの管理] を右クリックし、ホストの名前を入力します。

[共有フォルダー] を展開し、[ファイルを開く] をクリックします。右側には、現在開いているファイルのリストと、現在の各ユーザーのユーザー名が表示されます。

于 2013-12-19T16:56:47.680 に答える