如何使用清单为 Windows 10 设置管理员权限?

How to set adminstrator privilege using manifest for Windows 10?

我正在 Delphi XE 上为 Windows 10 开发软件,我必须 运行 我的软件在 10 上具有管理员权限。如果我右键单击 exe 文件并 运行 作为管理员,它不会引发任何错误,但如果我 运行 它以任何其他方式出现,程序会引发错误消息 Access Denied。因此,它需要具有管理员身份。最初我认为您可以使用任务调度程序来完成此操作,但它也有问题。现在,我正在学习我需要有自定义清单才能在 Windows 10 上执行此操作。因此,在浏览了一些 stackoveflow 问题、博客和在线网站之后,我为我的程序创建了一个清单,如下所示,但是当我 运行 我的程序引发了 Access Denied 错误消息。

这是我所做的:

使用记事本创建清单文件 (GeoMonitor.manifest):

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestversion="1.0">
<assemblyIdentity version="1.1.1.1">
processorArchitecture="*"
name="GeoMonitor"
type="win32" />
<description>elevate execution level</description>
<dependency>
<dependentAssembly>
<assemblyIdentity>
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<trustinfo xmlns="urn:schemas-microsoft-com:asm.v2"><security>
<requestedPrivileges>
<requestedExecutionlevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustinfo>
</assembly>

使用 NOTEPAD

创建了 RC 文件 GeoMonitor.rc
1 24 GeoMonitor.manifest

在我取消选中项目选项中的选项 Enable Run Time Theme 后,将这两个文件链接到我的项目文件。

最后我毫无问题地编译了我的项目文件,然后在 Windows 10 上测试了编译后的 exe 文件。它仍然是 运行ning 作为用户而不是管理员。我做错了什么?

更新: 我必须在我的项目选项 - 资源编译器部分中设置什么吗?

我认为你有两个问题:

  1. 您未能将 .rc 资源脚本文件编译为具有 .res 扩展名的已编译资源,并且 link 正在编译它。您不应该 link .rc 文件或 .xml 文件。您需要 link 已编译的 .res 文件。使用 brcc32 或 rc.
  2. 编译资源脚本
  3. 我可以看出您没有 linking .res 文件,因为您的清单无效。如果您已经编译并 link 编辑了它,加载程序会由于清单无效而拒绝您的可执行文件。

这是您需要的最低清单:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

显然您会想要添加更多,但从这里开始,使用一个众所周知的好清单文件。证明它如你所愿地工作。然后添加更多功能。

最后要说明的一点是,我怀疑您一直有禁用 UAC 的习惯。这是一个非常糟糕的主意,对于开发人员来说更是如此。如果您在过去 10 年中一直启用 UAC,那么您早就会遇到所有 UAC/standard 用户问题。

function CreateRunAsAdmin(const AppNamePath: string): boolean; //AppNamePath=CreateRunAsAdmin(Application.ExeName);
var
   RegisterTemp: TRegistry;
   openResult: Boolean;
begin
   RegisterTemp := TRegistry.Create;
   with RegisterTemp do
   begin
      RootKey := HKEY_CURRENT_USER;
      //openResult:=OpenKey('\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers', True);
      OpenKey('\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers', True);
      WriteString(AppNamePath, 'RUNASADMIN');
      Result := True;
      Free;
   end;
end;