如何知道机器所在域(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 ;