본문 바로가기
데스크탑/비주얼 베이직 6

[API]Domain 과 User name 가져오기.

by 브래드.권 2009. 1. 16.


Domain/Computer name 과 user name 을 가져오는 API 입니다.
이 API 의 설명은 다음과 같습니다. 

The GetUserNameEx function retrieves the name of the user or other security principal associated with the calling thread. You can specify the format of the returned name. 

해석) GetUserNameEx 함수는 사용자 이름이나 호출하는 thread 와 관련있는 다른 보안 주체를 가져온다. 그리고 반환되는 이름의 형식을 지정할 수가 있다.

라고 되어있는데, 다른 보안 주체라는 것이 예를 들어 client 가 특정 network domain 에 묶여있다거나 할때의 domain\username 이런식이 아닌가 생각됩니다. 여기에 대해서는 다른 고수분들에게 물어보시길.. 

선언)

 Public Declare Function GetUserNameEx Lib "secur32" Alias "GetUserNameExA" ( _
 ByVaL NameFormat As EXTENDED_NAME_FORMAT, _
 ByVaL lpNameBuffer As String, _
 ByRef nSize As Long) As Long 

인자값)

NameFormat

-> Value from the EXTENDED_NAME_FORMAT enumeration type indicating the desired name format. This value cannot be NameUnknown.

해석) EXTENDED_NAME_FORMAT 이라는 enumeration type 에 있는 가져오고자 하는 형식. 이 값은 NameUnkwon 이 될 수 없다. 이 값은 함수에 던져주는 인자.

EXTENDED_NAME_FORMAT 정의)

Public Enum EXTENDED_NAME_FORMAT
    NameUnknown = 0
    NameFullyQualifiedDN = 1
    NameSamCompatible = 2       ' domain/computername\username

    NameDisplay = 3
    NameUniqueId = 6
    NameCanonical = 7
    NameUserPrincipal = 8
    NameCanonicalEx = 9
    NameServicePrincipal = 10
End Enum

lpNameBuffer

-> Pointer to a buffer that receives the name in the specified format.
해석) API 함수가 반환하는 값을 담을 buffer 의 pointer 를 넘겨준다. 

nSize
-> buffer 의 길이.

 사용 예제)

API 함수와 EXTENDED_NAME_FORMAT 선언 후, 다음과 같은 식으로 작성하면 됩니다.

Dim sBuffer As String
Dim ret As Long
Dim arrTemp

sBuffer = String(256, 0)
ret = Len(sBuffer) 

If GetUserNameEx(NameSamCompatible, sBuffer, ret) <> 0 Then
        
arrTemp = Split(Left$(sBuffer, ret), "\")
End If

위의 코드는 Domain/ComputerName\UserName 형식으로 가져와 배열에 "\" 로 나누어 저장합니다.