如何从PHP网站作为特定的Windows用户运行可执行文件?

时间:2014-02-09 23:17:51

标签: php command-line exec psexec runas

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

有人有工作建议吗?

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

1 个答案:

答案 0 :(得分:5)

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

  1. 在IIS下创建一个新的应用程序池
  2. Advanced Settings > Identity > Custom account
  3. 中设置用户名和密码
  4. Advanced Settings > Load User Profile设为 true (这个很重要)
  5. 在网站的基本设置下选择此池
  6. - 或 - 为了更好的安全性:

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

    重要提示(!):

    如果您通过FastCGI运行PHP,则必须在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替换为您想要的路径。

相关问题