2008-10-03 7 views
7

Das fand ich über google: http://www.mvps.org/access/api/api0008.htmWie kann ich den derzeit angemeldeten Windows-Benutzer in Access VBA abrufen?

'******************** 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 ************************** 

Ist dies der beste Weg, es zu tun?

+1

Diese Frage fast genau von http://stackoverflow.com/questions/9052 Duplikat wird/is-there-a-way-for-ms-Zugriff-auf-den-aktuellen-aktiven-Verzeichnis-Benutzer – Yarik

+0

Mögliche Duplikate von [Gibt es eine Möglichkeit für MS Access, den aktuellen Active Directory-Benutzer zu greifen?] (http://stackoverflow.com/questions/9052/is-there-a-way-for-ms-access-to-grab-the-current-active-directory-user) –

+0

Ich habe versucht, Schritte [hier] zu reproduzieren (http://stackoverflow.com/questions/168659/how-can-i-get-the-currently-logged-in-windows-user-in-access-vba#168666) (Antwort von Ken), aber ich konnte keinen Wert des Environ-Objekts ändern. Die einzige Möglichkeit, dies in einer einfachen VBA zu tun, ist dann die, die [hier] vorgeschlagen wird (http://stackoverflow.com/questions/168659/how-can-i-get-the-currently-logged-in-windows-user-- in-access-vba # 168986) (Antwort von knox) und ich kann nicht verstehen, warum diese Antwort herabgestuft wurde! –

Antwort

6

Sie könnten auch Environ $ verwenden, aber die von der Frage angegebene Methode ist besser. Benutzer/Anwendungen können die Umgebungsvariablen ändern.

1

Alternative way um das zu tun - wahrscheinlich ist die API, die Sie erwähnen, eine bessere Möglichkeit, Benutzernamen zu erhalten.

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 
10

Sie könnten auch dies tun:

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

Es hat auch eine Benutzerdomäne Eigenschaft und ein paar andere Dinge:

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

+1

Sie müssen nicht, wenn Sie CreateObject() verwenden. Der obige Code funktioniert ohne Referenz. – bobwienholt

+0

Sie müssen die WshNetwork-Variable als ein generisches Objekt definiert haben, anstatt als nativen Datentyp des FSO (was auch immer das ist - ich benutze das FSO nie mit Ausnahme der späten Bindung, also kenne keinen seiner Datentypen bei alle). –

1

ich eine environ im Allgemeinen aus VBA verwenden wie im Folgenden. Ich hatte nicht die Probleme, die Ken als Möglichkeiten erwähnt.

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

Viele alternative Methoden in anderen Posts, aber um die Frage zu beantworten: Ja, das ist der beste Weg, es zu tun. Schneller als das Erstellen eines COM-Objekts oder WMI, wenn alles, was Sie wollen, ist der Benutzername und in allen Windows-Versionen ab Win95 verfügbar.

0

Es gibt viele Möglichkeiten, den aktuellen Benutzernamen in WMI zu protokollieren. mein Weg ist, es durch den Benutzernamen aus dem Prozess von "explorer.exe" zu bekommen, weil, wenn Benutzer in Fenster, der Zugriff auf diese Datei nach dem aktuellen Benutzer.

WMI-Skript würde wie folgt sein aussehen:

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 

für mehr detailcheck Link auf:
http://msdn.microsoft.com/en-us/library/aa394599%28v=vs.85%29.aspx