我希望在Delphi 7项目中检索Windows中当前登录用户的用户名(最好是从Windows XP到W10的一些解决方案)。
我尝试了this question中给出的两个解决方案,但它们都提供了用户的名称,而不是用于登录Windows的实际“用户名”。
例如,我用来登录Windows的“用户名”是“joao.victor”(使用本地Windows帐户),或者当我使用Microsoft帐户时的电子邮件。但是当我尝试这两个解决方案时,它返回的字符串是“João”,这是我的名字和在这些帐户中配置的名称。
有没有人知道我可以检索用于登录Windows而不是用户名的用户名的解决方案?
答案 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'));