如何,看看谁在使用我的Access数据库在网络上?(How to see who is using

2019-08-20 21:27发布

其实,我有2个问题:

1.我怎么可能会看到谁在用我的Access数据库?

  • 例如:有某人打开Access数据库,它创建的.ldb文件,我想看到谁打开的数据库(它可能是一人以上)的列表。

2.我怎么可能会看到谁在使用链接的表?

  • 例如:我有10个不同的Access数据库,和所有的人都使用同一个链接表。 我想看看是谁在使用该链接的表。

我甚至不知道这是否是真的有可能,但我真的很感谢您的帮助!

为了您的信息:主要的问题是,很多人使用同一个网络驱动器一样访问,所以当我需要改变它,我必须踢他们都出去,但谁是真正使用它,我不知道。

Answer 1:

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

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

而在其他SO质疑

通过VBA获取laccdb文件的内容


原来的答案:

我下面前一阵子放在一起。 它看起来很有前途,但后来我发现,计算机不会立即从锁文件删除时断开连接。 相反,喷气/ 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

最后,在后端数据库下列表格列出[其最佳猜测]当前连接

这是一个“连续纸”形式,其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


Answer 2:

简单。 用记事本打开.ldb文件(或任何文本编辑器),你可以看到机器的名字。



Answer 3:

RE:我怎么可能会看到谁在用我的Access数据库? •例如:有某人打开Access数据库,它创建的.ldb文件,我想看到谁打开的数据库(它可能是一人以上)的列表。


只是碰到这种事情时找别的东西,我想我会分享我这个做。 请注意,这个假设主机计算机(在其数据库文件所在的计算机)使用文件共享来提供对文件的访问。

你将需要在主机上,或有权连接到机器。

单击开始右键单击我的电脑,选择管理

如果你不是在主机上,右键单击“计算机管理”,然后输入主机名

展开“共享文件夹”,然后点击“打开文件”。在右边是当前打开的文件的用户名对每个当前的用户列表



Answer 4:

我同意和Gord的原来的答复。 我用我的数据库的代码,它似乎有在DB的出口没有被取出CurrentConnections的电脑周围的方式。

我把这个我的主菜单形式,因为它始终是敞开的,直到用户退出。 我用卸载事件的窗体上得到这个工作,和它的作品真棒! 这里是我的代码

PS忽略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


文章来源: How to see who is using my Access database over the network?