如何在Windows Installer自定义动作中获取当前用户的名称?

11

我需要获取运行安装程序的用户的用户名,以便于我的自定义安装操作。因为安装程序具有特殊权限,Environment.UserName 只会返回 "SYSTEM"。

Environment.SpecialFolders.ApplicationData 返回当前用户的应用数据文件夹,但我无法可靠地从中获取用户名。

更多细节:

使用 Visual Studio 2008 安装项目 自定义操作是一个安装程序类,在安装后运行,并且是该项目中唯一的操作。


你能提供更多信息吗?你是否使用了设置项目?是基于WiX构建的吗?你能添加自定义操作计划的位置(序列,位置)吗?它是延迟执行还是立即执行? - Benjamin Podszun
我已经在问题中添加了更多细节。我没有触碰WiX。相当确定它是立即执行的。 - Septih
5个回答

9
你可以从环境变量中获取一些信息。我正在使用
Environment.GetEnvironmentVariable("USERNAME");
来获取当前用户的用户名。

这个答案对我有用——它返回已登录的用户,而不是在自定义操作中提升的安装程序用户。 - John Kroetch
我也是通过这种方式获得域:Environment.GetEnvironmentVariable("USERDOMAIN") + "\" + Environment.GetEnvironmentVariable("USERNAME") - John Kroetch

3
基本上,你做不到这点。 在MSI中的UAC笔记:凭据提示和权限更详细地解释了一些内容,但实际上,一旦提升了凭据,从安装程序的角度来看,当前登录的用户就是系统(您可以有多个人登录并在计算机上运行应用程序,因此您必须从进程本身的上下文来考虑,而不是谁坐在物理机器前面)。

2

使用System.Security.Principal命名空间中的WindowsIdentity.GetCurrent().Name方法。这将包含域部分,如果您不需要它,请在结尾添加一个split。 WindowsIdentity.GetCurrent().Name.Split('')[1]。

using System.Security.Principal;

this.nametext = WindowsIdentity.GetCurrent().Name.Split('')[1];

还有其他答案也建议了这样做,但似乎已被删除。在Vista中,这不会返回用户的名称,它仍然返回SYSTEM。 - Septih
看一下这篇文章。https://dev59.com/I3RC5IYBdhLWcg3wJNcN。它更多的是关于验证,但可能会有用。 - Scott Boettger

2
首先,确保将模拟标记设置为OFF。这里有如何设置
不幸的是,目前在Visual Studio IDE的安装项目UI中没有直接为自定义操作设置此标记的方法。在Visual Studio 2005中,可以使用后构建步骤修改MSI以使用先前在此博客文章中描述的策略来设置此位。
其次,我假设你正在运行Vista,因为人们似乎在Vista上遇到了这个问题,有人在MSDN上提出了这个问题,并且他的解决方案是按照这里链接的博客文章进行操作。
Robert Flaming在UAC in MSI Notes: The NoImpersonate Bit Mistake的博客文章中还提供了一些有关这些问题的见解。

好的,我已经关闭了模拟用户位。我查看了回答msdn问题的博客,并尝试了清单解决方案,但似乎没有改变任何东西。我基本上只是从博客中复制了清单,并将其保存为setup.exe.manifest。 - Septih
抱歉,我目前没有更多的信息。 - user195488

2
我从未接触过VS设置项目(虽然玩过WiX并可以推荐它)。看着你的问题,似乎你的CA是延迟运行的(并且具有提升的特权)。
在搜索VS设置项目时,我发现了一篇冗长的文章1,其中包含这段话(搜索“deferred”):
“换句话说,Visual Studio设计限制您使用在系统上存在文件时调用的自定义操作(延迟自定义操作),这意味着您必须使用CustomActionData属性。其他生成MSI文件的工具通常更加灵活,因此如果您预计设置复杂,请研究这些工具。”
1:http://www.simple-talk.com/dotnet/visual-studio/visual-studio-setup---projects-and-custom-actions/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接