По умолчанию PHP работает под учетной записью IUSR . При выполнении непосредственно:
$lastline = exec('D:\\MyProgram.exe', $output, $return_var);
Он запускается, но программа не может выполнять задачи из-за недостаточных привилегий. Мой вопрос: как запустить исполняемый файл под учетной записью Windows с веб-сайта PHP?
Когда выполняется через Sysinternals PsExec :
$lastline = exec('D:\\PsExec.exe -u UserName -p Password -accepteula "D:\\MyProgram.exe"', $output, $return_var);
MyProgram.exe даже не выполняется. PHP выдает пустой вывод, а return_var – -1073741502
. Я предполагаю, что это какое-то необработанное исключение.
Когда выполняется через lsrunas :
$lastline = exec('D:\\lsrunas.exe /user:UserName /password:Password /domain:DOMAIN /command:"D:\\MyProgram.exe" /runpath:D:\\', $output, $return_var);
MyProgram.exe тоже не выполняется. PHP выдает пустой вывод, а return_var равен 0
.
Встроенная в Microsoft команда runas
не работает, потому что она не принимает пароль в качестве параметра.
Пробовал использовать разные PHP-функции, такие как shell_exec
, system
и passthru
Попробовал создать новый пул приложений в IIS, чтобы запустить веб-сайт в разделе LOCAL SERVICE, SYSTEM или конкретный пользователь. EDIT: Это то, где я поступил не так. Он должен работать, но не работает, когда параметр «Загрузить профиль пользователя» не включен (шаг 3 в моем ответе).
Есть ли у кого-нибудь рабочие предложения?
Примечание. Все команды работают и тестируются через командную строку напрямую.
Я продолжал копаться и узнал, что единственное, что работает, это выделенный пул приложений.
Advanced Settings > Identity > Custom account
Advanced Settings > Load User Profile
в true
(это важно). -или- для лучшей безопасности:
, 5. Переместите весь код, связанный с командами, в один раздел вашего веб-сайта, преобразуйте его в приложение и примените к нему этот пул приложений. Затем вы можете ограничить любой публичный доступ к этой части и безопасно вызвать эту функциональность из других частей вашего сайта.
Важная заметка (!):
Если вы используете PHP через FastCGI, вы должны установить fastcgi.impersonate = 0
в файле php.ini
.
Чтобы проверить, кто запускает этот процесс, вы можете сохранить следующий код в *.bat
файл и вызвать его из PHP.
@echo off SET now=%date% %time% SET out=[%now%] %userdomain%\%username% echo %out% echo %out% > D:\hello.txt ::msg * "%out%" if %username%=="SpecificUser" ( exit /B 100 ) else ( exit /B 200 )
Замените SpecificUser
на нужное имя пользователя. Иногда вы не видите выхода. Тогда вам помогут коды выхода.
Если вы вообще не видите код вывода или выхода, этот скрипт выведет имя пользователя в текстовый файл. Замените D:\hello.txt
на нужный путь.