如何在Windows中检索当前登录的用户名?

时间:2017-07-04 18:21:26

标签: windows delphi delphi-7

我希望在Delphi 7项目中检索Windows中当前登录用户的用户名(最好是从Windows XP到W10的一些解决方案)。

我尝试了this question中给出的两个解决方案,但它们都提供了用户的名称,而不是用于登录Windows的实际“用户名”。

例如,我用来登录Windows的“用户名”是“joao.victor”(使用本地Windows帐户),或者当我使用Microsoft帐户时的电子邮件。但是当我尝试这两个解决方案时,它返回的字符串是“João”,这是我的名字和在这些帐户中配置的名称。

有没有人知道我可以检索用于登录Windows而不是用户名的用户名的解决方案?

5 个答案:

答案 0 :(得分:0)

你试过这个吗?

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetCurrentUserName);
end;

function TForm1.GetCurrentUserName: string;
const
  cnMaxUserNameLen = 254;
var
  sUserName: string;
  dwUserNameLen: DWORD;
begin
  dwUserNameLen := cnMaxUserNameLen - 1;
  SetLength(sUserName, cnMaxUserNameLen);
  GetUserName(PChar(sUserName), dwUserNameLen);
  SetLength(sUserName, dwUserNameLen);
  Result := sUserName;
end;

或者

function UserName: String;
var User: PChar;
    i: DWord;
begin
  i := 1024;
  user := StrAlloc(Succ(i));
  if GetUserName(User, i) then 
     Result := StrPas(User)
  else 
     Result := 'unknown';
end;

这两个函数返回您在Windows登录中看到的用户名

请参阅GetUserName

答案 1 :(得分:0)

GetUserNameEx是最灵活的,并根据您希望获得的上下文和格式提供各种用户名。我不知道它是否适用于XP,但它适用于Windows 2000及更高版本(经过Windows 7,Server 2008和Windows Server 2012测试)。

这是一个示例控制台应用程序,它有一些有用的类型定义,以及演示可能性的函数声明和示例代码。它汇集在D2007和西雅图/柏林。

program Project1;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, WinAPI.Windows;

type
  EXTENDED_NAME_FORMAT = DWORD;

const
  NameUnknown           = 0;
  NameFullyQualifiedDN  = 1;
  NameSamCompatible     = 2;  
  NameDisplay           = 3;  
  NameUniqueId          = 6;
  NameCanonical         = 7;
  NameUserPrincipal     = 8;
  NameCanonicalEx       = 9;
  NameServicePrincipal  = 10;
  NameDnsDomain         = 12;


const
  NameFormats: array[0..8] of EXTENDED_NAME_FORMAT = (NameFullyQualifiedDN,
                                                      NameSamCompatible,
                                                      NameDisplay,
                                                      NameUniqueID,
                                                      NameCanonical,
                                                      NameUserPrincipal,
                                                      NameCanonicalEx,
                                                      NameServicePrincipal,
                                                      NameDnsDomain);

function GetUserNameExW(NameFormat: EXTENDED_NAME_FORMAT; lpNameBuffer: LPWSTR;
  var nSize: ULONG): BOOL; stdcall; 
    external 'secur32.dll' Name 'GetUserNameExW';

var
  UserName: String;
  Size: ULONG;
  i: Integer;
begin
  for i := Low(NameFormats) to High(NameFormats) do
  begin
    Size := 0;
    GetUserNameExW(NameFormats[i], nil, Size);
    SetLength(UserName, Size);
    if GetUserNameExW(NameFormats[i], PWideChar(UserName), Size) then
      WriteLn(Ord(NameFormats[i]), #32 + UserName);
  end;
  ReadLn;
end.

答案 2 :(得分:-1)

使用LUA和RunAs,这比看起来要复杂得多。 但即使转换帐户,最古老,最简单的技巧仍然有效。

在Server 2003之前使用:

 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI LastLoggedOnSAMUser

及以上:

//text[@automationid='textGameStatus' and @text>'Status: Waiting for']

LastLoggedOnSAMUser将采用DOMAIN \ USERNAME格式,其中本地域可以是句点。

答案 3 :(得分:-1)

简短答案:使用 wmic 。长答案请在https://stackoverflow.com/a/58377194/3584693

处查看我的答案

答案 4 :(得分:-2)

我没有Windows XP来测试它,但我在delphi 7和delphi 10 Seattle上尝试过它

ShowMessage(GetEnvironmentVariable('USERNAME'));