2008-12-03 23 views

Respuesta

16

Una forma sería pedir el medio ambiente:

Dim UserName As String 
Dim UserDomain As String 
UserName = Environ("USERNAME") 
UserDomain = Environ("USERDOMAIN") 

+0

Esto no es seguro si necesita hacer comprobaciones basadas en el usuario actual. Basta con modificar las variables de entorno (use 'SET USERNAME = pwned' en el símbolo del sistema y ejecute la aplicación desde ese indicador). – Fulvio

+0

La palabra "inseguro" implica que es un riesgo de seguridad. Eso no es en absoluto el caso. Por supuesto, se puede escribir todo el entorno de un proceso, pero ese es generalmente el caso, y sin embargo, todo tipo de aplicaciones leen su material del entorno. Si alguien basa las tareas que necesitan una autorización adecuada en valores que han leído del entorno, es enteramente su culpa. – Tomalak

+0

Quería agregar información adicional al comentario anterior, pero SO me bloqueó ayer por cualquier razón. Mi punto fue subrayar que la versión API publicada por Stefan es un poco mejor desde el punto de vista de la seguridad, dado que el nombre de usuario se proporciona mediante la API de Win32 y no se puede modificar tan fácilmente como la variable env USERNAME/USERDOMAIN. – Fulvio

0

¿Qué hay de esto (funciona en Windows NT y representan sólo, obviamente.)?

Private Function IsAdmin() As Boolean 
Dim groups As Object 
Dim user As Object 

Set groups = GetObject("WinNT://./administrators") 

For Each user In groups.members 

If UCase(Environ("USERNAME")) = UCase(user.Name) Then 
IsAdmin = True 
End If 

Next user 

End Function 
+0

No puedo recomendar el uso de esta implementación incluso con el propósito de determinar si el usuario tiene derechos administrativos. En primer lugar, no se establece el valor de retorno predeterminado, a pesar de que es False implícitamente. En segundo lugar, debe salir del bucle For una vez que coincidan los nombres. –

+0

el código puede ser menos que ideal pero responde la pregunta a saber Environ ("NOMBRE DE USUARIO") – MikeT

8

y la API-version:

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

Declare Function LookupAccountName Lib "advapi32.dll" Alias "LookupAccountNameA" (lpSystemName As String, ByVal lpAccountName As String, sid As Any, cbSid As Long, ByVal ReferencedDomainName As String, cbReferencedDomainName As Long, peUse As Long) As Long 

Private Sub Form_Load() 
    Dim sDomainName As String * 255 
    Dim lDomainNameLength As Long  
    Dim sUserName as String 
    Dim bUserSid(255) As Byte  
    Dim lSIDType As Long 

    Rem Create a buffer 
    sUserName = String(100, Chr$(0)) 

    Rem Get the username 
    GetUserName sUserName, 100 

    Rem strip the rest of the buffer 
    sUserName = Left$(sUserName, InStr(sUserName, Chr$(0)) - 1) 

    rem Show the temppath and the username 
    MsgBox "Hello " + strUserName 

    lResult = LookupAccountName(vbNullString, sUserName, bUserSid(0), 255, sDomainName, lDomainNameLength, _ 
    lSIDType) 
    if lResult <>0 then 
     msgbox sDomainName 
    end if 
end sub 
4

Utilice los siguientes métodos del objeto WshNetwork, que está disponible después de hacer referencia a la Modelo de objetos de Windows Script Host en su proyecto:

Dim Network As WshNetwork 
Set Network = New WshNetwork 

Debug.Print "ComputerName: " & Network.ComputerName 
Debug.Print "UserDomain: " & Network.UserDomain 
Debug.Print "UserName: " & Network.UserName 

Eché los resultados a mayúscula o minúscula para mayor coherencia, pero esos son los métodos que necesita.

Tenga en cuenta que cuando se ejecuta en una máquina que no ha iniciado sesión en un dominio, ComputerName y UserDomain devuelven lo mismo: el nombre de la computadora.

Cuestiones relacionadas