【问题标题】:How to run executable from PHP website as a specific Windows user?如何以特定 Windows 用户身份从 PHP 网站运行可执行文件?
【发布时间】:2014-03-07 03:34:58
【问题描述】:

默认情况下 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 步)。

有人有可行的建议吗?

注意:所有命令都可以直接通过命令行运行和测试。

【问题讨论】:

  • 我认为你可以将密码“管道”到runas - 类似于exec('echo adminpassword | runas /user:administrator fullPathToProgram',$output);

标签: php command-line exec psexec runas


【解决方案1】:

我一直在挖掘,发现唯一有效的是专用应用程序池。

  1. 在 IIS 下新建应用程序池
  2. Advanced Settings > Identity > Custom account中设置用户名和密码
  3. Advanced Settings > Load User Profile设置为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 字符串的开头和结尾放置双引号来解决。
猜你喜欢
  • 2017-03-03
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多