无法在需要 UAC 的程序上使用 "runas" 动词

Unable to use the "runas" verb on programs requiring UAC

我有以下 C 代码,应该 运行 默认 Windows 程序 changepk.exe 带有 UAC 提示

ShellExecute(NULL, "runas", "C:\Windows\System32\changepk.exe", 0, 0, SW_SHOWNORMAL);

(注意 ShellExecute 的输出是 2)。 但是,当我尝试使用这些行执行 'changepk.exe' 时,什么也没有发生,但是对于 'notepad.exe' 而不是 'changepk.exe' 它有效并给我一个 UAC 提示。这可能是什么问题?可能的解决方法是什么?

错误 2 是 ERROR_FILE_NOT_FOUND。确保 changepk.exe 在您的机器上确实存在于该路径。

更重要的是,如果您的应用程序是 64 位 Windows 上的 32 位 EXE 运行,那么您可能会在工作中遇到 File System Redirector,它将重定向 "C:\Windows\System32\...""C:\Windows\SysWOW64\..." 对于 32 位进程。

如果是这样,请尝试使用 WOW64 的 sysnative 别名从 32 位应用程序访问 64 位 System32 文件夹,例如:

ShellExecute(NULL, "runas", "C:\Windows\Sysnative\changepk.exe", 0, 0, SW_SHOWNORMAL);

或者,您可以使用 Wow64DisableWow64FsRedirection() 暂时禁用重定向器,例如:

PVOID oldValue;
Wow64DisableWow64FsRedirection(&oldValue);

ShellExecute(NULL, "runas", "C:\Windows\System32\changepk.exe", 0, 0, SW_SHOWNORMAL);

Wow64RevertWow64FsRedirection(oldValue);

NotePad 工作的原因是因为 64 位 Windows 提供了 32 位和 64 位版本的记事本,所以无论 "C:\Windows\System32\notepad.exe" 实际映射到哪里,你最终 运行 都是正确的到.