我一直在研究Environ功能,以便在Windows XP机器上检索Access 2003中的当前Windows用户名(这也将在Windows 7上使用)。唯一的问题是,我偶然发现了各种文章和论坛,说明这些变量很容易被欺骗。
例如,所以我决定运行一些测试,我尝试设置局部变量:
SET USERNAME = testUser
将在命令提示符中更改我的用户名并保持CMD会话处于打开状态。
然后我会运行我的访问代码。
findCurrentUsername = Environ("Username")
我仍然会收到我期望的用户名。
我也试过去计算机>属性>高级选项卡,我在那里找不到变量。
此外,这将在一个类中使用,因此我在导入外部库时遇到了困难。
Environ功能是否在公司环境中具有欺骗性?如果是,您是如何做到的?
答案 0 :(得分:0)
Per David Candy对原始问题的评论:
我通过打开控制台进行测试。然后我跑了:
Set USERNAME=test
运行后,我找到了MDB的文件路径,并且
Start FILEPATH\FILENAME.mdb
并运行返回“test”的Environ(“用户名”)函数
解决这个问题的方法是使用David Candy在评论中留下的代码:
Public Declare Function GetUserName Lib "advapi32.dll"
Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
我在类模块中使用的解决方法是(来自HERE):
我声明了以下函数库(你必须在一个类中私下声明它):
Private Declare Function WNetGetUser Lib "mpr.dll" _
Alias "WNetGetUserA" (ByVal lpName As String, _
ByVal lpUserName As String, lpnLength As Long) As Long
并使用:
调用它' Buffer size for the return string.
Const lpnLength As Integer = 255
' Get return buffer space.
Dim status As Integer
' For getting user information.
Dim lpName, lpUserName As String
' Assign the buffer size constant to lpUserName.
lpUserName = Space$(lpnLength + 1)
' Get the log-on name of the person using product.
status = WNetGetUser(lpName, lpUserName, lpnLength)
' See whether error occurred.
If status = 0 Then
' This line removes the null character. Strings in C are null-
' terminated. Strings in Visual Basic are not null-terminated.
' The null character must be removed from the C strings to be used
' cleanly in Visual Basic.
findCurrentUsername = Left$(lpUserName, InStr(lpUserName, Chr(0)) - 1)
Else
'Backup GetUsername that does not use Windows API, instead it uses local Variables
findCurrentUsername = CreateObject("WScript.Network").UserName 'Environ("Username")
End If