使用RUNAS启动应用时如何在VBA中获取其登录用户名
问题结论
可以获取,但无法通过VBA常规内置函数直接获取,需要结合runas /netonly的特性选择对应实现方案,以下方法在Excel(xls格式)和Access(accdb格式)中均可通用。
前提说明
runas /netonly的运行逻辑:该参数启动的进程仅在访问远程网络资源时使用你指定的%id%身份认证,本地进程的安全上下文仍然是执行runas命令的本地登录用户,因此常规的Windows身份查询接口默认返回本地用户身份。
实现方案
方案1:修改启动脚本注入环境变量(推荐,最简单稳定)
如果你可以自行调整启动脚本,直接在启动Office时把指定的用户名写入临时环境变量,VBA直接读取即可。
修改后的启动脚本如下:
runas /netonly /user:%id% "C:\Windows\System32\cmd.exe /c SET RUNAS_NETONLY_USER=%id% & START excel.exe /r"
对应VBA读取代码:
Function GetRunasNetonlyUser() As String ' 读取启动时注入的环境变量 GetRunasNetonlyUser = Environ("RUNAS_NETONLY_USER") End Function
方案2:调用Windows API查询网络资源对应的认证身份(无需修改启动脚本)
如果不能修改启动脚本,可以调用Windows系统的WNetGetUserAPI,查询你用netonly身份访问的目标网络资源对应的认证用户名即可。
#If VBA7 Then Declare PtrSafe Function WNetGetUser Lib "mpr.dll" Alias "WNetGetUserA" (ByVal lpName As String, ByVal lpUserName As String, lpnLength As Long) As Long #Else Declare Function WNetGetUser Lib "mpr.dll" Alias "WNetGetUserA" (ByVal lpName As String, ByVal lpUserName As String, lpnLength As Long) As Long #End If Function GetNetonlyUserForResource(Optional ByVal remoteResource As String = "\\你的域控制器地址\sysvol") As String Dim buffer As String Dim bufferLen As Long Dim ret As Long buffer = Space(255) bufferLen = 255 ret = WNetGetUser(remoteResource, buffer, bufferLen) If ret = 0 Then GetNetonlyUserForResource = Left(buffer, bufferLen - 1) Else GetNetonlyUserForResource = "查询失败,错误码:" & ret End If End Function
注意:参数
remoteResource需要替换为你实际会用该netonly身份访问的网络资源路径,比如业务文件共享地址、数据库服务器地址等。
常见误区
- 不要使用
Environ("USERNAME")查询:返回的是本地启动runas命令的用户,不是netonly指定的身份 - 不要使用
Application.UserName查询:返回的是Office软件设置里的用户名,和系统身份无关
内容的提问来源于stack exchange,提问作者Thinkman
相关产品推荐
相关产品推荐

