获取当前登录的windows用户
Posted
技术标签:
【中文标题】获取当前登录的windows用户【英文标题】:Getting the currently logged-in windows user 【发布时间】:2008-10-03 20:07:36 【问题描述】:我通过谷歌找到了这个:http://www.mvps.org/access/api/api0008.htm
'******************** Code Start **************************
' 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
'******************** Code End **************************
这是最好的方法吗?
【问题讨论】:
我试图重现提到的步骤here(ken 回答),但我无法更改 Environ 对象的任何值。在直接 VBA 中执行此操作的唯一方法是建议 here(knox 回答),我不明白为什么这个答案被降级! 这个问题与***.com/questions/9052/…几乎完全相同 Is there a way for MS Access to grab the current Active Directory user?的可能重复 【参考方案1】:你也可以这样做:
Set WshNetwork = CreateObject("WScript.Network")
Print WshNetwork.UserName
它还有一个 UserDomain 属性和一堆其他东西:
http://msdn.microsoft.com/en-us/library/907chf30(VS.85).aspx
【讨论】:
如果您使用 CreateObject(),则不必这样做。上面的代码无需参考即可工作。 您必须将 WshNetwork 变量定义为通用对象,而不是作为 FSO 的本机数据类型(无论如何——我从不使用 FSO,除非有后期绑定,所以不要知道它的任何数据类型)。【参考方案2】:您也可以使用 Environ$,但问题指定的方法更好。用户/应用程序可以更改环境变量。
【讨论】:
【参考方案3】:我通常使用 VBA 中的环境,如下所示。我没有遇到 Ken 提到的可能性问题。
Function UserNameWindows() As String
UserNameWindows = VBA.Environ("USERNAME") & "@" & VBA.Environ("USERDOMAIN")
End Function
【讨论】:
这很有用【参考方案4】:其他帖子中有很多替代方法,但要回答这个问题:是的,这是最好的方法。如果您只需要用户名,则比创建 COM 对象或 WMI 更快,并且在 Win95 以上的所有 Windows 版本中都可用。
【讨论】:
【参考方案5】:Alternative way 这样做 - 您提到的 API 可能是获取用户名的更好方法。
For Each strComputer In arrComputers
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem",,48)
For Each objItem in colItems
Wscript.Echo "UserName: " & objItem.UserName & " is logged in at computer " & strComputer
Next
【讨论】:
【参考方案6】:有很多方法可以在 WMI 中获取当前登录的用户名。 我的方法是通过“explorer.exe”进程中的用户名获取它 因为当用户登录window时,这个文件的访问权是根据当前用户来的。
WMI 脚本如下所示:
Set objWMIService = GetObject("winmgmts:" & "impersonationLevel=impersonate!\\" & strIP & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process")
For Each objprocess In colProcessList
colProperties = objprocess.GetOwner(strNameOfUser, strUserDomain)
If objprocess.Name = "explorer.exe" Then
UsrName = strNameOfUser
DmnName = strUserDomain
End If
Next
更多详情请查看以下链接: http://msdn.microsoft.com/en-us/library/aa394599%28v=vs.85%29.aspx
【讨论】:
以上是关于获取当前登录的windows用户的主要内容,如果未能解决你的问题,请参考以下文章
在VC中获取Windows XP,Windows 7当前登录用户名[关闭]