Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 获取当前登录的windows用户_Vba_Ms Access_Winapi - Fatal编程技术网

Vba 获取当前登录的windows用户

Vba 获取当前登录的windows用户,vba,ms-access,winapi,Vba,Ms Access,Winapi,我通过谷歌找到了这个: “*******************代码开始************************** '这段代码最初是由Dev Ashish编写的。 "不得涂改,不得散发,, “除了作为申请的一部分。 “您可以在任何应用程序中自由使用它, '前提是版权声明保持不变。 ' “代码由 “德夫·阿希什 ' 私有声明函数apiGetUserName Lib“advapi32.dll”别名_ “GetUserNameA”(ByVal lpBuffer作为字符串,nSize作为Lon

我通过谷歌找到了这个:

“*******************代码开始**************************
'这段代码最初是由Dev Ashish编写的。
"不得涂改,不得散发,,
“除了作为申请的一部分。
“您可以在任何应用程序中自由使用它,
'前提是版权声明保持不变。
'
“代码由
“德夫·阿希什
'
私有声明函数apiGetUserName Lib“advapi32.dll”别名_
“GetUserNameA”(ByVal lpBuffer作为字符串,nSize作为Long)作为Long
函数fOSUserName()作为字符串
'返回网络登录名
暗谷一样长,lngX一样长
Dim strUserName作为字符串
strUserName=String$(254,0)
lngLen=255
lngX=apiGetUserName(strUserName,lngLen)
如果(lngX>0),则
fOSUserName=左$(strUserName,lngLen-1)
其他的
fOSUserName=vbNullString
如果结束
端函数
“**********************代码结束**************************

这是最好的方法吗?

您也可以使用Environ$,但问题指定的方法更好。用户/应用程序可以更改环境变量。

为此,您提到的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

您也可以这样做:

Set WshNetwork = CreateObject("WScript.Network")
Print WshNetwork.UserName
它还有一个UserDomain属性和一系列其他内容:


我通常使用VBA中的环境,如下所示。我还没有遇到Ken提到的可能出现的问题

Function UserNameWindows() As String
    UserNameWindows = VBA.Environ("USERNAME") & "@" & VBA.Environ("USERDOMAIN")
End Function

在其他帖子中有很多替代方法,但要回答这个问题:是的,这是最好的方法。如果您只需要用户名,则比创建COM对象或WMI要快,并且在Win95及以上的所有Windows版本中都可用。

有很多方法可以在WMI中获取当前登录的用户名。 我的方法是通过“explorer.exe”进程中的用户名获取它 因为当用户登录窗口时,该文件的访问权限将根据当前用户

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
有关更多详细信息,请查看以下链接:

如果使用CreateObject(),则不必这样做。上面的代码将在没有引用的情况下工作。您确实需要将WshNetwork变量定义为泛型对象,而不是FSO的本机数据类型(不管是什么——除了后期绑定之外,我从不使用FSO,所以根本不知道它的任何数据类型)。我尝试重现上面提到的步骤(ken的回答)但我无法更改Environ对象的任何值。在直接VBA中实现这一点的唯一方法是建议的方法(knox的答案),我无法理解为什么这个答案被降级!这个问题几乎完全是重复的,可能是重复的,这是有用的