如何在PHP网站上以特定的Windows用户身份运行可执行文件?

3

PHP默认在IUSR账户下运行。当直接执行时:

$lastline = exec('D:\\MyProgram.exe', $output, $return_var);

程序运行了,但由于权限不足,无法完成任务。我的问题是:如何从PHP网站下以特定的Windows账户运行可执行文件?

我已经尝试过:

通过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_execsystempassthru


尝试在 IIS 下创建一个新的应用程序池,以 LOCAL SERVICE、SYSTEM 或特定用户运行网站。 编辑:这就是我做错了地方。这应该可以工作,但当未启用加载用户配置设置时会失败(我的回答中的第3步)。

有人有可行的建议吗?

注意:所有命令都通过直接命令行工作和测试。


我认为你可以将密码“pipe”到runas - 类似于 exec('echo adminpassword | runas /user:administrator fullPathToProgram',$output); - JackTheKnife
1个回答

5
我继续深入研究后发现唯一有效的方法是使用专用应用程序池。
  1. 在IIS下创建一个新的应用程序池
  2. 在“高级设置>标识>自定义帐户”中设置用户名和密码
  3. 将“高级设置>加载用户配置文件”设置为true(这很重要)
  4. 在网站的基本设置下选择此池,

-或- 为了更好的安全性:

5.将所有与命令相关的代码移动到您网站中的一个部分,将其转换为应用程序并将该应用程序池应用于它。然后,您可以限制对该部分的任何公共访问,并安全地从您网站的其他部分调用该功能。

重要提示!

如果您通过FastCGI运行PHP,则必须在php.ini文件中设置fastcgi.impersonate = 0


测试批处理文件:

要测试谁正在运行进程,您可以将以下代码保存到*.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替换为您想要的路径。


谢谢这个解决方案!对于可能遇到我的问题的任何人:当我尝试使用PHP的shell_exec()函数来执行此解决方案时,批处理文件一直返回“nt authority\IUSR”。我发现使用PHP的proc_open()函数使用了应用程序池中指定的帐户。提醒一下 - proc_open()在目录路径中存在空格时存在问题,可以通过在$cmd字符串的开头和结尾处放置双引号来解决。 - geekinit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接