Не удается выполнить определенную программу через PHP для цифровой подписи файла

#php #batch-file #exec #digital-signature #shell-exec

#php #пакетный файл #исполнительный директор #цифровая подпись #shell-exec

Вопрос:

Я использую IIS 6.0 и PHP, и я пытаюсь написать php-скрипт, который автоматизирует процесс для 1) создания установщика и 2) цифровой подписи установщика. Я создал пакетный файл, который выполняет каждый из них по отдельности. Если я перехожу на сервер и вручную запускаю пакетные файлы, оба работают отлично. Если я запускаю их через PHP, создается только установщик, но он никогда не имеет цифровой подписи. Я подтвердил, что:

  1. Все файлы, на которые ссылаются в пакетных файлах, имеют полные права пользователя IUSR_ [ИМЯ КОМПЬЮТЕРА].
  2. Это не проблема, поскольку файл еще не полностью создан первым пакетным файлом. Я могу поместить уже созданный Setup.exe файл в папке и запустите только второй пакетный файл через PHP с теми же результатами.
  3. Командный файл фактически запускается. Я поместил команду MKDIR в тот же пакетный файл после команды цифровой подписи и создания папки.

Код, который я использую через PHP для запуска пакетных файлов:

 system('cmd /c C:\Inetpub\createInstallers\step1.bat');
 

Командный файл create installer выглядит следующим образом:

 "C:Program FilesInno Setup 5ISCC.exe" C:InetpubcreateInstallerscreateInstaller.iss
 

Я использую Inno Setup, чтобы сделать это, найденное здесь: http://www.jrsoftware.org/isinfo.php

Командный файл цифровой подписи выглядит следующим образом:

 "C:InetpubcreateInstallersDigiCertUtil.exe" sign /noInput "C:InetpubcreateInstallersSetup.exe"
 

Это делается с помощью DigiCertUtil.exe функция командной строки, описанная здесь:

https://www.digicert.com/util/utility-code-signing-command-line.htm

Насколько я могу судить, абсолютно ничего не происходит. Я не верю, что есть какие-либо сообщения об ошибках (но я немного не понимаю, как их проверить). Возвращается значение NULL, если я запускаю команду цифрового знака через shell_exec следующим образом:

     $result = shell_exec('"C:\Inetpub\createInstaller\DigiCertUtil.exe" sign /noInput "C:\Inetpub\createInstaller\Setup.exe"');
    var_dump($result);
 

У кого-нибудь есть идеи, почему это может не работать? Может ли это быть какой-то проблемой с разрешениями или ограничением безопасности?

Комментарии:

1. Если ваш язык требует обратной косой черты в качестве экранирования , то в этой строке она отсутствует system('cmd /c C:Inetpub\createInstallers\step1.bat'); . Большинство языков требуют (потому что Windows требует — но некоторые языки / объекты исправляют это за вас), чтобы пути с пробелами были заключены в кавычки. Итак, первое, что нужно сделать, это запустить вашу команду из командной строки, пока вы не получите работающую командную строку. Во-вторых, проверьте права доступа к папке (почему вы делаете это в inetpub). Когда я в последний раз устанавливал IIS 15 лет назад, я думал, что это название его корневого каталога???

2. @phd443322 Спасибо за опечатки с обратной косой чертой. В моем коде экранирование было правильным, но здесь я ввел его неправильно. Inetpub не является веб-корнем в нашей системе. Вместо этого у нас есть несколько корневых папок для разных веб-приложений в Inetpub. Разрешения для файлов выглядят правильно. Я до сих пор понятия не имею, почему это не работает.

3. Итак, первое, что нужно сделать, это запустить вашу команду из командной строки, пока вы не получите работающую командную строку

4. @phd443322 Я смог это сделать. К сожалению, по какой-то причине это не работает, когда PHP выполняет эту строку. Это работает нормально, если я открываю вручную cmd.exe и запустите его, но не в том случае, если у меня есть PHP, выполняющий команду.

5. Но я хочу увидеть рабочую команду. Затем сведения о безопасности (например icacls c:inetpub , и под какими учетными записями выполняется PHP и под какой учетной записью выполняется введенная команда. Включен или выключен UAC. Измените свою команду на cmd / k и посмотрите, получаете ли вы какие-либо сообщения. Большинство языков возвращают либо исключения, либо возвращаемые значения. Согласно документу PHP, второй необязательный параметр будет содержать возвращаемое значение. Также в PHP есть безопасный режим, который может помешать запуску вашего bat в соответствии с его документами. php.net/manual/en/function.system.php

Ответ №1:

Я нашел проблему подчеркивания и ответ. Проблема заключалась в том, что сертификаты импортируются в личное хранилище пользователя для каждого пользователя, поэтому, когда я попытался запустить программу DigiCertUtil через PHP, она не смогла найти сертификаты, потому что у IUSR не было личного хранилища с сертификатом для использования. IUSR является временным пользователем и, следовательно, не имеет личного хранилища. Возможно, есть способ поместить сертификат в хранилище машины, но я не смог его найти.

Вместо этого я использовал PsExec для локального запуска программы, но с другим пользователем, отличным от учетной записи IUSR, например:

 shell_exec('C:\Inetpub\createInstallers\psexec \\127.0.0.1 -accepteula -u myUser -p myPassword -i cmd.exe /c C:\Inetpub\createInstallers\DigiCertUtil.exe sign /noInput C:\Inetpub\createInstallers\Setup.exe');
 

Никаких пакетных файлов не требуется! Было бы так же легко запустить пакетный файл, как и другому пользователю, хотя и с той же методологией.