我正在使用
ShellExecute()
动词运行 "runas"
,以便启动需要重新启动计算机权限的进程。
想象一个场景,有两个管理员帐户 - 一个具有关闭组策略启用,另一个具有禁用。
当主进程被无权执行重启的管理员帐户提升启动时,
ShellExecute("runas")
将不会显示UAC提示,因为主进程已经在提升运行。这最终导致用户没有机会输入具有重新启动权限的帐户的凭据,因此重新启动不成功。
我想解决这个问题的一个非常不优雅的方法是创建一个全新的非提升进程,其唯一目的是运行
ShellExecute("runas")
来显示UAC提示。然而,根据 UAC 上的这篇 2008 年博客文章,“从提升的进程启动一个未提升的进程”并不是特别容易。
有什么想法吗?
使用 CredUIPromptForWindowsCredentialsW() 和 CredUnPackAuthenticationBufferW() 似乎可以解决问题。您可以在这个SO问题中找到这个实现。
但是,将
CredUIPromptForWindowsCredentialsW()
与 CREDUIWIN_SECURE_PROMPT
标志一起使用最终会导致密码和域成为随机字符串,可能是因为它们已加密。尝试将 CredUnPackAuthenticationBufferW()
与 CRED_PACK_PROTECTED_CREDENTIALS
标志一起使用会导致函数失败。
由于这超出了这个问题的范围,我将在另一个问题中探讨这个问题。