Dav*_*ric 4 c c++ windows winapi
从*nix世界来看,我对Windows行为和可能的安全系统非常困惑.
我只是想在我的应用程序中执行外部程序.我发现WinAPI函数ShellExecute按预期工作,除非启动%windir%\ System32子目录中的某些程序.
执行ping.exe成功
ShellExecute(NULL, "open", "c:\\Windows\\System32\\ping.exe', NULL, NULL, SW_SHOW) );
// ^^^ OK, retcode == 42
Run Code Online (Sandbox Code Playgroud)执行java.exe失败
ShellExecute(NULL, "open", "c:\\Windows\\System32\\java.exe', NULL, NULL, SW_SHOW) );
// ^^^ ERROR_FILE_NOT_FOUND, retcode == 2
Run Code Online (Sandbox Code Playgroud)这很奇怪,因为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\System32
到C:\Windows\SysWOW64
.
因此,如果您正在使用32位进程来查看C:\Windows\System32
,那么您实际上看到的是什么C:\Windows\SysWOW64
.
您可以调用该Wow64DisableWow64FsRedirection
函数来禁用此行为.请注意文档中的警告,并仔细考虑它是否适用于您的情况:
注意: 该
Wow64DisableWow64FsRedirection
函数会影响当前线程执行的所有文件操作,如果在任何时间长度内禁用文件系统重定向,则可能会产生意外后果.例如,DLL加载取决于文件系统重定向,因此禁用文件系统重定向将导致DLL加载失败.此外,许多功能实现使用延迟加载,并且在禁用重定向时将失败.初始延迟加载操作的失败状态是持久的,因此即使在重新启用文件系统重定向之后,延迟加载功能的任何后续使用也将失败.要避免这些问题,请在调用不能重定向的特定文件I/O功能(例如CreateFile
)之前立即禁用文件系统重定向,然后立即重新启用文件系统重定向Wow64RevertWow64FsRedirection
.