2015-06-22 192 views
0

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

这是我做过什么:

创建的清单文件(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> 

创建RC文件GeoMonitor.rc使用记事本

1 24 GeoMonitor.manifest 

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

enter image description here

最后,我遵守我的项目文件没有问题,然后测试编译过的EXE文件在Windows 10,它仍在运行作为用户不是管理员。我究竟做错了什么?

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

enter image description here

+0

你是如何“链接这两个文件”?你看过[这个问题的第二个答案](http://stackoverflow.com/a/6227554/62576),包括评论? –

+0

@KenWhite我实际上是通过右键单击项目名称并在弹出菜单中单击添加选项将这些文件添加到我的程序项目文件中。另外,我注意到RC文件被链接到我的DPR文件,就像'{。$ R'GeoMonitor.res''GeoMonitor.rc'}''我在网上阅读,你不需要分别编译RC文件,Delphi编译器会为你做到这一点。 – ThN

+0

随着那里的点('{。$ R}'),这是一个无所事事的声明(实际上是一个评论)。为了使它实际上成为编译器指令,您需要移除'.'以离开'{$ R'GeoMonitor.res''GeoMonitor.rc'}'。这将解释为什么它不起作用 - 清单从未包含在内。 –

回答

5

我认为你有两个问题:

  1. 您没有到.RC资源脚本文件编译成与.RES扩展编译资源,以及连接这一点。您不应链接.rc文件或.xml文件。您需要链接编译后的.res文件。使用brcc32或rc编译资源脚本。
  2. 我可以告诉你没有链接.res文件,因为你的清单是无效的。如果您编译并链接了该文件,则加载器将因无效清单而拒绝您的可执行文件。

这里有您需要的最低清单:

<?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 /标准用户问题。

+0

没有争论,只是记忆失败和好奇:没有德尔福过去包括InstallShield或类似的裁减版本? – MartynA

+0

@MartynA我不明白这与问题或此答案有何关系。但我记得有些古老的德尔福中有些减少了IS。 –

+0

我的意思是说,正在进行的专业安装程序及其文档的包含可能会鼓励Delphi开发人员与UAC等人握手,而不是让他们绊倒它或试图绕过它。 – MartynA

-1
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;