Как я могу получить в настоящее время вошедшего в систему пользователя Windows в Access VBA? - PullRequest
9 голосов
/ 04 октября 2008

Я нашел это через Google: 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 **************************

Это лучший способ сделать это?

Ответы [ 6 ]

12 голосов
/ 04 октября 2008

Вы также можете сделать это:

Set WshNetwork = CreateObject("WScript.Network")
Print WshNetwork.UserName

Он также имеет свойство UserDomain и кучу других вещей:

http://msdn.microsoft.com/en-us/library/907chf30(VS.85).aspx

6 голосов
/ 04 октября 2008

Вы также можете использовать Environ $, но метод, указанный в вопросе, лучше. Пользователи / приложения могут изменять переменные среды.

2 голосов
/ 04 октября 2008

Я обычно использую среду из VBA, как показано ниже. У меня не было проблем, которые Кен называет возможными.

Function UserNameWindows() As String
    UserNameWindows = VBA.Environ("USERNAME") & "@" & VBA.Environ("USERDOMAIN")
End Function
1 голос
/ 04 октября 2008

Множество альтернативных методов в других постах, но для ответа на вопрос: да, это лучший способ сделать это. Быстрее, чем создание COM-объекта или WMI, если все, что вам нужно, это имя пользователя и доступно во всех версиях Windows от Win95 и выше.

1 голос
/ 04 октября 2008

Альтернативный способ сделать это - вероятно, упомянутый вами 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
0 голосов
/ 01 ноября 2013

Есть много способов получить текущее зарегистрированное имя пользователя в 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

для более подробной информации проверьте ссылку на:
http://msdn.microsoft.com/en-us/library/aa394599%28v=vs.85%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...