欺骗Access中的UserName环境功能

时间:2014-02-25 16:24:53

标签: vba ms-access command-line cmd windows-xp

我一直在研究Environ功能,以便在Windows XP机器上检索Access 2003中的当前Windows用户名(这也将在Windows 7上使用)。唯一的问题是,我偶然发现了各种文章和论坛,说明这些变量很容易被欺骗。

例如,

Herehere

所以我决定运行一些测试,我尝试设置局部变量:

SET USERNAME = testUser

将在命令提示符中更改我的用户名并保持CMD会话处于打开状态。

然后我会运行我的访问代码。

findCurrentUsername = Environ("Username")

我仍然会收到我期望的用户名。

我也试过去计算机>属性>高级选项卡,我在那里找不到变量。

此外,这将在一个类中使用,因此我在导入外部库时遇到了困难。

Environ功能是否在公司环境中具有欺骗性?如果是,您是如何做到的?

1 个答案:

答案 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