从UAC开始时获取当前用户名

本文关键字:用户 获取 UAC 开始时 | 更新日期: 2023-09-27 18:01:53

我们的设置有一个嵌入式清单,在应用程序启动之前触发UAC。(应用程序以admin用户运行)。然而,如果安装需要安装。net框架,我们必须在重新启动后继续安装。出于这个原因,我们必须在当前用户的RunOnce中创建一个注册表项。

不幸的是,HKEY_CURRENT_USER指向管理员的注册表。我们需要找出当前登录并开始安装的用户。(普通用户单击setup.exe,管理员在UAC提示中输入他的详细信息。我们需要找出用户是谁)

我已经尝试了所有通常的方法(环境)。用户名、WindowsIdentity.GetCurrent ())

谢谢!

从UAC开始时获取当前用户名

您可以使用LsaEnumerateLogonSessions函数来检索您需要的内容。然而,它是一个winapi C函数调用。如果您需要它的托管版本,我相信您可以查看Cassia的源代码,Cassia在其终端服务API中使用该函数。调用应该是相同的。你也可以看这里

也可以使用NetWkstaUserEnum WINAPI函数。您可以在这里找到它的托管包装器

使用Cassia库,此代码可以正常工作:

ITerminalServicesManager manager = new TerminalServicesManager();
ITerminalServicesSession session = manager.CurrentSession;
string userInfo = session.DomainName + "''" + session.UserName;
NTAccount account = session.UserAccount;

将初始setup.exe作为一个小的可执行文件运行,该文件在将实际安装程序作为子进程调用时显示启动屏幕。小EXE不以admin身份运行,可以将登录的用户名传递给子进程。子进程调用UAC并在管理上下文中运行,但已经将登录的用户名作为命令行参数。

如果您的应用程序以Administrator身份运行,则无法检索原始用户:

如果用户通过右键单击其EXE文件并选择"以管理员身份运行",那么不幸的是,这个标志将没有,因为安装程序没有机会运行任何代码原始用户凭据。如果安装程序是从一个已经提升的过程。但是请注意,这不是一个InnoSetup-specific限制;基于Windows安装程序的安装程序不能在这种情况下,返回到原始用户凭据。

来源:InnoSetup Help

正如Matthew在注释中所说,您不应该以管理员身份运行应用程序,而应该仅在代码中需要时触发UAC。

通过剥离域返回登录Windows用户的名称:

using System.Security.Principal;  // here is the security namespace you need
...
string userName = WindowsIdentity.GetCurrent().Name.Replace("''", "|");
string[] split = userName.Split(new Char[] { '|' });
lblDebug.Text = (split.Count() > 1) ? split[1] : userName;