Q&A

  • 현재 로그인한 NT도메인명 어떻게 알죠?
현재 로그인한 NT도메인명을 알고 싶습니다.

제가 여러군데서 자료를 찾아보았는데 도통 보이지가 않아요.

어렵게 소스를 하나 구하긴 했는데 이것또한 제대로 되지가 않습니다.

아시는분 조언부탁드립니다.

그럼...



아래는 해당 소스입니다.



function GetCurrentDomain: string;

const

UNLEN = 255;

DNLEN = 255;

var

hProcess, hAccessToken : THandle;

InfoBuffer : PChar;

AccountName : array [0..UNLEN] of char;

DomainName : array [0..DNLEN] of char;



InfoBufferSize : Integer;

// InfoBufferSize : Cardinal;

AccountSize : Integer;

// AccountSize : Cardinal;

DomainSize : Integer;

// DomainSize : Cardianl;

snu : SID_NAME_USE;



begin

InfoBufferSize := 1000;

AccountSize := sizeof (AccountName);

DomainSize := sizeof (DomainName);



hProcess := GetCurrentProcess;

if OpenProcessToken (hProcess, TOKEN_READ, hAccessToken) then

try

GetMem (InfoBuffer, InfoBufferSize);

try

if GetTokenInformation(hAccessToken,TokenUser, InfoBuffer, InfoBufferSize, Cardinal(InfoBufferSize)) then

LookupAccountSid (Nil, PSIDAndAttributes (InfoBuffer)^.sid, AccountName, Cardinal(AccountSize),DomainName, Cardinal(DomainSize), snu)

else

RaiseLastWin32Error;

finally

FreeMem (InfoBuffer)

end;

Result := DomainName;

finally

CloseHandle (hAccessToken)

end

end;



3  COMMENTS
  • Profile
    컴맹... 2000.12.09 18:22
    안녕하세여...

    NT DOMAIN 이라면...

    요렇게 하면 되는걸루 알구 있습니다..

    그럼 20000



    // 기본 도메인명 가져오는 함수



    function GetDefaultDomain: String;

    var

    MyRegistry: TRegistry;

    begin

    MyRegistry := TRegistry.Create;

    with MyRegistry do

    begin

    RootKey := HKEY_LOCAL_MACHINE;

    OpenKey('SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon',FALSE);

    Result := MyRegistry.ReadString('DefaultDomainName');

    CloseKey;

    Free;

    end;

    end;





    // 현재(로그온) 도메인명 가져오는 함수

    function GetCurrentDomain: string;

    var

    hProcess, hAccessToken : THandle;

    InfoBuffer : PChar;

    AccountName : array [0..UNLEN] of char;

    DomainName : array [0..DNLEN] of char;



    InfoBufferSize : Integer;

    AccountSize : Integer;

    DomainSize : Integer;

    snu : SID_NAME_USE;



    begin

    InfoBufferSize := 1000;

    AccountSize := sizeof (AccountName);

    DomainSize := sizeof (DomainName);



    hProcess := GetCurrentProcess;

    if OpenProcessToken (hProcess, TOKEN_READ, hAccessToken) then

    try

    GetMem (InfoBuffer, InfoBufferSize);

    try

    if GetTokenInformation(hAccessToken,TokenUser, InfoBuffer, InfoBufferSize, InfoBufferSize) then

    LookupAccountSid (Nil, PSIDAndAttributes (InfoBuffer)^.sid, AccountName, AccountSize,DomainName, DomainSize, snu)

    else

    RaiseLastWin32Error;

    finally

    FreeMem (InfoBuffer)

    end;

    Result := DomainName;

    finally

    CloseHandle (hAccessToken)

    end

    end;







    곽동수 wrote:

    > 현재 로그인한 NT도메인명을 알고 싶습니다.

    > 제가 여러군데서 자료를 찾아보았는데 도통 보이지가 않아요.

    > 어렵게 소스를 하나 구하긴 했는데 이것또한 제대로 되지가 않습니다.

    > 아시는분 조언부탁드립니다.

    > 그럼...

    >

    > 아래는 해당 소스입니다.

    >

    > function GetCurrentDomain: string;

    > const

    > UNLEN = 255;

    > DNLEN = 255;

    > var

    > hProcess, hAccessToken : THandle;

    > InfoBuffer : PChar;

    > AccountName : array [0..UNLEN] of char;

    > DomainName : array [0..DNLEN] of char;

    >

    > InfoBufferSize : Integer;

    > // InfoBufferSize : Cardinal;

    > AccountSize : Integer;

    > // AccountSize : Cardinal;

    > DomainSize : Integer;

    > // DomainSize : Cardianl;

    > snu : SID_NAME_USE;

    >

    > begin

    > InfoBufferSize := 1000;

    > AccountSize := sizeof (AccountName);

    > DomainSize := sizeof (DomainName);

    >

    > hProcess := GetCurrentProcess;

    > if OpenProcessToken (hProcess, TOKEN_READ, hAccessToken) then

    > try

    > GetMem (InfoBuffer, InfoBufferSize);

    > try

    > if GetTokenInformation(hAccessToken,TokenUser, InfoBuffer, InfoBufferSize, Cardinal(InfoBufferSize)) then

    > LookupAccountSid (Nil, PSIDAndAttributes (InfoBuffer)^.sid, AccountName, Cardinal(AccountSize),DomainName, Cardinal(DomainSize), snu)

    > else

    > RaiseLastWin32Error;

    > finally

    > FreeMem (InfoBuffer)

    > end;

    > Result := DomainName;

    > finally

    > CloseHandle (hAccessToken)

    > end

    > end;

    >

  • Profile
    곽동수 2000.12.12 00:44
    이런...

    제가 자세히 알려주신 소스를 보니깐...

    해당 소스는 NT에서 직접 실행했을 경우 가능한 함수들이군요.

    제가 궁금한 부분은 Client PC에서 Login한 nt domain명을 아는거였는데...

    쩝~

  • Profile
    곽동수 2000.12.09 22:05
    답변 감사합니다.



    하지만 잘 되지 않는군요.

    GetDefaultDomain에서는 레지스트리에 그 값이 기록되어 있지 않구요...

    GetCurrentDomain에서는 제 환경이 5.0이라 API콜하는 부분에서

    몇몇 부분을 Cardinal로 캐스팅해야지 컴파일이 되더군요.

    컴파일후 실행하면

    if OpenProcessToken (hProcess, TOKEN_READ, hAccessToken) then

    이라는 부분에서 False값을 받아버려서 루프를 빠져나가버립니다.

    혹 Cardinal 캐스팅때문인가도 생각해봤지만 그 부분이 영향을 받는

    곳으로는 아예 가질안아서 제3의 문제인것 같습니다만...

    참고로 제 컴환경은 Win98이고 서버는 NT 4.0 입니다만...

    이게 해결이 되지 않아서 정말 무식한 방법(전체 도메인 리스트를

    뒤져서 해당 컴이 있는 도메인을 찾음)으로 사용하고 있는데 답답합니다^^

    좀 알려주세요~

    그럼~~~