2009-12-21 22 views
11

我需要获取运行安装程序的用户的用户名以进行我的自定义安装操作。由于安装程序获得特殊的权限,Environment.UserName只提供“SYSTEM”。如何在Windows安装程序的自定义操作中获取当前用户名称?

Environment.SpecialFolders.ApplicationData返回当前用户的appdata文件夹,但我无法可靠地挖掘出它的用户名。

更多具体情况:

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

+0

你能提供更多的信息吗?你在使用安装项目吗?基于WiX的建筑?你可以添加你安排自定义动作的位置(顺序,位置)吗?它延迟运行吗?即时? – 2009-12-21 17:19:00

+0

我已经为这个问题添加了更多的细节。我没有碰过WiX。很确定它是直接的。 – Septih 2009-12-22 08:52:54

回答

3

基本上,你不能。

UAC in MSI Notes: Credential Prompt and Permissions介绍了一些,这是更详细,但有效一旦你提高你的凭据从视安装点上当前登录的用户系统(可以登录多个人,并在运行的应用程序机器,所以你必须从过程本身的角度思考,而不是坐在物理机器前面的人)。

2

使用WindowsIdentity.GetCurrent()。System.Security.Principal命名空间中的名称。这将包括域部分,所以如果你不需要在它的末尾添加一个分割。 WindowsIdentity.GetCurrent()。Name.Split( '')[1]。

using System.Security.Principal; 

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

还有其他答案也暗示了这一点,但似乎已被删除。 这不会返回用户在Vista中的名称,它仍然返回SYSTEM – Septih 2009-12-22 11:49:10

+0

看看这篇文章。 http://stackoverflow.com/questions/400872/c-active-directory-check-username-password。它更多的是验证,但它可能是有用的。 – 2009-12-22 13:05:41

2

首先,确保您已将Impersonate bit设置为OFF。 Here is how

不幸的是,没有办法直接 设置该标志为在Visual Studio IDE安装项目 的UI定制 行动。在Studio 2005中,您可以使用修改后的 步骤,修改MSI以使用此blog post中描述的以前的 策略设置此位 位。

其次,我假设你正在运行Vista,因为人们似乎有这个问题,Vista和有人问上MSDN这个问题,他的解决办法是遵循博客文章链接here

Robert Flaming的博文UAC in MSI Notes: The NoImpersonate Bit Mistake也对这些问题提供了一些见解。

+0

对,我已经关闭了Impersonate位。我看了回答msdn问题的博客,并尝试了解决方案,但似乎没有改变任何东西。我基本上只是从博客复制的清单,并将其保存为setup.exe.manifest – Septih 2009-12-21 16:00:24

+0

对不起,但我没有任何信息atm – 2009-12-22 03:42:22

2

我从来没有碰过VS安装项目(尽管可以使用WiX并可以推荐它)。看看你的问题,似乎你的CA运行延期(并提升特权)。

搜索网为VS安装项目我碰到包含这一段长篇文章1来到(搜索“延期”):

换句话说,Visual Studio的设计限制您自定义操作是在您的文件在系统上时被调用(延迟自定义操作),这意味着您必须使用CustomActionData属性。生成MSI文件的其他工具通常更加灵活,所以如果您预计复杂的设置,请调查这些工具。

1:http://www.simple-talk.com/dotnet/visual-studio/visual-studio-setup---projects-and-custom-actions/

7

你可以从环境变量的一些信息。我正在使用

Environment.GetEnvironmentVariable(“USERNAME”);

获取当前用户名。

+0

这个答案适合我 - 它返回登录用户,而不是从内部提升安装程序用户自定义操作。 – 2014-03-11 16:50:35

+0

我还使用此方法获取域: Environment.GetEnvironmentVariable(“USERDOMAIN”)+“\\”+ Environment.GetEnvironmentVariable(“USERNAME”) – 2014-03-11 17:02:28

相关问题