Delphi 7 Vista/Windows 7清单文件

16

请问有没有Delphi 7的清单文件示例,可以让应用程序在Windows XP / Vista / 7上以管理员身份运行?

使用此功能运行应用程序通常会导致一个用户帐户控制 (UAC) 对话框,要求特权权限。


4
根据Cosmin和Sigurdur的建议,使用“highestAvailable”选项启动程序时,如果用户不是管理员,则程序将以非管理员权限启动。如果您的应用程序只有在以管理员权限运行时才能执行有用的工作,则应改用“requireAdministrator”。如果用户是管理员,则会显示UAC批准提升对话框。如果用户是标准用户,则会显示UAC“肩头超越”提升对话框。 - David Heffernan
另外,你提到了XP,但我不认为你能够解决管理员权限问题。在XP上,如果你想让一个标准用户以管理员身份运行应用程序,那么我认为你需要使用“RunAs”。 - David Heffernan
请参阅我之前回答类似问题的答案 - shunty
您可以在**这篇**文章中找到自动化解决方案。 - avra
4个回答

24
这里是步骤:
1. 删除XPMan:在项目中删除任何关于XPMan组件的引用。XPMan会向可执行文件添加一个默认清单,这会阻止Windows看到我们自定义的清单。你不需要担心由XPMan提供的XP主题,主题支持在以下清单中得以保留。
2. 创建自定义清单:在项目目录中创建一个类似于Win7UAC.manifest的文件(实际文件名并不重要)。将以下行添加到Win7UAC.manifest中:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" name="App" version="3.1.0.0" processorArchitecture="*"/>
  <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.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!--The ID below indicates application support for Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
      <!--The ID below indicates application support for Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
    </application>
  </compatibility>
</assembly>

您可以添加更多项目到此清单中。您也可以删除Microsoft.Windows.Common-Controls部分以禁用主题支持。

3. 将清单编译为资源:在项目目录中创建一个名为Win7UAC.rc的文件,其中包含一行:

1 24 "Win7UAC.manifest"

为了编译这个文件,打开命令提示符(cmd),指向项目目录并运行以下命令:

brcc32.exe Win7UAC.rc

4. 将资源(清单)添加到项目中:只需在项目的任何一个单元文件中的任意位置添加以下行:

{$R 'Win7UAC.res'}

在项目主文件中(通常命名为Project1.dpr)和{$R *.res} 行之后,添加这一行是一个合适的地方。

5. 重新编译项目

6. 记住,每当你向任何项目单元添加XPMan组件时,该UAC清单将无法正常工作。


2
我会为大家节省搜索时间...<!--以下ID表示应用程序支持Windows 8--> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> {4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38} 适用于Windows 8:在应用程序清单中设置此值的应用程序将获得Windows 8的行为。 - Rebelss
在遵循了所有这些指示之后,当我尝试编译我的项目时,出现了以下错误,请问有什么想法吗? “[DCC Error] E2161 Warning: Duplicate resource: Type 24 (user-defined), ID 1; File myproject.res resource kept; file Win7UAC.res resource discarded.” - delphirules
@delphirules:我已经有一段时间没有尝试过这个了。你确定你已经准确地完成了所有步骤吗?如果你还遇到任何问题,请告诉我。我可以启动一个Win7 VMWare并尝试一下。 - Isaac
@Isaac,我可以通过在项目选项中取消使用主题选项来解决这个错误。看起来清单已经这样做了,谢谢! - delphirules

6

以下是一些有用的链接

Vista用户界面清单

Delphi与Windows Vista用户账户控制

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="x86" />
    </dependentAssembly>
  </dependency>

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="highestAvailable"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

你可以通过添加一个rc文件并包含以下内容来实现: 1 24 "ExecutionLevelHighestAvailable.manifest" - Sigurdur
请记得从项目的所有单元中删除对 XPMan 的使用。 - Isaac
另外,将 processorArchitecture 的值从 "x86" 更改为 "*" 以支持 64 位平台。 - PatrickvL

2
这对我来说很好用:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          publicKeyToken="6595b64144ccf1df"
          language="*"
          processorArchitecture="x86"
        />
    </dependentAssembly>
  </dependency>

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="highestAvailable" />
      </requestedPrivileges>
    </security>

</assembly>

2
使用Delphi XE,我必须在“项目”->“选项”->“应用程序”选项卡中取消选中“启用运行时主题”,才能使其正常工作。
编辑:抱歉,启用此选项似乎也可以正常工作。

在我的情况下,使用 Embarcadero C++ Builder XE,我确实需要取消勾选该选项才能正常工作。 - ruhalde

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