Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 如何查看谁在网络上使用我的Access数据库?_Ms Access_Ms Access 2003_Multi User - Fatal编程技术网

Ms access 如何查看谁在网络上使用我的Access数据库?

Ms access 如何查看谁在网络上使用我的Access数据库?,ms-access,ms-access-2003,multi-user,Ms Access,Ms Access 2003,Multi User,我实际上有两个问题: 1.如何查看谁在使用我的Access数据库? 例如:有人打开了Access数据库并创建了.ldb文件,我想查看打开该数据库的人的列表(可能不止一人) 2.如何查看谁在使用链接表? 例如:我有10个不同的Access数据库,它们都使用同一个链接表。我想看看谁在使用链接表 我甚至不知道这是否真的可能,但我真的很感谢你的帮助 供您参考:主要问题是很多人在同一个网络驱动器中使用相同的访问权限,所以当我需要更改时,我必须将他们全部赶走,但我永远不知道谁在使用它。简单。在记事本

我实际上有两个问题:

1.如何查看谁在使用我的Access数据库?
  • 例如:有人打开了Access数据库并创建了.ldb文件,我想查看打开该数据库的人的列表(可能不止一人)
2.如何查看谁在使用链接表?
  • 例如:我有10个不同的Access数据库,它们都使用同一个链接表。我想看看谁在使用链接表
我甚至不知道这是否真的可能,但我真的很感谢你的帮助


供您参考:主要问题是很多人在同一个网络驱动器中使用相同的访问权限,所以当我需要更改时,我必须将他们全部赶走,但我永远不知道谁在使用它。

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

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

在另一个问题上


原始答复:

我不久前整理了以下内容。这看起来很有希望,但后来我发现,当计算机断开连接时,它们不会立即从锁文件中删除。相反,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
前端数据库主菜单表单中的以下代码更新了[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
最后,后端数据库中的以下表格列出了当前连接的最佳猜测

它是一种“连续表单”,其
记录源

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

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


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

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

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

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

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

我同意Gord的原始答案。我在我的数据库中使用了这段代码,似乎有一种方法可以避免计算机在退出数据库时脱离当前连接

我把它放在我的主菜单窗体上,因为它总是打开的,直到用户退出。我在表单上使用了卸载事件来实现这一点,效果非常好!这是我的密码

p、 忽略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

我也在想这件事。您是否考虑过创建一个在用户打开数据库时记录日志的表?您可以使用
str=CreateObject(“WScript.Network”)。用户名
Hmmm。。。说得好!我可以在我的登录按钮中使用该命令行……但是当有人打开访问权限时是否会触发任何事件?是的。创建一个宏并将其命名为Autoexec。很不错的!它可以帮助。。。但我仍在寻找某种方法来确定谁在链接到我的表,这只是第一次打开它的人,而不是当前在其中的人。不,不是,是每台机器都打开了它。这就是为什么直到最后一个用户离开时它才会消失。以前有一个叫做ldb查看器的产品,它可以读取信息并以漂亮的形式显示出来,但它只需读取.ldb文件即可。下面是一个示例,请注意,Admin是每台计算机上的默认用户WS26-XP Admin LT12CO Admin SVR06-TERMINAL Admin WS53CO Admin WS26-XP Admin WS26-XP Admin您是对的,Peter。我打开了一个使用率很高的Access db的.ldb,完全明白了你的意思。不幸的是,这只是机器名,但这比我预期的要多得多。死链接_____