-1

在 InitializeSetup() 函数以及其他操作中,当安装程序运行时,我希望安装程序检索当前的 UPN。UserName 变量是不够的。我也尝试过使用 WTSQuerySessionInformation() 函数在此处讨论的方法,但它们似乎没有返回我正在寻找的内容。根据组织和设置,UPN 通常应该返回某种我正在寻找的电子邮件地址。有人可以阐明如何将完整的 UPN 值作为字符串返回吗?谢谢你。

编辑:

我还尝试了 GetUserNameExW() 函数,将值 8 作为引用 UserNamePrincipal 的输入传递,但是我似乎返回了一个空值。

function GetUserNameExW(NameFormat: Integer; lpNameBuffer: string; var nSize: DWORD): Boolean;
  external 'GetUserNameExW@secur32.dll stdcall';
var
  NumChars: DWORD;
  OutStr: string;
  name: string;

begin
  SetLength(OutStr, NumChars);
  GetUserNameExW(8, OutStr, NumChars);
  name := Copy(OutStr,1,NumChars);
4

2 回答 2

1

调用GetUserNameExW以获取当前用户userPrincipalName(UPN) 属性的正确代码如下所示:

function GetUserNameExW(NameFormat: Integer; lpNameBuffer: string; var nSize: DWORD): Boolean;
  external 'GetUserNameExW@secur32.dll stdcall';

function GetUserPrincipalName(): string;
var
  NumChars: DWORD;
  OutStr: string;
begin
  result := '';
  NumChars := 0;
  if (not GetUserNameExW(8, '', NumChars)) and (DLLGetLastError() = 234) then
  begin
    SetLength(OutStr, NumChars);
    if GetUserNameExW(8, OutStr, NumChars) then
      result := Copy(OutStr, 1, NumChars);
  end;
end;

8参数的值NameFormat对应NameUserPrincipalEXTENDED_NAME_FORMAT枚举中,值为234API 值ERROR_MORE_DATA

然而——正如我在评论中指出的——如果你正在寻找一个电子邮件地址,这将不是这样做的代码,因为userPrincipalName(UPN) 是一个单独的用户属性(事实上,在许多组织中,如果不是大多数组织的话,UPN 与用户的电子邮件地址不同)。此外,如果您假设 UPN 与用户的电子邮件电子邮件地址之一相同,这也是一个错误的假设,因为 UPN 的值通常不在用户的有效电子邮件地址列表中。

关键是,如果您正在寻找一种可靠的方法来为用户获取有效的电子邮件地址,UPN 不会给您一个。

于 2022-02-22T20:01:25.747 回答
-2

我自己设法解决了这个问题,但仍然不能 100% 确定为什么我之前的迭代会导致奇怪的行为。

本质上,我必须在之前添加一个 if 检查:

if GetUserNameExW(8, OutStr, NumChars) then
于 2022-02-21T15:35:19.600 回答