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

12

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

我已经按要求添加了清单资源,但当我尝试从IDE调试该应用程序时,它报告:

"无法创建进程。所请求的操作需要提升权限"

...它就无法运行。如果我以管理员身份运行Delphi,那么我的应用程序就可以正确运行,但这感觉像是一种危险的强制方法,特别是大多数我开发的应用程序都不需要管理员权限。

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


6
当你需要为某个应用程序工作时,以管理员身份启动IDE,而在处理其他应用程序时则以普通用户身份启动,这有何不妥?这就是我所做的! - Cosmin Prund
@Cosmin,谢谢。看起来这可能是最好的方法。 - Roddy
1
这是正常的行为,调试器无法调试提升的被调试程序,因此在启动调试会话之前必须提升权限。 - Premature Optimization
5个回答

15

UAC还会识别所有名称中包含“setup”,“update”或“install”单词的应用程序,以及公司名称、应用程序名称、描述等版本资源字段。它认为任何此类应用程序都是潜在的“安装程序”,因此必须使用管理员权限运行。

听起来有些疯狂,但这是真的。请参见此文档中的“安装程序检测”部分。

您可以通过包含一个声明不需要管理员权限的清单文件来规避此问题。


2
欢迎来到StackOverflow,@Phil。你真的读了这个问题吗?你的回答似乎与被问的内容无关。 - jachguate
我明白你的意思。由于有人提出UAC的问题,我在添加相关信息。但这实际上并没有回答问题。抱歉。 - Phil Rogers
不要道歉,这是一个很好的答案,但它与问题有很大的不同。SO 的理念是针对具体问题提供具体答案,因此积累“相关内容”并不是真正的目标,而且我们有谷歌可以做到这一点 ;) - jachguate
这太蠢了。我遇到了同样的问题,突然间需要提升权限。将名称从Updater.exe更改为Yoo.exe,它就可以正常启动了。:P - Max Kielland
虽然没有回答问题,但是这个答案与主题相邻,我发现它作为附加信息非常有用,因为我在花费1小时尝试找出为什么我的应用程序需要提升权限,尽管它没有做任何特殊的事情并且没有配置提升权限时,我不知道这个UAC约定。 - Alex Tuduran

10

没有办法,在VS中也不能工作:

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

我想你可以运行远程调试后,使用远程调试来附加IDE。

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

IDE 尝试使用 CreateProcess 运行调试进程,但当应用程序需要权限提升时,这会失败。更多细节可以在此文章中找到:

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 Heffernan
1
@David:我说调试应用程序可以通过IDE提升,但是IDE仍然无法附加到应用程序。我编辑了相应的句子以澄清。 - Jens Mühlenhoff
2
你的答案可以概括为“只有使用高级调试器才能调试高级进程”吗?是这样吗? - David Heffernan
@David:没错。我已经把你的陈述加入到答案中了。 - Jens Mühlenhoff

6
我知道的唯一调试这种应用程序的方法是以管理员身份运行IDE。我不建议经常这样做,只需在调试会话期间进行即可。

如果可行的话,您应该将应用程序拆分为两个独立的部分:一个作为普通的“AsInvoker”进程运行,另一个需要提升权限。然后,您应该在启动其他进程的按钮上添加“UAC盾牌”,这是实现UAC的方法。然后,您只需要提升IDE以调试“RequireAdministrator”进程即可。 - Jens Mühlenhoff

2

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

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


1

实际上,可能可以从具有“普通级别访问权限”的进程中使用“更高级别访问权限”来调试进程。

至少在Windows XP之前,只需将您的用户帐户添加到Debugger Users组即可调试以例如管理员特权运行的进程。

这并不能解决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


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