【问题标题】:Unable to use the "runas" verb on programs requiring UAC无法在需要 UAC 的程序上使用“runas”动词
【发布时间】:2020-08-09 18:52:38
【问题描述】:

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

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

(请注意,ShellExecute 的输出为 2)。 但是,当我尝试使用这些行执行“changepk.exe”时,根本没有任何反应,但是对于“notepad.exe”而不是“changepk.exe”它可以工作并给我一个 UAC 提示。这可能是什么问题以及解决它的潜在方法是什么?

【问题讨论】:

  • ShellExecute()的返回值是多少?您是否尝试过ShellExecuteEx()(哪个更好地报告错误)?如果您将输入参数传递给changepk 以实际执行操作,您是否有同样的问题?如果你通过cmd.exe /C执行changepk,你有同样的问题吗?
  • @RemyLebeau 感谢您的建议。第一个选项不起作用,尝试了 /ProductKey 参数。 cmd.exe /C 开关也不起作用。

标签: c++ c runas


【解决方案1】:

错误 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 位版本的 NotePad,因此无论"C:\\Windows\\System32\\notepad.exe" 实际映射到何处,您最终都会运行正确的版本。

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多