在Delphi中开发具有管理员权限的应用程序

在Delphi中开发具有管理员权限的应用程序,delphi,windows-7,delphi-2010,uac,elevation,Delphi,Windows 7,Delphi 2010,Uac,Elevation,我正在Windows7下使用D2010编写一个似乎需要管理员权限的应用程序(我想是因为它使用COM与第三方.exe通信,后者也需要管理员权限) 我已经根据需要添加了清单资源,但是当我尝试从IDE调试应用程序时,它会报告 “无法创建进程。进程 请求的操作需要 标高” …而且它不会运行。如果我以管理员身份运行Delphi,那么我的应用程序运行正常,但这感觉像是一种危险的暴力方法,特别是因为我开发的大多数应用程序不需要管理员权限 有没有办法让Delphi在我运行我的应用程序时提示提升,而不是让整个ID

我正在Windows7下使用D2010编写一个似乎需要管理员权限的应用程序(我想是因为它使用COM与第三方.exe通信,后者也需要管理员权限)

我已经根据需要添加了清单资源,但是当我尝试从IDE调试应用程序时,它会报告

“无法创建进程。进程 请求的操作需要 标高”

…而且它不会运行。如果我以管理员身份运行Delphi,那么我的应用程序运行正常,但这感觉像是一种危险的暴力方法,特别是因为我开发的大多数应用程序不需要管理员权限


有没有办法让Delphi在我运行我的应用程序时提示提升,而不是让整个IDE运行提升?

没有,它也不适用于VS:

我想您可以运行远程调试器并使用远程调试连接IDE

它不起作用,因为进程正在作为另一个用户(或使用另一个用户令牌)运行

IDE正在尝试使用CreateProcess运行调试过程,但在应用程序需要elavation时失败,更多详细信息可在本文中找到:

radstudio可以使用带有“runas”动词的ShellExecute运行应用程序,但这仍然不能解决“在其他用户上下文下调试进程”的问题

换句话说:提升的进程只能由elavated调试器进行调试

编辑:

Delphi XE2 IDE是32位的,只能通过远程调试器调试64位应用程序(这对用户来说是巧妙隐藏的)


我想Embarcadero也可以以类似的方式调试升级的应用程序。

我知道调试此类应用程序的唯一方法是以管理员身份运行IDE。我不建议只为调试会话而定期执行此操作。

实际上,可以从具有“正常级别访问”的进程调试具有“更高级别访问”的进程

至少在Windows XP之前,将您的用户帐户添加到
调试器用户
组就足以调试正在运行的进程,例如使用
管理员
权限

这根本不能解决Delphi 2010s运行进程的问题,但如果您尝试将调试器附加到已经运行的进程,则可能会很有用

我认为这在支持UAC的Vista+上不起作用,但我想我还是要提到它。:)

确切地说,UAC拆分令牌概念禁用了
SeDebugPrivilege


UAC还捕获任何名称或许多版本资源字段中有“安装”、“更新”或“安装”字样的应用程序。(公司名称、应用程序名称、说明等)。 它认为任何此类应用程序都是潜在的“安装程序”应用程序,因此必须以管理员权限运行

听起来很疯狂,但这是真的。请参阅本文中的“安装程序检测”部分

您可以通过包含一个声明它不需要管理员权限的清单来解决这个问题。

以管理员身份运行Delphi(任何版本)


您还可以更改Delphi快捷方式属性(以管理员身份运行).

当您需要为该应用程序工作时,以管理员身份启动IDE,当您为其他应用程序工作时,以普通用户身份启动IDE,有什么不对?我就是这么做的!@Cosmin,谢谢。似乎这可能是最好的方法。这是正常行为,调试器无法调试提升的调试对象,∴ 必须在启动调试会话之前进行升级。我不明白这个答案。在我读到的时候,你说即使IDE运行升级,它也无法调试具有所需管理员清单的进程。我理解正确吗?我认为我不能正确理解你,因为那句话是错误的。@David:我说的不是调试应用程序可以由IDE提升,但IDE仍然无法连接到应用程序。我编辑了相应的句子以澄清。因此,您的答案可以归结为“提升的进程只能由提升的调试器进行调试”?对吗?@David:没错。我已经在答案中添加了你的陈述。如果可行,你还应该将应用程序分为两个独立的部分:一个作为正常的“AsInvoker”进程运行,另一个需要提升。然后你应该添加“UAC屏蔽”对于启动另一个进程的按钮,这就是UAC的实现方式。然后,您只需提升IDE以调试“RequireAdministrator”过程。欢迎来到StackOverflow,@Phil。你真的读过这个问题吗?你的答案看起来与被问的问题无关。我明白你的意思。我在添加关于UAC的相关信息,因为有人提出了这个问题。它实际上没有回答这个问题。道歉。不要道歉,这是一个很好的答案,用于一个非常不同的任务所以这个想法就是要对特定的问题有具体的答案,所以积累“相关的东西”并不是我们的目标,我们有谷歌来做;)这太愚蠢了。我也有同样的问题,突然它开始需要提升。将名称从Updater.exe更改为Yoo.exe,启动时没有任何问题:P