在C#中设置文件的UAC设置

我想给一个文件(已经存在于客户端计算机上.exe)权限,以便始终使用管理权限执行。

请注意,我想要授予权限的文件已经在目标计算机上。 我想通过用c#编写的另一个程序来更改该文件的权限,并且它具有执行所有操作的管理权限。

请让我知道如何使用此代码

System.Security.AccessControl.FileSecurity fs = File.GetAccessControl(@"c:\inam.exe"); FileSystemAccessRule fsar = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow); fs.AddAccessRule(fsar); File.SetAccessControl(@"c:\inam.exe", fs); 

此代码将正确更改权限但仍然在执行此代码后执行inam.exe时UAC未出现,并且inam.exe也无法执行管理操作。

实际上我已经在10,000多个客户端上部署了一个应用程序,因此想要发布一个补丁来解决管理权限问题。

构建一个清单文件(参见http://www.gregcons.com/KateBlog/AddingAManifestToAVistaApplication.aspx和其他地方)并将其命名为Whatever.exe.manifest并将其放在与exe相同的文件夹中。 nanifest应将requestedExecutionLevel设置为requireAdministrator。 搞定。

如果您拥有其他exe,则可以在构建时嵌入清单。 这在Visual Studio 2008及更高版本中几乎是微不足道的。 请参阅“应用程序”选项卡,然后下载“清单”下拉列表。 附近有说明。 此外,当您使用VS 2008向项目添加清单时,您不必键入所有XML,只需从为您生成的注释中复制相应的请求执行级别。

使用管理权限执行不是文件权限。

这通常通过添加清单文件 (在EXE中的Win32资源或作为外部清单)来配置。 此清单文件可以说明应用程序是否需要运行提升。

我不完全确定Windows在哪里存储“以管理员身份运行此程序”兼容性设置。

使用清单文件是最好的方法,但另一种方法是通过设置一个简单的注册表项,以编程方式设置“以管理员身份运行此程序”标志(在EXE属性的“兼容性”选项卡中找到的选项)。 您需要在其中一个键下创建一个字符串值(REG_SZ)(如果您希望设置分别为每个用户或每台计算机):

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers

要么

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers

值的名称必须是可执行文件的完整路径(如果路径包含空格,不要用引号括起路径),并且值的数据必须包含字符串RUNASADMIN

Interesting Posts