delphi 如何获取完整的Windows用户名

eivnm1vs  于 2022-11-04  发布在  Windows
关注(0)|答案(1)|浏览(275)

我有一个本地帐户,当我执行“whoami /all”时,该帐户用户名为“rabi”,我得到了有关该用户的一些信息:uname mikeschleppi\rabatscher....列举了所有组和一些权限。但也不是我想要的所有信息....
我可以使用GetUsernameEx API查询其中的一些信息。不过,用户帐户管理器显示了一个不错的显示名称(如:John Doe)和所使用的电子邮件地址。
我怎样才能在 Delphi 中获得这些信息(尤其是全名)?GetUsernameEx显然不是这里的选项...
澄清一下:管理我的用户帐户的帐户窗口实际上显示了我的全名x1c 0d1x
所以我想知道如何获得这些信息。我肯定你们建议的代码适用于AD(甚至可能适用于LDAP服务器),但我对本地用户的信息感兴趣...

mcvgt66p

mcvgt66p1#

您可以使用ADSI来执行此操作。下面是一个简单的示例:

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ComObj,
  ActiveX,
  ActiveDs_TLB in 'ActiveDs_TLB.pas';

function ADsGetObject(lpszPathName: PChar; const riid: TGUID; out Obj): HRESULT; stdcall; external 'activeds.dll';

function GetADsUser(const Domain, Username: string): IADsUser;
var
  Path: string;
begin
  Path := 'WinNT://' + Domain + '/' + Username;
  OleCheck(ADsGetObject(PChar(Path), IID_IADsUser, Result));
end;

procedure Main;
var
  User: IADsUser;
begin
  User := GetADsUser('yourdomain', 'yourusername');
  Writeln(User.FullName);
  Writeln(User.EmailAddress);
end;

begin
  try
    OleCheck(CoInitializeEx(nil, COINIT_APARTMENTTHREADED));
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

我使用Embarcadero的tlibimp工具获得了ADSI的TLB单元:

C:\Desktop>tlibimp -p C:\Windows\System32\activeds.tlb
Embarcadero TLIBIMP Version 12.16581
Copyright(c) 1995-2010 Embarcadero Technologies, Inc.

Opening  C:\Windows\System32\activeds.tlb
Type library loaded ....
Created  C:\Desktop\ActiveDs_TLB.dcr
Created  C:\Desktop\ActiveDs_TLB.pas

相关问题