devxlogo

Finding User NAME on NT

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
See also  Professionalism Starts in Your Inbox: Keys to Presenting Your Best Self in Email
devxblackblue

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist