我需要在Delphi中获取域上的Windows机器的完全合格的域名。
我试图使用LookupAccountSid,但它只给我netbios域名,在我的情况下,它是“内联网”,但我需要充分的“intranet.companyname.com”
有任何想法吗?
尝试GetUserNameEx
Windows API函数。
const NameUnknown = 0; NameFullyQualifiedDN = 1; NameSamCompatible = 2; NameDisplay = 3; NameUniqueId = 6; NameCanonical = 7; NameUserPrincipal = 8; NameCanonicalEx = 9; NameServicePrincipal = 10; NameDnsDomain = 12; function GetUserNameExString(ANameFormat: DWORD): string; var Buf: array[0..256] of Char; BufSize: DWORD; GetUserNameEx: function (NameFormat: DWORD; lpNameBuffer: LPSTR; var nSize: ULONG): BOOL; stdcall; begin Result := ''; BufSize := SizeOf(Buf) div SizeOf(Buf[0]); GetUserNameEx := GetProcAddress(GetmoduleeHandle('secur32.dll'), 'GetUserNameExA'); if Assigned(GetUserNameEx) then if GetUserNameEx(ANameFormat, Buf, BufSize) then Result := Buf; end;
使用NameDnsDomain
格式,例如,如果您登录到“www.mydomain.com”域,将导致www.mydomain.com\user_name
。
由于我现在在我们的应用程序中为自己的需要实现了这个功能,@ iPath的评论是正确的。 更好地使用GetComputerNameEx
,并根据自己的需要指定一个COMPUTER_NAME_FORMAT
。
Delphi实现看起来像这样(Unicode版本):
interface ... type COMPUTER_NAME_FORMAT = ( ComputerNameNetBIOS, ComputerNameDnsHostname, ComputerNameDnsDomain, ComputerNameDnsFullyQualified, ComputerNamePhysicalNetBIOS, ComputerNamePhysicalDnsHostname, ComputerNamePhysicalDnsDomain, ComputerNamePhysicalDnsFullyQualified, ComputerNameMax); function GetComputerNameExString(ANameFormat: COMPUTER_NAME_FORMAT): WideString; implementation ... function GetComputerNameExW(NameType: COMPUTER_NAME_FORMAT; lpBuffer: LPWSTR; var nSize: DWORD): BOOL; stdcall; external kernel32 name 'GetComputerNameExW'; function GetComputerNameExString(ANameFormat: COMPUTER_NAME_FORMAT): WideString; var nSize: DWORD; begin nSize := 1024; SetLength(Result, nSize); if GetComputerNameExW(ANameFormat, PWideChar(Result), nSize) then SetLength(Result, nSize) else Result := ''; end;
NetGetJoinInformation
应该可以正常工作。
MSDN:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa370423(v=vs.85).aspx
例:
type PWKSTA_INFO_100 = ^WKSTA_INFO_100; WKSTA_INFO_100 = packed record wki100_platform_id: DWord; wki100_computername: PWChar; wki100_langroup: PWChar; wki100_ver_major: DWord; wki100_ver_minor: DWord; end; TNetSetupJoinStatus = ( NetSetupUnknownStatus, NetSetupUnjoined, NetSetupWorkgroupName, NetSetupDomainName ); TNetApiBufferFreeFunction = function(ABuffer: Pointer): DWORD; stdcall; TNetWkstaGetInfoFunction = function(const Aservername: PWChar; const ALevel: DWord; const ABufptr: Pointer): DWORD; stdcall; TNetGetJoinInformationFunction = function(const AserverName: PWChar; out ANameBuffer: PWChar; out ABufferType: TNetSetupJoinStatus): DWORD; stdcall; const NERR_SUCCESS = 0; function GetLocalComputerDomainName: string; var NetApiBuffer: Pointer; NetApi: THandle; NetApiBufferFree: TNetApiBufferFreeFunction; NetWkstaGetInfo: TNetWkstaGetInfoFunction; NetGetJoinInformation: TNetGetJoinInformationFunction; NetSetupJoinStatus: TNetSetupJoinStatus; NameBuffer: PWideChar; begin Result := ''; NetApi := LoadLibrary('netapi32.dll'); if NetApi <> 0 then begin NetApiBufferFree := TNetApiBufferFreeFunction( GetProcAddress(NetApi, 'NetApiBufferFree')); NetGetJoinInformation := TNetGetJoinInformationFunction(GetProcAddress(NetApi, 'NetGetJoinInformation')); NetWkstaGetInfo := TNetWkstaGetInfoFunction( GetProcAddress(NetApi, 'NetWkstaGetInfo')); if @NetApiBufferFree <> nil then begin if @NetSetupJoinStatus <> nil then begin if NetGetJoinInformation(nil, NameBuffer, NetSetupJoinStatus) = NERR_SUCCESS then begin if NetSetupJoinStatus = NetSetupDomainName then begin Result := NameBuffer; end; NetApiBufferFree(NameBuffer); end; end; end; FreeLibrary(NetApi); end; end;
我尝试了以上所有,但没有成功。 最后,我决定只是抓住环境变量。
uses jclSysInfo; function GetDomain:string; begin result:=GetEnvironmentVariable('USERDNSDOMAIN'); end;
测试服务器2008 R2 – 工作正常。 返回“server.home.lan”。 在Windows 7非域连接的PC上产生一个空字符串。