从UAC开始获取当前用户名

时间:2011-07-13 15:24:50

标签: c# .net wmi username

我们的设置有一个嵌入式清单,可在应用程序启动之前触发UAC。 (应用程序以管理员用户身份运行)。但是,如果安装程序需要安装.NET Framework,我们必须在重新启动后继续安装。因此,我们必须在当前用户的RunOnce中创建一个注册表项。

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

我已经尝试了所有常用的方法(Environment.UserName,WindowsIdentity.GetCurrent())

谢谢!

4 个答案:

答案 0 :(得分:1)

您可以使用LsaEnumerateLogonSessions功能来检索您需要的内容。但是,它是一个winapi C函数调用。如果您需要托管版本,我相信您可以查看source code for Cassia,它在其终端服务API中使用此功能。通话应该是一样的。您还可以查看here

您也可以使用NetWkstaUserEnum WINAPI功能。您可以找到它的托管包装here

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

ITerminalServicesManager manager = new TerminalServicesManager();
ITerminalServicesSession session = manager.CurrentSession;

string userInfo = session.DomainName + "\\" + session.UserName;
NTAccount account = session.UserAccount;

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  

如果用户通过右键单击其EXE文件并选择来启动安装程序   “以管理员身份运行”,不幸的是,这个标志将没有   效果,因为安装程序没有机会运行任何代码   原始用户凭据。如果从中启动安装程序,情况也是如此   一个已经升级的过程。但请注意,这不是Inno   特定于设置的限制;基于Windows Installer的安装程序不能   在这种情况下,请返回原始用户凭据。

来源:InnoSetup Help

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

答案 3 :(得分:0)

通过删除域名返回登录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;