使用.NET代码从用户组访问Program Files文件夹

时间:2016-01-29 09:37:51

标签: c#

我在互联网上搜索了这个,但找不到确切的答案。 在我的应用程序中,我有一个功能,可以将文件夹中的文件(比如pqr)复制到用户想要的位置。源文件夹的位置是已安装应用程序的位置(例如c:\ Program Files \ abc \ pqr)。 当用户使用'administrator rights'登录计算机时,用户可以使用此功能。但是当用户使用'用户权限'(非管理员用户)登录到计算机时,此功能会抛出访问c:\ Program Files \ abc \ pqr文件夹的异常被拒绝。 我试图通过使用以下属性来提升用户权限来复制方法:

[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]

我还尝试使用以下更改添加清单文件:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

但是没有一种方法有效。

然后我在D盘上安装了我的应用程序。之后,当我尝试使用非管理员用户时,功能按预期工作 因此,当应用程序安装在 C:\ Program Files 中时,功能对非管理员用户无效。但在将应用程序安装到其他位置后,它对非管理员用户起作用。

所以我的问题是,是否有可能在应用程序中以编程方式向非管理员用户提供 C:\ Program Files 的权利,或者我们需要管理员用户才能使用此功能?< / p>

2 个答案:

答案 0 :(得分:1)

  1. 更改清单是提升权限的最简单方法。在VS中更改它但是,要求常规软件具有管理员权限是不好的做法。

  2. 您可以在安装期间为所有用户提供程序文件夹。例如,可以使用Permissions: users-modify组中[Files]的InnoSetup制作。

  3. 如果源文件位于Program Files并且您在另一个位置复制,则打开源文件时问题可能是文件访问错误。仅供阅读。

答案 1 :(得分:1)

var startInfo = new ProcessStartInfo("yourApplication.exe") { Verb = "runas" };
Process.Start(startInfo);
Environment.Exit(0);

application.exit();

如果您使用的是winforms

但要小心一次执行此代码,因为如果你把它放在load事件中你会在内存中溢出