使用.NET代码从用户组访问程序文件夹

3

我在互联网上搜索了这个问题,但没有找到确切的答案。 我的应用程序有一个功能,可以将文件夹(比如说pqr)中的文件复制到用户想要的位置。源文件夹的位置是安装应用程序的位置(比如说c:\Program Files\abc\pqr)。 当用户以'管理员权限'登录到机器上时,用户可以使用此功能。但是当用户以'用户权限'(非管理员用户)登录到机器上时,此功能会抛出异常,提示无法访问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的权限,或者我们需要使用管理员用户才能使用此功能?
2个回答

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

  2. 您可以在安装期间使程序文件夹对所有用户可访问。例如,可以使用InnoSetup中的Permissions: users-modify[Files]组中实现。

  3. 如果源文件在Program Files中,并且您将其复制到另一个位置,则打开源文件时可能会出现文件访问错误。仅以只读方式打开。


谢谢回复。那么在这种情况下,给非管理员用户所需的权限可能是正确的方法? - Hrushikesh Pande
@hrushikesh 通过提升权限,您可以快速解决问题。但我认为您以错误的文件访问方式(r/w)打开了开源文件。对于非管理员用户,“Program Files”是只读的,但您可以从那里复制文件。尝试从Windows资源管理器中复制。 - i486
实际上,非管理员用户无法使用高级权限。我尝试以“管理员身份运行”应用程序,但非管理员用户仍然被拒绝复制访问。 - Hrushikesh Pande
很奇怪。查看无法访问的文件的NTFS安全性属性。也许它们只能被“管理员”而不是“管理员组”访问。 - i486

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

or

application.exit();

如果您正在使用WinForms,请注意仅执行此代码一次,因为如果将其放在加载事件中,则会导致内存溢出。

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