在 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 运行时和 lockWindowUpdate