无法在需要 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"
实际映射到哪里,你最终 运行 都是正确的到.
我有以下 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"
实际映射到哪里,你最终 运行 都是正确的到.