Finding User NAME on NT

Question:
My problem is that once I get the logged-on user id, I need to get their full name from the NT security. Is this possible? For example:

UID: jsmith123
Name: John Smith or Smith, John (however names are stored)

Answer:
The following VB code will get you what you want (VB 4.0-32/VB 5.0/VB 6.0):

Option ExplicitPrivate m_strUserName      As StringPrivate m_strServerName    As StringPrivate Declare Function GetUserName _   Lib "advapi32.dll" Alias "GetUserNameA" _   (ByVal lpBuffer As String, _    nSize As Long) As LongPrivate Declare Function NetUserGetInfo _   Lib "netapi32" _   (ServerName As Byte, _    UserName As Byte, _    ByVal Level As Long, _    lpBuffer As Long) As LongPrivate Declare Function NetGetDCName _   Lib "netapi32.dll" _   (ServerName As Byte, _    DomainName As Byte, _    Buffer As Long) As LongPrivate Declare Function NetApiBufferFree _   Lib "netapi32" _   (ByVal pBuffer As Long) As LongPrivate Declare Sub CopyMem _   Lib "kernel32" Alias "RtlMoveMemory" _   (pTo As Any, _    uFrom As Any, _    ByVal lSize As Long)Private Declare Function lstrlenW _   Lib "kernel32" _   (ByVal lpString As Long) As LongPrivate Declare Function lstrlen _   Lib "kernel32" _   (ByVal lpString As Long) As LongPrivate Const constUserInfo10       As Long = 10Private Type USER_INFO_10_API   Name As Long   Comment As Long   UserComment As Long   FullName As LongEnd TypePrivate Type USER_INFO_10   Name As String   Comment As String   UserComment As String   FullName As StringEnd TypePrivate Const NERR_Success As Long = 0&Private Const ERROR_MORE_DATA As Long = 234&Private Sub GetPDC(ByVal xi_strServer As String, _                   ByVal xi_strDomain As String, _                   ByRef xo_strPDC_Name As String)   Dim p_strTmp                        As String   Dim p_lngRtn                        As Long   Dim p_lngBufferPtr                  As Long   Dim p_astrTmp(100)                  As Byte   Dim p_abytServerName()              As Byte   Dim p_abytDomainName()              As Byte   Dim p_vntReplacementStrings         As Variant       ' ------------------------------------------   ' Move to byte array   ' ------------------------------------------   p_abytServerName = xi_strServer & vbNullChar   p_abytDomainName = xi_strDomain & vbNullChar               ' ------------------------------------------   ' Get the name of the PDC   ' ------------------------------------------   p_lngRtn = NetGetDCName(p_abytServerName(0), _                           p_abytDomainName(0), _                           p_lngBufferPtr)      ' ------------------------------------------   ' Set the return value (zero is success)   ' ------------------------------------------   If p_lngRtn <> 0 Then      Exit Sub   End If            ' Translate the name   If p_lngRtn = 0 Then      xo_strPDC_Name = PointerToStringW(p_lngBufferPtr)   Else      xo_strPDC_Name = ""   End If      ' Free the buffer   NetApiBufferFree p_lngBufferPtr   End SubPublic Function UserFullName() As String   Dim p_typUserInfo                   As USER_INFO_10   Dim p_typUserInfoAPI                As USER_INFO_10_API   Dim p_lngBuffer                     As Long   Dim p_bytServerName()               As Byte   Dim p_bytUserName()                 As Byte   Dim p_lngRtn                        As Long   ' Get the server name   If Len(Trim$(m_strServerName)) = 0 Then      GetPDC "", "", m_strServerName   End If      ' Convert string to a pointer   If Len(Trim$(m_strServerName)) = 0 Then      'p_lngPtrServerName = 0&      p_bytServerName = vbNullChar   Else      p_bytServerName = m_strServerName & vbNullChar      'p_lngPtrServerName = StrPtr(m_strServerName)   End If      ' Make sure we have a user name   If m_strUserName = vbNullString Then      m_strUserName = Module1.UserName()   End If      ' Convert the user name to a pointer   If Len(Trim$(m_strUserName)) = 0 Then      Exit Function 'Handle the error   Else      p_bytUserName = m_strUserName & vbNullChar   End If      ' Get the current info   p_lngRtn = NetUserGetInfo(p_bytServerName(0), _                             p_bytUserName(0), _                             constUserInfo10, _                             p_lngBuffer)                                If p_lngRtn = NERR_Success Then      CopyMem p_typUserInfoAPI, _              ByVal p_lngBuffer, _              Len(p_typUserInfoAPI)            p_typUserInfo.FullName = PointerToStringW(p_typUserInfoAPI.FullName)      p_typUserInfo.Comment = PointerToStringW(p_typUserInfoAPI.Comment)      p_typUserInfo.Name = PointerToStringW(p_typUserInfoAPI.Name)      p_typUserInfo.UserComment = PointerToStringW(p_typUserInfoAPI.UserComment)            UserFullName = p_typUserInfo.FullName   End If       If p_lngBuffer Then      Call NetApiBufferFree(p_lngBuffer)   End If   End FunctionPublic Function UserName() As String   Dim p_strBuffer                     As String   Dim p_lngBufSize                    As Long   Dim p_strName                       As String   Dim p_lngRtn                        As Long      ' ------------------------------------------   ' Retrieve the curent user's name from the   '     operating system   ' ------------------------------------------   p_strBuffer = Space$(255)   p_lngBufSize = Len(p_strBuffer)   p_lngRtn = GetUserName(p_strBuffer, p_lngBufSize)      ' ------------------------------------------   ' If failed, then just put in a blank   ' Otherwise, fill in user name on the form   ' ------------------------------------------   If p_lngRtn > 0 Then      m_strUserName = Left$(p_strBuffer, p_lngBufSize - 1)   Else      m_strUserName = vbNullString   End If      UserName = m_strUserName   End FunctionPrivate Function PointerToStringW(lpStringW As Long) As String   Dim Buffer() As Byte   Dim nLen As Long      If lpStringW Then      nLen = lstrlenW(lpStringW) * 2      If nLen Then         ReDim Buffer(0 To (nLen - 1)) As Byte         CopyMem Buffer(0), ByVal lpStringW, nLen         PointerToStringW = Buffer      End If   End IfEnd Function
Share the Post:
Share on facebook
Share on twitter
Share on linkedin

Overview

Recent Articles: