首页  编辑  

获取域

Tags: /超级猛料/Network.网络通讯/共享和用户、域/   Date Created:

如何知道机器所在域(Domain)以及主域控制器名字?

使用PDC函数即可。

type

 NET_API_STATUS = DWORD ;

var

 NTNetGetDCName     : function ( Server , Domain : pWideChar ; var DC : pWideChar ):

   NET_API_STATUS ; StdCall ;

 NTNetApiBufferFree : function ( lpBuffer : Pointer ):

   NET_API_STATUS ; StdCall ;

function GetPDCName : string ;

const

 NTlib             = 'NETAPI32.DLL' ;

var

 pDomain           : PWideChar ;

 LibHandle         : THandle ;

begin

 Result := '' ;

 LibHandle := LoadLibrary ( NTlib );

  if LibHandle = 0 then

    raise Exception . Create ( 'Unable to map library: ' + NTlib );

  try

    @ NTNetGetDCName := GetProcAddress ( Libhandle , 'NetGetDCName' );

    @ NTNetApiBufferFree := GetProcAddress ( Libhandle , 'NetApiBufferFree' );

    try

      if NTNetGetDCName ( nil , nil , pDomain ) = 0 then

       Result := WideCharToString ( pDomain );

    finally

     NTNetApiBufferFree ( pDomain );

    end ;

  finally

   FreeLibrary ( Libhandle );

  end ;

end ;

procedure TForm1 . Button1Click ( Sender : TObject );

begin

 ShowMessage ( GetPDCName );

end ;

*************************

下面的函数获取域名:

function GetDomainName : AnsiString ;

type

WKSTA_INFO_100 = record

  wki100_platform_id : Integer ;

  wki100_computername : PWideChar ;

  wki100_langroup : PWideChar ;

  wki100_ver_major : Integer ;

  wki100_ver_minor : Integer ;

end ;

WKSTA_USER_INFO_1 = record

  wkui1_username : PChar ;

  wkui1_logon_domain : PChar ;

  wkui1_logon_server : PChar ;

  wkui1_oth_domains : PChar ;

end ;

type

//Win9X ANSI prototypes from RADMIN32.DLL and RLOCAL32.DLL

TWin95_NetUserGetInfo = function ( ServerName , UserName : PChar ; Level : DWORD ; var

  BfrPtr : Pointer ): Integer ;

stdcall ;

TWin95_NetApiBufferFree = function ( BufPtr : Pointer ): Integer ;

stdcall ;

TWin95_NetWkstaUserGetInfo = function ( Reserved : PChar ; Level : Integer ; var

  BufPtr : Pointer ): Integer ;

stdcall ;

//WinNT UNICODE equivalents from NETAPI32.DLL

TWinNT_NetWkstaGetInfo = function ( ServerName : PWideChar ; level : Integer ; var

  BufPtr : Pointer ): Integer ;

stdcall ;

TWinNT_NetApiBufferFree = function ( BufPtr : Pointer ): Integer ;

stdcall ;

function IsWinNT : Boolean ;

var

  VersionInfo : TOSVersionInfo ;

begin

  VersionInfo . dwOSVersionInfoSize := SizeOf ( TOSVersionInfo );

  Result := GetVersionEx ( VersionInfo );

  if Result then

    Result := VersionInfo . dwPlatformID = VER_PLATFORM_WIN32_NT ;

end ;

var

Win95_NetUserGetInfo : TWin95_NetUserGetInfo ;

Win95_NetWkstaUserGetInfo : TWin95_NetWkstaUserGetInfo ;

Win95_NetApiBufferFree : TWin95_NetApiBufferFree ;

WinNT_NetWkstaGetInfo : TWinNT_NetWkstaGetInfo ;

WinNT_NetApiBufferFree : TWinNT_NetApiBufferFree ;

WSNT : ^ WKSTA_INFO_100 ;

WS95 : ^ WKSTA_USER_INFO_1 ;

EC : DWORD ;

hNETAPI : THandle ;

begin

try

  Result := '' ;

  if IsWinNT then

  begin

    hNETAPI := LoadLibrary ( 'NETAPI32.DLL' );

    if hNETAPI <> 0 then

    begin @ WinNT_NetWkstaGetInfo := GetProcAddress ( hNETAPI , 'NetWkstaGetInfo' );

        @ WinNT_NetApiBufferFree   := GetProcAddress ( hNETAPI , 'NetApiBufferFree' );

      EC := WinNT_NetWkstaGetInfo ( nil , 100 , Pointer ( WSNT ));

      if EC = 0 then

      begin

        Result := WideCharToString ( WSNT ^. wki100_langroup );

        WinNT_NetApiBufferFree ( Pointer ( WSNT ));

      end ;

    end ;

  end

  else

  begin

    hNETAPI := LoadLibrary ( 'RADMIN32.DLL' );

    if hNETAPI <> 0 then

    begin @ Win95_NetApiBufferFree := GetProcAddress ( hNETAPI , 'NetApiBufferFree' );

        @ Win95_NetUserGetInfo := GetProcAddress ( hNETAPI , 'NetUserGetInfoA' );

      EC := Win95_NetWkstaUserGetInfo ( nil , 1 , Pointer ( WS95 ));

      if EC = 0 then

      begin

        Result := WS95 ^. wkui1_logon_domain ;

        Win95_NetApiBufferFree ( Pointer ( WS95 ));

      end ;

    end ;

  end ;

finally

  if hNETAPI <> 0 then

    FreeLibrary ( hNETAPI );

end ;

end ;

procedure TForm1 . Button1Click ( Sender : TObject );

begin

ShowMessage ( GetDomainName );

end ;