Почему ShellExecute не может найти файл? - PullRequest
4 голосов
/ 12 января 2012

как пришедший из мира * 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. Совпадение?

Ответы [ 3 ]

10 голосов
/ 12 января 2012

Вы используете 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.Кроме того, во многих реализациях функций используется отложенная загрузка и произойдет сбой, пока перенаправление отключено.Состояние сбоя начальной операции отложенной загрузки сохраняется, поэтому любое последующее использование функции отложенной загрузки завершится ошибкой даже после повторного включения перенаправления файловой системы.Чтобы избежать этих проблем, отключите перенаправление файловой системы непосредственно перед вызовами определенных функций файлового ввода-вывода (например, CreateFile), которые нельзя перенаправлять, и повторно включите перенаправление файловой системы сразу после этого, используя Wow64RevertWow64FsRedirection* 1025.*.

1 голос
/ 12 января 2012

Используйте ProcessMonitor , чтобы выяснить, к каким файлам обращаются и какая файловая операция завершается неудачно и почему.

0 голосов
/ 12 января 2012

Проверьте настройки среды, например, "ДОРОЖКА". Windows поддерживает отдельную среду для системы и пользователей. Возможно, DLL-файл, необходимый для Java.exe, указан только в одной среде, а когда вы запускаете его через ShellExecute, он использует другую среду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...