在 MS Access 2007 中使用 Active Directory/Windows 身份验证对用户进行身份验证

Posted

技术标签:

【中文标题】在 MS Access 2007 中使用 Active Directory/Windows 身份验证对用户进行身份验证【英文标题】:Authenticate user using Active Directory/Windows authentication in MS Access 2007 【发布时间】:2011-04-29 14:01:23 【问题描述】:

我们有基于 MSAccess 2007 构建的应用程序。我们想为此应用程序添加一个新的用户登录概念。 我想使用 Active Directory/Windows 身份验证对用户进行身份验证。我想为此用户创建一个日志文件。 (就像我们为使用表单身份验证的 .net 应用程序所做的那样) 我如何在 MS Access 2007 上做到这一点。

此外,此应用程序运行 24 小时,不会关闭。可以有多个用户使用此应用程序。 正如我所说,这个应用程序是 24/7 使用的,有多个班次运行,不同的用户登录和注销。 在用户登录和注销会话期间,我们需要跟踪特定用户的日志。 此应用程序使用 SQL server 2005 作为数据库服务器。 您的建议对我在 MS Access 2007 上开发这种模块很有帮助

【问题讨论】:

我不相信你能做到你要求的。使用 Windows 用户登录(AD 并不是什么特别的东西——它只是 NTFS 用户/安全的 UI),您必须强制用户注销 Windows 并重新登录。 旧版本 Access 的相同(?)问题:***.com/q/1425893/321973 可能相关:support.microsoft.com/en-us/help/316748/… 【参考方案1】:

由于用户必须登录到电脑,那么您可以使用http://www.mvps.org/access/api/api0008.htm中的代码简单地获取他们的登录信息:

' This code was originally written by Dev Ashish.
' It is not to be altered or distributed,
' except as part of an application.
' You are free to use it in any application,
' provided the copyright notice is left unchanged.
'
' Code Courtesy of
' Dev Ashish
'
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
    "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Function fOSUserName() As String
' Returns the network login name
Dim lngLen As Long, lngX As Long
Dim strUserName As String
    strUserName = String$(254, 0)
    lngLen = 255
    lngX = apiGetUserName(strUserName, lngLen)
    If ( lngX > 0 ) Then
        fOSUserName = Left$(strUserName, lngLen - 1)
    Else
        fOSUserName = vbNullString
    End If
End Function

而且,下面是一个 vbs 脚本,但它应该也可以在 Access 中正常工作:

Displays Group Membership and Active Directory Location

可以运行以下代码来显示一个组的成员资格 Active Directory 组,还让您知道每个成员的 LDAP 专有名称。输出会将文本文件命名为组名 并将包括所有成员及其在 Active 中的位置 目录。只需将其复制到 txt 文件中并重命名为 .vbs 即可享受!

Set objGroup = GetObject(“LDAP://cn=GroupName,ou=OUName,DC=DomainName,DC=local“)
Set objFileSystem = CreateObject(“Scripting.FileSystemObject”)
Set objFile = objFileSystem.OpenTextFile(objGroup.Get(“name”) & ” – Members.txt“, 2, True, 0)
For Each objMember in objGroup.Members
  objFile.WriteLine objMember.Get(“sAMAccountName”) & VbTab & _
    objMember.Get(“cn”) & VbTab & _
    objMember.Parent
Next
Set objFile = Nothing
Set objFileSystem = Nothing
Set objGroup = Nothing

【讨论】:

谢谢 Albert D. Kallal。它的作品很棒。是的,我实际上想知道网络用户 ID。当用户登录和注销时,我可以记录详细信息。谢谢,这是一个很大的帮助。我们是否也可以像在 .net 环境中那样在 Access 中维护会话超时。【参考方案2】:

在 C#.Net 中使用

Console.WriteLine("UserName: 0", Environment.UserName);

【讨论】:

【参考方案3】:

在 Access 中使用 VBA 非常简单。

Dim User As String
    Let User = Application.UserName
Dim arrUser
    Let arrUser = split(User, ",")
    User = arrUser(1)
    arrUser = split(User, "@")
    User = arrUser(0)

这似乎适用于我的 VBA 应用程序。

【讨论】:

以上是关于在 MS Access 2007 中使用 Active Directory/Windows 身份验证对用户进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MS Access 2007 中使用值填充组合框

ms-access 2007 运行时和 lockWindowUpdate

MS access 2007 使用组合框填充图片

如何在 MS Access 2007 中获取 sql 查询

如何在 MS Access 2007 中使用查询作为报告源?

如何在 Ms Access 2007 中使用 MySQL 视图,而不会出现字符串列的垃圾?