как пришедший из мира * nix, я очень запутался в поведении Windows и, возможно, в ее системе безопасности.
Я просто пытаюсь выполнить внешнюю программу в моем приложении. Я обнаружил WinAPI-функцию ShellExecute, которая работает как положено , за исключением случаев запуска некоторых программ, помещенных в подкаталог% windir% \ System32 .
выполнение ping.exe завершено успешно
ShellExecute(NULL, "open", "c:\\Windows\\System32\\ping.exe', NULL, NULL, SW_SHOW) );
// ^^^ OK, retcode == 42
сбой выполнения java.exe
ShellExecute(NULL, "open", "c:\\Windows\\System32\\java.exe', NULL, NULL, SW_SHOW) );
// ^^^ ERROR_FILE_NOT_FOUND, retcode == 2
Это очень странно, потому что java.exe существует в System32 , имеет разрешения на чтение / выполнение для группы пользователей и может быть вызван из 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
Что мне здесь не хватает?
ОС - Windows 7 Home edition.
Обновление: Если я скопирую c: \ Windows \ Sytem32 \ calc.exe в c: \ Windows \ Sytem32 \ calc2.exe, ShellExecute может запустить оригинальный файл calc.exe, но не работает с calc2 .exe, хотя файлы идентичны !! Единственное отличие - это дополнительные разрешения для группы TrustedInstaller, в которой отсутствуют calc2.exe и java.exe. Совпадение?