2008-10-03 14 views
7

me encontré por google: http://www.mvps.org/access/api/api0008.htm¿Cómo puedo obtener el usuario de Windows actualmente conectado en Access VBA?

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

¿Es esta la mejor manera de hacerlo?

+1

Esta pregunta es casi duplicado exacto de http://stackoverflow.com/questions/9052/is-there-a-way-for-ms-access-to-grab-the-current-active-directory-user – Yarik

+0

Posible duplicado de [¿Hay alguna manera de que MS Access agarre al usuario actual de Active Directory?] (http://stackoverflow.com/questions/9052/is-there-a-way-for-ms-access-to-grab-the-current-active-directory-user) –

+0

Traté de reproducir los pasos mencionados [aquí] (http://stackoverflow.com/questions/168659/how-can-i-get-the-currently-logged-in-windows-user-in-access-vba#168666) (respuesta por ken) pero no pude cambiar ningún valor del objeto Environ. La única forma de hacerlo en VBA directo es la propuesta [aquí] (http://stackoverflow.com/questions/168659/how-can-i-get-the-currently-logged-in-windows-user- in-access-vba # 168986) (respuesta de knox) y no puedo entender por qué esta respuesta fue degradada. –

Respuesta

6

También podría usar Environ $ pero el método especificado por la pregunta es mejor. Los usuarios/aplicaciones pueden cambiar las variables de entorno.

1

Alternative way para hacer eso - probablemente la API que mencione sea una mejor manera de obtener un nombre de usuario.

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

También puede hacer esto:

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

También tiene una propiedad UserDomain y un montón de otras cosas:

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

+1

No es necesario si usa CreateObject(). El código anterior funcionará sin una referencia. – bobwienholt

+0

Tiene que tener la variable WshNetwork definida como un objeto genérico, en lugar de como el tipo de datos nativos del FSO (lo que sea; nunca uso el FSO excepto con el enlace tardío, así que no conozco ninguno de sus tipos de datos en todas). –

1

general uso un Environ desde dentro de VBA como en el siguiente. No he tenido los problemas que Ken menciona como posibilidades.

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

Muchos métodos alternativos en otras publicaciones, pero para responder a la pregunta: sí, esa es la mejor manera de hacerlo. Más rápido que crear un objeto COM o WMI si todo lo que desea es el nombre de usuario y está disponible en todas las versiones de Windows desde Win95.

0

hay muchas maneras de obtener el nombre de usuario actual registrado en WMI. mi camino es hacerlo a través del nombre de usuario del proceso de 'explorer.exe' porque cuando el usuario inicia sesión en la ventana, el acceso de este archivo de acuerdo con el usuario actual.

guión

WMI sería el siguiente aspecto:

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 

para más detailcheck el enlace en:
http://msdn.microsoft.com/en-us/library/aa394599%28v=vs.85%29.aspx

Cuestiones relacionadas