UAC提示来自已经提升的应用程序

时间:2019-03-15 14:53:49

标签: delphi winapi uac

让我们说一个应用程序已经以提升的特权运行。 此应用程序是否可能显示UAC提示并获得其结果(成功确认或取消)?

背景故事:我有一个需要管理员特权但在受限用户帐户中运行的应用程序,因此在开始时会显示UAC提示,用户输入管理员凭据进行确认,然后一切正常。但是,对于某些关键操作,我想验证当前用户是否(仍然)被允许这样做。

例如,原始用户没有锁定Windows帐户就离开了工作站(是的,这还算不完美...),而另一个用户打开了已经运行的应用程序并访问了一些敏感设置。 您可以将其与在线商店进行比较,在该商店中,已经登录的用户如果想更改其送货地址,则必须再次提供其凭据。

我知道我可以创建一个自定义提示,询问管理员帐户凭据并检查它们是否有效,但是我根本不想触摸这些凭据。我也不想引入其他特定于应用程序的凭据。 UAC提示将是一个很好的本地解决方案,可以重新验证用户是否具有管理员权限。

基本上是这样的:

if VerifyAdminWithUacPrompt then
begin
  //critical stuff
end;

一个Delphi示例将是完美的,但我也对如何实现这一点的一般想法感到高兴。

1 个答案:

答案 0 :(得分:2)

您的应用不需要调用新的UAC提示,因为UAC已经在提升您的应用的状态下运行。该应用程序只需要询问用户凭据即可。 Windows为此目的提供了API:CredUIPromptForCredentials()CredUIPromptForWindowsCredentials()

  

CredUIPromptForCredentials函数创建并显示一个可配置对话框,该对话框接受来自用户的凭据信息。

  

CredUIPromptForWindowsCredentials函数创建并显示一个可配置对话框,允许用户使用本地计算机上安装的任何凭据提供程序来提供凭据信息。

有关更多详细信息,请参见MSDN上的Asking the User for Credentials

  

您的应用程序可能需要提示用户输入用户名和密码信息,以避免存储管理员密码或验证令牌是否具有适当的特权。

     

但是,仅提示输入凭据可能会训练用户将其提供给屏幕上出现的任何随机的,未识别的对话框。建议采取以下步骤来减少这种训练效果。

     

要正确获取用户凭据