2010-11-16 66 views
0

我正在尝试编写VB代码,允许Access识别打开数据库的人的计算机ID,打开窗体并筛选分配给用户的记录。有谁知道如何做到这一点?如何使Access窗体自动打开用户数据?

+3

什么你问当然是可能的,但你可能在巨大的问题上不会得到完整的答案。你为什么不尝试把你的项目分成更小的问题?例如,您的第一个问题可能是:“如何在Access中编写VBA代码来识别在打开数据库时正在使用的计算机?“将你的问题分解成更小的块可以帮助你更好地回答你的问题 – 2010-11-16 15:47:58

回答

0

如果您的计算机ID是您的意思,您可以使用Environ $(“ComputerName”)。这是我做到的一种快速和肮脏的方式。请注意,用户通常可以关闭表单的过滤器。 正如其他人所说,PC上的环境变量有可能被非管理员用户修改。

如果您担心用户将修改计算机的环境变量(例如,通过cmd设置COMPUTERNAME = MYBOSS),则可以使用Win32 API调用获取ComputerName值,如果您知道该用户是非 - 无法通过注册表或通过Windows修改计算机名的用户(见下文)。

与API

CAVEAT如果用户PC上的管理员权限,他们可以编辑HKLM注册表值,那么他们可以进行下面的注册表项:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName] 
"ComputerName"="MyBossComputerName" 

如果他们重新启动PC,Windows API调用将使用不正确的名称。然后,他们可以将注册表项设置恢复正​​常并重新启动PC。

在我的方案中,我有多个用户在同一台​​PC和Access数据库的不同日子工作。他们从PC上的共享文件夹位置打开数据库。当他们点击配电盘项目时,窗体打开窗体的Load事件运行。这种形式被绑定到一个名为USERNAME的列的表,它只是UserName的环境变量值(例如John.Smith)。

这里的VBA我把加载事件:

Private Sub Form_Load() 
    Dim currUser As String 
    DoCmd.Maximize 
    currUser = Environ$("USERNAME") 
    Me.Filter = "USERNAME = '" & currUser & "'" 
    Me.FilterOn = True 
End Sub 

API调用方案

如果您更愿意做一个API调用来获取计算机名称,而不是那么你可以做的如下:

API调用GetComputerName是由Ken Getz(VBA Developer's Handbook)或Dan Appleman(Visual Basic程序员指南的Win32 API)的代码派生而来的。 你也可以在互联网上找到它。首先将模块添加到您的项目中,将其重命名为 API或其他有意义的内容。然后插入下面的代码:

Private Declare Function GetComputerName Lib "kernel32" _ 
    Alias "GetComputerNameA"(ByVal strBuffer As String, lngSize As Long) As Long 

Public Function ComputerNameValue() As String 
    Dim strBuffer as String 
    Dim retValApi as Long 
    Dim bufferSize as Long 

    bufferSize = 256 

    strBuffer = Space(bufferSize) 

    'bufferSize will be returned with ComputerName length less null character.' 

    retValApi = GetComputerName(strBuffer, bufferSize) 

    If CBool(retValApi) Then 
     ComputerNameValue = Left$(strBuffer, bufferSize) 
    Else 
    'Your Error Handler' 
    End If 

End Function 

在窗体加载事件(修改为使用API​​包装函数,而不是Envrion $):

Private Sub Form_Load() 
    Dim PCName As String 
    DoCmd.Maximize 
    PCName = ComputerNameValue() 
    Me.Filter = "COMPUTERNAME = '" & PCName & "'" 
    Me.FilterOn = True 
End Sub 
+1

'Environ $(”ComputerName“)'真的不是一个好主意,我可以通过打开命令提示符轻易地假装使用老板的电脑,键入'SET ComputerName = MyBossComputer',然后从同一个命令提示符运行Access。获取计算机名称的唯一可靠方法是通过@Remou的答案中引用的Windows API。 – 2010-11-21 21:39:46

+0

我同意部分声明,我将修改代码snippet。如果工作场所没有锁定个人电脑和/或用户具有修改HKLM配置单元的权限,那么他们可以很容易地创建一个注册表项:[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ ComputerName \ ComputerName ]“ComputerName”=“MyBossComputer”重新启动操作系统打开Access窗体当代码将API Call调用到Kernel32 :: GetComputerNameA时它将在启动时读取这个注册表项所以API是reli只要用户不能修改PC上的HKLM配置单元即可。 – 2010-11-29 20:38:23

+0

编辑会更改本地计算机的名称,如果它与同名计算机位于同一LAN上,则会导致某些名称空间冲突(这取决于如何完成名称解析 - 在管理员可能的情况下对用户的许可,这将是对等的,在这种情况下,NETBios广播可能会解决这个问题,这会导致错误)。但是,点了。 – 2010-11-30 00:45:03

相关问题