为什么ShellExecute找不到文件?

Dav*_*ric 4 c c++ windows winapi

从*nix世界来看,我对Windows行为和可能的安全系统非常困惑.

我只是想在我的应用程序中执行外部程序.我发现WinAPI函数ShellExecute按预期工作,除非启动%windir%\ System32子目录中的某些程序.

这很奇怪,因为java32确实存在于System32中,具有Users组的读/执行权限,可以从cmd调用.

C:\>dir /q c:\Windows\System32\java.exe
 Volume in drive C has no label.
 Volume Serial Number is 56E3-0868

 Directory of c:\Windows\System32

11.01.2012  23:40           172 320 NT AUTHORITY\SYSTEM    java.exe
               1 File(s)        172 320 bytes
               0 Dir(s)  226 127 564 800 bytes free

C:\>cacls c:\Windows\System32\java.exe
c:\Windows\System32\java.exe NT AUTHORITY\SYSTEM:F
                             BUILTIN\Administrators:F
                             BUILTIN\Users:R
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

操作系统是Windows 7 Home Edition.

更新:如果我将c:\ Windows\Sytem32\calc.exe复制到c:\ Windows\Sytem32\calc2.exe,ShellExecute可以运行原始calc.exe但是使用calc2.exe失败,尽管文件是相同的!唯一的区别是TrustedInstaller组的附加权限,其中缺少calc2.exe和java.exe.巧合 ?

Joe*_*oeG 10

你在运行64位操作系统吗?

如果是这样,C:\Windows\System32将包含64位二进制文​​件,同时C:\Windows\SysWOW64包含32位二进制文​​件(是的,它实际上就是这样).出于向后兼容性原因,在运行32位进程时,Windows会将访问重定向C:\Windows\System32C:\Windows\SysWOW64.

因此,如果您正在使用32位进程来查看C:\Windows\System32,那么您实际上看到的是什么C:\Windows\SysWOW64.

您可以调用该Wow64DisableWow64FsRedirection函数来禁用此行为.请注意文档中的警告,并仔细考虑它是否适用于您的情况:

注意:Wow64DisableWow64FsRedirection函数会影响当前线程执行的所有文件操作,如果在任何时间长度内禁用文件系统重定向,则可能会产生意外后果.例如,DLL加载取决于文件系统重定向,因此禁用文件系统重定向将导致DLL加载失败.此外,许多功能实现使用延迟加载,并且在禁用重定向时将失败.初始延迟加载操作的失败状态是持久的,因此即使在重新启用文件系统重定向之后,延迟加载功能的任何后续使用也将失败.要避免这些问题,请在调用不能重定向的特定文件I/O功能(例如CreateFile)之前立即禁用文件系统重定向,然后立即重新启用文件系统重定向Wow64RevertWow64FsRedirection.

  • 是的,这是因为程序员过去的硬编码路径.*提示提示*. (3认同)