#php #batch-file #exec #digital-signature #shell-exec
#php #пакетный файл #исполнительный директор #цифровая подпись #shell-exec
Вопрос:
Я использую IIS 6.0 и PHP, и я пытаюсь написать php-скрипт, который автоматизирует процесс для 1) создания установщика и 2) цифровой подписи установщика. Я создал пакетный файл, который выполняет каждый из них по отдельности. Если я перехожу на сервер и вручную запускаю пакетные файлы, оба работают отлично. Если я запускаю их через PHP, создается только установщик, но он никогда не имеет цифровой подписи. Я подтвердил, что:
- Все файлы, на которые ссылаются в пакетных файлах, имеют полные права пользователя IUSR_ [ИМЯ КОМПЬЮТЕРА].
- Это не проблема, поскольку файл еще не полностью создан первым пакетным файлом. Я могу поместить уже созданный Setup.exe файл в папке и запустите только второй пакетный файл через PHP с теми же результатами.
- Командный файл фактически запускается. Я поместил команду 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');
Никаких пакетных файлов не требуется! Было бы так же легко запустить пакетный файл, как и другому пользователю, хотя и с той же методологией.