如何在Delphi中获取Windows上的完全限定域名

Gil*_*mor 15 windows delphi domain-name

我需要在Delphi中为域上的Windows机器获取完全限定的域名.

我试过用LookupAccountSid它但它只给我netbios域名,在我的情况下它是"intranet"但我需要完整的"intranet.companyname.com"

有任何想法吗?

kob*_*bik 9

尝试GetUserNameExWindows 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(GetModuleHandle('secur32.dll'), 'GetUserNameExA');
  if Assigned(GetUserNameEx) then
    if GetUserNameEx(ANameFormat, Buf, BufSize) then
      Result := Buf;
end;
Run Code Online (Sandbox Code Playgroud)

NameDnsDomain例如,www.mydomain.com\user_name如果您登录"www.mydomain.com"域,将导致使用该格式.


由于我现在在我们的应用程序中根据自己的需要实现了这个,@ 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;
Run Code Online (Sandbox Code Playgroud)

  • 好的`NameDnsDomain`这很好用.非常感谢 (3认同)
  • 这是完全错误的方法:如果计算机已加入FOO.com,但是您的程序是在user3@BAR.com下启动的,该怎么办?如果BAR.com和FOO.com是受信任的Active Directory域,则可能会发生(并且会发生)。最好使用GetComputerNameEx并指定COMPUTER_NAME_FORMAT:http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms724301(v=vs.85).aspx (2认同)
  • @dominikkv,这取决于Delphi版本.旧版本没有定义此API. (2认同)