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

Posted

技术标签:

【中文标题】在 Delphi 中开发具有管理员权限的应用程序【英文标题】:Developing Apps with Administrator Rights in Delphi 【发布时间】:2011-08-31 18:36:19 【问题描述】:

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

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

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

...它不会运行。如果我以管理员身份运行 Delphi,那么我的应用程序可以正常运行,但这感觉像是一种危险的蛮力方法,尤其是当我开发的大多数应用程序不需要管理员权限时。

有什么方法可以让 Delphi 在我运行我的应用程序时提示提升,而不是让整个 IDE 运行提升?

【问题讨论】:

当您需要为 that 应用程序工作时以管理员身份启动 IDE 并在处理其他应用程序时以普通用户身份启动它有什么问题?我就是这么做的! @Cosmin,谢谢。似乎这可能是最好的方法。 这是正常行为,调试器无法调试提升的被调试对象,∴必须在启动调试会话之前提升。 【参考方案1】:

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

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

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

【讨论】:

欢迎来到 ***,@Phil。你真的读过这个问题吗?您的答案看起来与所问的内容无关。 我明白你的意思。我正在添加有关 UAC 的相关信息,因为有人提出了该主题。它实际上并没有回答这个问题。道歉。 不要道歉,这是一个很好的答案,对于一个非常不同的问题。所以想法是对特定问题有特定的答案,所以积累“相关的东西”并不是这里的真正目标,无论如何我们都有谷歌这样做;) 这简直太愚蠢了。我遇到了同样的问题,只是突然开始需要抬高。将名称从 Updater.exe 更改为 Yoo.exe,它开始没有任何问题。 :P【参考方案2】:

没有,它也不适用于VS:

https://***.com/questions/3265787/how-do-i-debug-an-process-as-elevated-with-visual-studio-2008-sp1-on-windows-7

我想您可以运行提升的远程调试器并使用远程调试附加 IDE。

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

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

http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx

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

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

编辑:

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

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

【讨论】:

我不明白这个答案。当我读到它时,您说即使 IDE 运行提升,它也无法使用 requiredAdministrator 清单调试进程。我对你的理解正确吗?我认为我不能正确理解您,因为该陈述是错误的。 @David:我说过调试应用程序 可以由 IDE 提升,但是 IDE 仍然无法附加到应用程序。我编辑了相应的句子以澄清。 所以你的答案可以归结为“提升的进程只能由提升的调试器调试”?对吗? @David:没错。我已将您的陈述添加到答案中。【参考方案3】:

我知道调试此类应用程序的唯一方法是以管理员身份运行 IDE。我不建议例行执行此操作,仅用于调试会话。

【讨论】:

如果可行,您还应该将应用程序拆分为两个独立的部分:一个作为正常的“AsInvoker”进程运行,另一个需要提升。然后,您应该将“UAC 屏蔽”添加到启动其他进程的按钮中,这就是 UAC 的实现方式。然后,您只需提升 IDE 即可调试“RequireAdministrator”进程。【参考方案4】:

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

至少在 Windows XP 之前,将您的用户帐户添加到 Debugger Users 组就足以调试正在运行的进程,例如具有Administrator 权限。

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

我认为这不适用于启用 UAC 的 Vista+,但我想我还是会提到它。 :)

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

http://blogs.msdn.com/b/greggm/archive/2006/03/30/565303.aspx

http://blogs.msdn.com/b/mithuns/archive/2006/04/04/568291.aspx

【讨论】:

【参考方案5】:

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

您也可以更改 Delphi 快捷方式属性(始终以管理员身份运行)。

【讨论】:

以上是关于在 Delphi 中开发具有管理员权限的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

delphi+access权限管理设置

delphi中运行程序主菜单不显示

运行具有嵌套 var 访问权限的 Delphi 程序后 Excel.exe 仍处于加载状态

让Delphi XE2程序支持UAC

Delphi编写的程序在Win7以上提升权限(以管理员身份运行)

Delphi编写的程序在Win7以上提升权限(以管理员身份运行)