Excel - Conocer el usuario de Windows

 
Vista:

Conocer el usuario de Windows

Publicado por Albert (13 intervenciones) el 13/10/2006 13:20:16
¿Alguien sabria como capturar des de Excel el nombre del usuario de Windows con el que se está abriendo el Excel?

"application.username" sólo proporciona el que se ha entrado al Instalar el Exccel y no me sirve.

gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Conocer el usuario de Windows

Publicado por The Emulator (16 intervenciones) el 14/10/2006 04:41:53
Hola

Bueno para eso necesitas hechar mano a las APIs de Windows hay una que te permite obtener el nombre de usuario de quien esta logeado en ese momento

Para hacerlo Agrega un nuevo modulo y pega el siguiente codigo en este:

'------------------------------------------------------------------------------------------------------
Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Public Function ObtenerNombreUsuario() As String
Dim rtn As Long
Dim sBuffer As String
Dim lSize As Long

sBuffer = String$(260, Chr$(0))
lSize = Len(sBuffer) - 1
rtn = GetUserName(sBuffer, lSize)
If rtn Then
sBuffer = Left$(sBuffer, lSize)

If InStr(sBuffer, Chr$(0)) Then
sBuffer = Left$(sBuffer, InStr(sBuffer, Chr$(0)) - 1)
End If

ObtenerNombreUsuario = sBuffer
Else
'error!
ObtenerNombreUsuario = ""
End If

End Function
'------------------------------------------------------------------------------------------------------

En el codigo anterior esta hecha la declaracion a la rutina que optiene el nombre de usuario. asi como tambien hay una funcion que es la que se encarga de procesar ese nombre y retornalo a quien la llame.

Para probarlo en el excell puedes hacer esto.
Si quieres que el nombre de usuario salga el una celda escribe esto:
=ObtenerNombreUsuario()
Con eso aparecera en dicha celda el nombre de usuario.

Saludos
http://www.theemulator.tk
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Conocer "alias" de usuario de windows

Publicado por Antonio G. (1 intervención) el 14/10/2006 12:44:16
Yo también andaba necesitando algo parecido, pero mi usuario de windows es del tipo "login" es decir en mi caso a_gonzo en lugar de Antonio González. ¿Como podría obtener el Alias, en lugar del user?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Para Alber y Antonio Parte 1

Publicado por The Emulator (16 intervenciones) el 14/10/2006 16:03:36
Hola

Esto lo he dividido en varias partes porque el foro no deja escibir tanto asi que asuman como si fuera un solo mensaje.

Bueno esta es otra forma de obtener informacion de un usuario en este caso de quien se encuentra logeado en ese momento.
Con lo que les voy a colocar mas abajo se puede optener el Nombre(User), el Nombre Completo(Nombre) y otras cosa mas.

Bueno todo esta basado en una Clase echa en VBA esta clase contiene declaraciones al API de Windows entre las que esta la de la primera respuesta que habia dado.

Primero que todo agregen una clase.
Estando en el Editor de VisualBasic menu Insertar->Modulo de Clase
Eso crea una clase que por defecto se llama Clase1 cambienle el nombre a jrUsuarioNT y en ella pegen todolo que se encuentra entre 'AQUI COMIENZA LA CLASE y 'AQUI TERMINA LA CLASE

'AQUI COMIENZA LA CLASE
'---------------------------------------------------------------------------------
Option Explicit

Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Private Declare Function NetGetDCName Lib "NETAPI32.DLL" (ServerName As Byte, DomainName As Byte, DCNPtr As Long) As Long
Private Declare Function NetUserGetInfo Lib "netapi32" (lpServer As Any, UserName As Byte, ByVal Level As Long, lpBuffer As Long) As Long
Private Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyW" (RetVal As Any, ByVal Ptr As Long) As Long
Private Declare Function NetAPIBufferFree Lib "NETAPI32.DLL" Alias "NetApiBufferFree" (ByVal Ptr As Long) As Long
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Private Declare Function lstrlenW Lib "kernel32" (lpString As Any) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal codepage As Long, ByVal dwFlags As Long, lpWideCharStr As Any, ByVal cchWideChar As Long, lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long
Private Type USER_INFO_2
' El nivel 0 comienza aquí
Name As Long '0
' El nivel 1 comienza aquí
Password As Long '4
PasswordAge As Long '8
Privilege As Long '12
HomeDir As Long '16
Comment As Long '20
Flags As Long '24
ScriptPath As Long '28
' El nivel 2 comienza aquí
AuthFlags As Long '32
FullName As Long '36
UserComment As Long '40
Parms As Long '44
Workstations As Long '48
LastLogon As Long '52
LastLogoff As Long '56
AcctExpires As Long '60
MaxStorage As Long '64
UnitsPerWeek As Long '68
LogonHours As Long '72
BadPwCount As Long '76
NumLogons As Long '80
LogonServer As Long '84
CountryCode As Long '88
codepage As Long '92
End Type
Private Const NERR_Success = 0
Private Const NERR_BASE = 2100
Private Const NERR_InvalidComputer = (NERR_BASE + 251)
Private Const NERR_UseNotFound = (NERR_BASE + 150)

Private Const CP_ACP = 0

'variables locales para almacenar los valores de las propiedades
Private mvarDominio As String 'copia local
Private mvarComment_ As String 'copia local
Private mvarFullName_ As String 'copia local
Private mvarName_ As String 'copia local
Private mvarNumError As Long 'copia local
Private mvarTextoError As String 'copia local
Private mvarUsuario As String 'copia local
'variables locales para almacenar los valores de las propiedades
Private mvarHome_Dir_ As String 'copia local
Private mvarScript_path_ As String 'copia local
Private mvarWorkstations_ As String 'copia local
Private mvarLast_logon_ As String 'copia local
Private mvarLast_logoff_ As String 'copia local
Private mvarLogon_server_ As String 'copia local
Private mvarPassword_age_ As Long 'copia local
Private mvarPriv_ As Long 'copia local
'variables locales para almacenar los valores de las propiedades
Private mvarPrivTxt As String 'copia local
Public Property Get PrivTxt() As String
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.PrivTxt
PrivTxt = mvarPrivTxt
End Property

Public Property Get Priv_() As Long
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.Priv_
Priv_ = mvarPriv_
End Property

Public Property Get Password_age_() As Long
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.Password_age_
Password_age_ = mvarPassword_age_
End Property

Public Property Let Last_logon_(ByVal vData As String)
'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
'Syntax: X.Last_logon_ = 5
mvarLast_logon_ = vData
End Property

Public Property Get Workstations_() As String
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.Workstations_
Workstations_ = mvarWorkstations_
End Property

Public Property Get Script_path_() As String
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.Script_path_
Script_path_ = mvarScript_path_
End Property
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Para Alber y Antonio Parte 2

Publicado por The Emulator (16 intervenciones) el 14/10/2006 16:06:50
Public Property Get Home_Dir_() As String
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.Home_Dir_
Home_Dir_ = mvarHome_Dir_
End Property

Public Property Get Usuario() As String
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.Usuario
Usuario = mvarUsuario
End Property

Private Function GetStrFromBufferA(sz As String) As String
' Returns the string before first null char encountered (if any) from an ANSII string.
If InStr(sz, vbNullChar) Then
GetStrFromBufferA = Left$(sz, InStr(sz, vbNullChar) - 1)
Else
' If sz had no null char, the Left$ function
' above would return a zero length string ("").
GetStrFromBufferA = sz
End If
End Function

Private Function GetStrFromPtrW(lpszW As Long) As String
' Returns an ANSI string from a pointer to a Unicode string.
Dim sRtn As String
sRtn = String$(lstrlenW(ByVal lpszW) * 2, 0) ' 2 bytes/char
' WideCharToMultiByte also returns Unicode string length
Call WideCharToMultiByte(CP_ACP, 0, ByVal lpszW, -1, ByVal sRtn, Len(sRtn), 0, 0)
GetStrFromPtrW = GetStrFromBufferA(sRtn)
End Function

Public Property Get TextoError() As String
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.TextoError
TextoError = mvarTextoError
End Property

Public Property Let NumError(ByVal vData As Long)
'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
'Syntax: X.NumError = 5
mvarNumError = vData
End Property

Public Property Get NumError() As Long
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.NumError
NumError = mvarNumError
End Property

Private Function GetPrimaryDCName(ByVal MName As String, _
ByVal DName As String) As String
Dim Result As Long, DCName As String, DCNPtr As Long
Dim DNArray() As Byte, MNArray() As Byte, DCNArray(100) As Byte
MNArray = MName & vbNullChar
DNArray = DName & vbNullChar
Result = NetGetDCName(MNArray(0), DNArray(0), DCNPtr)
If Result <> 0 Then
Debug.Print "Error: " & Result
Exit Function
End If
Result = PtrToStr(DCNArray(0), DCNPtr)
Result = NetAPIBufferFree(DCNPtr)
DCName = DCNArray()
GetPrimaryDCName = DCName
End Function

Public Sub ObtenerDatosusuario(Optional Usuario As String = "")
Dim Servidor As String, res As Boolean
If Usuario = "" Then Usuario = mvarUsuario
'busco al usuario en el dominio MiDominio
'busco el pdc del dominio
Servidor = GetPrimaryDCName("", "MiDominio")
res = ObtenerDatosUsuarioRed(Servidor, Usuario)

End Sub
Public Property Let Name_(ByVal vData As String)
'se usa al asignar un valor a la propiedad, en la parte izquierda de una asignación.
'Syntax: X.Name_ = 5
mvarName_ = vData
End Property

Public Property Get Name_() As String
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.Name_
Name_ = mvarName_
End Property

Public Property Get FullName_() As String
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.FullName_
FullName_ = mvarFullName_
End Property

Public Property Get Comment_() As String
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.Comment_
Comment_ = mvarComment_
End Property

Public Property Get Dominio() As String
'se usa al recuperar un valor de una propiedad, en la parte derecha de una asignación.
'Syntax: Debug.Print X.Dominio
Dominio = mvarDominio
End Property

Private Function ObtenerDatosUsuarioRed(ByVal Servidor As String, Usuario As String) As Boolean
Dim bServer() As Byte, bUser() As Byte, BufPtr As Long
Dim res As Long, User_Info As USER_INFO_2

bServer = Servidor & vbNullChar
bUser = Usuario & vbNullChar
res = NetUserGetInfo(bServer(0), bUser(0), 2, BufPtr)
If res = NERR_Success Then
mvarNumError = 0
mvarTextoError = ""
Call MoveMemory(User_Info, ByVal BufPtr, Len(User_Info))
mvarName_ = GetStrFromPtrW(User_Info.Name)
mvarFullName_ = GetStrFromPtrW(User_Info.FullName)
mvarComment_ = GetStrFromPtrW(User_Info.Comment)
mvarHome_Dir_ = GetStrFromPtrW(User_Info.HomeDir)
mvarLogon_server_ = GetStrFromPtrW(User_Info.LogonServer)
mvarPassword_age_ = User_Info.PasswordAge
mvarPriv_ = User_Info.Privilege
Select Case mvarPriv_
Case 0: mvarPrivTxt = "Invitado"
Case 1: mvarPrivTxt = "Usuario"
Case 2: mvarPrivTxt = "Administrador"
End Select
mvarScript_path_ = GetStrFromPtrW(User_Info.ScriptPath)
mvarWorkstations_ = GetStrFromPtrW(User_Info.Workstations)
Else
mvarNumError = res
Select Case res
Case NERR_InvalidComputer: mvarTextoError = "Servidor no válido"
Case NERR_UseNotFound: mvarTextoError = "Usuario no encontrado"
Case Else: mvarTextoError = "Error desconocido"
End Select
mvarName_ = ""
mvarFullName_ = ""
mvarComment_ = ""
mvarHome_Dir_ = ""
mvarLogon_server_ = ""
mvarPassword_age_ = 0
mvarPriv_ = -1
mvarPrivTxt = "Desconocido"
mvarScript_path_ = ""
mvarWorkstations_ = ""
End If
res = NetAPIBufferFree(BufPtr)
End Function

Private Sub Class_Initialize()
Dim sName As String
Dim lNameLen As Long
Dim lReturn As Long
lNameLen = 255
sName = Space(256)
lReturn = GetUserName(sName, lNameLen)
If sName = "" Then
mvarUsuario = "(Desconocido)"
Else
mvarUsuario = Left(sName, InStr(sName, Chr(0)) - 1)
End If

End Sub
'---------------------------------------------------------------------------------
'AQUI TERMINA LA CLASE

Ahora dentro de cualquiera de las hojas que tiene COMO EJEMPLO coloque cualquier procedimiento que llamen cuando necesite por ejemplo

Public Sub MostarDatos()
Dim InfoUsuario As New jrUsuarioNT
InfoUsuario.ObtenerDatosusuario
MsgBox InfoUsuario.Name_
MsgBox InfoUsuario.FullName_
End Sub

Con lo anterior ya queda funcionando lo de las dos preguntas de ustedes asi que ya solo es mirar donde las ban a usar.

Saludos
http://www.theemulator.tk
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Para Alber y Antonio Parte 2

Publicado por José Luis (700 intervenciones) el 16/10/2006 11:09:49
Emulator, siento comunicarte que no rula (al menos en mi PC (WXP, SP2, Office 2003).
La línea "Dim InfoUsuario As New jrUsuarioNT " no le gusta al VBA.
¿Hay algún error?

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Para Alber y Antonio Parte 2

Publicado por The Emulator (16 intervenciones) el 16/10/2006 16:37:36
El codigo que pase si funciona.

Una pregunta ¿si cambiaste el nombre de la clase a jrUsuarioNT? ya que por defecto al agregar una clase aparece con el nombre de Clase1.

¿Que error sale al ejecutarla?

Para estar mas seguros si quieres te envio el archivo de Excel con el ejemplo funcionando.

http://www.theemulator.tk
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Solucionado

Publicado por José Luis (700 intervenciones) el 16/10/2006 19:24:02
Hola The emulator, perdona el error, esta mañana pasé dos post indicando que ya estaba solucionado pero no sé por qué no se han puesto en el foro.

El error estaba, tal como indicas, en que el modulo de clase lo renombré mal, en vez de copiar y pegar lo escribí directamente desde el teclado y metí la pata. Mil disculpas pido por ello y porque no subieron los post.

No obstante, en la Sub ObtenerDatosusuario, la sentencia
Servidor = GetPrimaryDCName("", "MiDominio")

creo que hay que modificarla por

Servidor = GetPrimaryDCName("", Dominio)

¿es un error?¿estoy equivocado? Con la sentecia original no consigo traer el nombre completo pero con la segunda sí.

Saludos y enhorabuena por el código. ;-).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Solucionado

Publicado por The Emulator (16 intervenciones) el 16/10/2006 20:11:58
Bueno como lo cambiaste esta bien.

El problema estaba en que como ese codigo se usa para optener datos de un usuario especifico en algunas funciones habia que colocar algunos datos manuales.

Como podras ver el procedimiento ObtenerDatosusuario recibe un parametro opcional en el que se debe indicar un usario para traer sus datos, sino se especifica un usuario el programa busca los datos del usuario que esta logeado actualmente, asi que de alli viene ese problema.

Que bien que te halla servido.

Saludos y hasta la proxima.
http://www.theemulator.tk
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Solucionado

Publicado por Eddy David (1 intervención) el 31/10/2012 23:27:51
Hola, el codigo me sirvio sin problemas, pero como hago para insertar la informacion del usuario "FullName_" dentro de una celda?

Gracias y saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Solucionado

Publicado por Jose Luis (1 intervención) el 09/02/2016 09:37:44
Buenas,
sé que el tema es de hace muchos años pero seguro que aún hay gente buscando esta solución, por lo que aporto mi grano de arena.
En VBA existen unas variables donde se pueden consultar múltiples variables de entorno con la orden 'Environ'.
Ejemplo: Para consultar el usuario de Windows:

Dim UsuarioDeWin As String
UsuarioDeWin = Environ("USERNAME")

Existen otros muchos argumentos a pasar, pongo unos cuantos:

COMPUTERNAME
ComSpec
FP_NO_HOST_CHECK
HOMEDRIVE
HOMEPATH
LOGONSERVER
NUMBER_OF_PROCESSORS
OS
Path
PATHEXT
PROCESSOR_ARCHITECTURE
PROCESSOR_IDENTIFIER
PROCESSOR_LEVEL
PROCESSOR_REVISION
ProgramFiles
SESSIONNAME
SystemDrive
SystemRoot

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

RE:Solucionado

Publicado por Ricardo Calderon (1 intervención) el 09/03/2018 19:21:29
Excelente!!!

Lo que estaba buscando, muy sencillo.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Aporte al conocimiento

Publicado por Humberto (1 intervención) el 26/07/2018 15:44:19
José Luis:

su aporte ha sido de gran ayuda; muchas gracias.
No pensemos nunca que alguna oportunidad ya está fuera de tiempo; este es el caso, las notas están desde 2016 hacía atrás y en pleno 2018 me ha sido de gran ayuda.

ÉXITOS!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar