1

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

4

3 回答 3

3

以管理权限执行不是文件权限。

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

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

于 2010-04-29T12:28:43.700 回答
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

于 2010-04-29T17:32:01.567 回答
2

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

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

于 2010-04-29T12:47:41.843 回答