如何通过网络查看谁在使用我的Access数据库?

时间:2013-04-09 10:50:30

标签: ms-access ms-access-2003 multi-user

我实际上有两个问题:

1。我怎样才能看到谁在使用我的Access数据库?

  • 例如:有人打开了Access数据库,并创建了.ldb文件,我想查看谁打开该数据库的列表(可能不止一个人)。

2。我怎样才能看到谁在使用链接表?

  • 例如:我有10个不同的Access数据库,并且所有这些数据库都使用相同的链接表。我想看看谁在使用该链表。

我甚至不知道它是否真的有可能,但我非常感谢你的帮助!

为了您的信息:主要的问题是很多人在同一个网络驱动器中使用相同的Access,所以当我需要更改它时,我必须全力以赴,但我永远不知道谁在实际使用它。

4 个答案:

答案 0 :(得分:6)

更新:不是阅读和解析.ldb / .lacdb文件,更好的方法是使用知识库文章中描述的Access OLEDB提供程序的“用户名册”功能

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

和另一个SO问题

Get contents of laccdb file through VBA

<小时/> 原始答案:

我刚才把以下内容放在一起。它看起来很有希望但后来我发现计算机在断开连接时不会立即从锁定文件中删除。相反,Jet / ACE似乎(内部)将它们标记为非活动状态:如果ComputerA断开连接然后ComputerB连接,则ComputerB将在锁定文件中覆盖ComputerA的条目。

尽管如此,它确实提供了一系列排序。我在这里发帖,以防有人提出一些改进的建议。

我在后端数据库中创建了两个表:

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

答案 1 :(得分:4)

易。在记事本(或任何文本编辑器)中打开.ldb文件,您可以看到机器名称。

答案 2 :(得分:4)

RE:我怎么知道谁在使用我的Access数据库? •例如:有人打开了Access数据库并创建了.ldb文件,我想查看谁打开该数据库的列表(可能不止一个人)。


在寻找其他东西的时候发生了这件事,我想我可能会分享我为此做的事情。请注意,这假定主机(数据库文件所在的计算机)使用文件共享来提供对文件的访问。

您需要在主机上,或有权连接到该计算机。

单击“开始” 右键单击“我的电脑”,然后选择“管理”

  

如果您不在主机上,请右键单击“计算机管理”并输入主机名称

展开“共享文件夹”,然后点击“打开文件” 右侧是当前打开的文件列表,其中包含每个当前用户的用户名

答案 3 :(得分:1)

我同意Gord的原始答案。我在数据库上使用了此代码,似乎有一种解决方法,可以在数据库退出时将计算机从CurrentConnections中取出。

我把它放在我的主菜单上,因为它一直打开直到用户退出。我在表单上使用了unload事件来使其正常工作,并且效果很棒!这是我的代码

p.s。忽略SetWarnings只是为了使用户不必单击提示。

Private Sub Form_Unload(Cancel As Integer)
Dim wshNet As Object
Dim deleteSQL As String

Set wshNet = CreateObject("WScript.Network")
        DoCmd.SetWarnings False
        deleteSQL = "DELETE tblCurrentConnections.* " & _
        "FROM tblCurrentConnections WHERE[computerName] = '" & wshNet.computerName & "';"
                DoCmd.RunSQL deleteSQL
        DoCmd.SetWarnings True
End Sub