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

时间:2010-04-29 12:23:21

标签: c# permissions uac patch administrative

我想提供一个文件(已存在于客户端计算机.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多个客户端上部署了一个应用程序,所以想发布一个补丁来解决管理权限问题。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:2)

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

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