Ms access 如何查看谁在网络上使用我的Access数据库?
我实际上有两个问题: 1.如何查看谁在使用我的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数据库,它们都使用同一个链接表。我想看看谁在使用链接表 我甚至不知道这是否真的可能,但我真的很感谢你的帮助 供您参考:主要问题是很多人在同一个网络驱动器中使用相同的访问权限,所以当我需要更改时,我必须将他们全部赶走,但我永远不知道谁在使用它。简单。在记事本
- 例如:有人打开了Access数据库并创建了.ldb文件,我想查看打开该数据库的人的列表(可能不止一人)
- 例如:我有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,完全明白了你的意思。不幸的是,这只是机器名,但这比我预期的要多得多。死链接_____