Alp*_*Dev 3 php command-line exec psexec runas
默认情况下,PHP在IUSR帐户下运行.直接执行时:
$lastline = exec('D:\\MyProgram.exe', $output, $return_var);
Run Code Online (Sandbox Code Playgroud)
它运行,但由于权限不足,程序无法完成任务.我的问题是:如何在PHP网站上的特定Windows帐户下运行可执行文件?
通过Sysinternals PsExec执行时:
$lastline = exec('D:\\PsExec.exe -u UserName -p Password -accepteula "D:\\MyProgram.exe"', $output, $return_var);
Run Code Online (Sandbox Code Playgroud)
MyProgram.exe甚至根本不执行.PHP抛出空输出,return_var是-1073741502.我认为这是某种未处理的异常.
$lastline = exec('D:\\lsrunas.exe /user:UserName /password:Password /domain:DOMAIN /command:"D:\\MyProgram.exe" /runpath:D:\\', $output, $return_var);
Run Code Online (Sandbox Code Playgroud)
MyProgram.exe也不执行.PHP抛出空输出,return_var是0.
Microsoft的内置runas命令不起作用,因为它不接受密码作为参数.
使用像不同的PHP函数尝试shell_exec,system和passthru
尝试在IIS下创建新的应用程序池,以在LOCAL SERVICE,SYSTEM或特定用户下运行网站.编辑:这是我出错的地方.它应该工作,但在未启用"加载用户配置文件"设置时失败(我的答案中的第3步).
有没有人有工作建议?
注意:所有命令都在直接通过命令行工作和测试.
我一直在挖掘,发现唯一有效的是专用的应用程序池.
Advanced Settings > Identity > Custom accountAdvanced Settings > Load User Profile为true(这个很重要)- 或 - 为了更好的安全性:
.5.将所有与命令相关的代码移动到您网站中的一个部分,将其转换为应用程序并将该应用程序池应用于该部分.然后,您可以限制对该部分的任何公共访问,并从您站点的其他部分安全地调用该功能.
重要的提示 (!):
如果您通过FastCGI运行PHP,则必须设置fastcgi.impersonate = 0为php.inifile.
要测试谁正在运行该过程,您可以将以下代码保存到*.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
)
Run Code Online (Sandbox Code Playgroud)
替换SpecificUser为您想要的用户名.有时你会看到没有输出.退出代码将帮助您.
如果您根本看不到任何输出或退出代码,则此脚本会将用户名输出到文本文件.替换D:\hello.txt为您想要的路径.