Как запустить исполняемый файл с сайта PHP в качестве конкретного пользователя Windows?

По умолчанию 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 в моем ответе).

Есть ли у кого-нибудь рабочие предложения?

Примечание. Все команды работают и тестируются через командную строку напрямую.

Я продолжал копаться и узнал, что единственное, что работает, это выделенный пул приложений.

  1. Создайте новый пул приложений в IIS
  2. Задайте имя пользователя и пароль в Advanced Settings > Identity > Custom account
  3. Установите Advanced Settings > Load User Profile в true (это важно).
  4. Выберите этот пул в разделе «Основные настройки сайта»,

-или- для лучшей безопасности:

, 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 на нужный путь.