为了账号安全,请及时绑定邮箱和手机立即绑定

为什么不由 PsExec 执行的远程批处理文件是从使用函数 exec 的 PHP 脚本中运行的

为什么不由 PsExec 执行的远程批处理文件是从使用函数 exec 的 PHP 脚本中运行的

PHP
慕容708150 2022-05-27 14:50:14
我目前面临的问题是我想实现一个在远程服务器上启动批处理文件的 PHP 脚本。经过几个小时的想法,我最接近的解决方案是本地服务器上的一个批处理文件,可以由 PHP 脚本启动。但是,当通过 PHP 脚本启动时,批处理文件不会以某种方式启动远程批处理文件。如果在c:\directoryapps\sub\classes\actions\test.bat本地双击启动批处理文件,则远程批处理文件c:\directory\sub\test.bat执行没有问题PsExec。根据需要授予权限。我在 PHP 中使用以下代码来启动第一个批处理文件:$cmd = '"c:\\directoryapps\\sub\\classes\\actions\\test.bat"'; exec('cmd /c '.$cmd.' &');该批处理文件的代码如下:"C:/Windows/System32/SysinternalsSuite/PsExec.exe" \\server -i -u **** -p **** c:\\directory\\sub\\test.bat我如何实现这个的工作版本?我还尝试从 PHP 脚本中运行第一个批处理文件代码,但成功率更低。
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

主要问题是将Sysinternals Suite安装到%SystemRoot%\System32. 这不是一个好的决定,并导致了这里的问题。

该目录%SystemRoot%\System32适用于在 64 位 Windows 上的 64 位环境中执行的 64 位应用程序。

在 32 位环境中使用通常扩展为%SystemRoot%\System32的会导致 Windows文件系统重定向器重定向到分别扩展的 .C:\Windows\System32%SystemRoot%\SysWOW64C:\Windows\SysWOW64

%SystemRoot%\SysWOW64包含 32 位系统可执行文件,但不SysinternalsSuite包含 file的目录PsExec.exe

python.exe是一个 32 位的可执行文件。出于这个原因,仅cmd在 Python 脚本%SystemRoot%\SysWOW64\cmd.exe中启动,该脚本是 32 位版本的 Windows 命令处理器。32 位cmd找不到C:\Windows\SysWOW64\SysinternalsSuite\PsExec.exe,所以psexec.exe根本不执行。

好吧,根本不需要开始cmd.exe运行一个只包含一个命令行的批处理文件,以psexec.exe在 32 位环境下以错误的路径运行。

在 Python 脚本中使用就足够了:

$args = '\\\\server -i -u "****" -p "****" "C:\\directory\\sub\\test.bat"';exec('C:\\Windows\\Sysnative\\SysinternalsSuite\\PsExec.exe '.$args.);

32 位使用此代码在64 位 Windows 系统目录的子目录中使用适当的参数python.exe运行 32 位可执行文件。PsExec.exeSysinternalsSuite

特殊重定向Sysnative仅适用于在 32 位环境中执行的 32 位应用程序。请注意,Sysnative它既不是目录也不是符号链接或硬链接。文件系统不包含Sysnative目录中的条目C:\Windows。由于这个原因,不可能在批处理文件中使用,if exist %SystemRoot%\Sysnative或者if exist %SystemRoot%\Sysnative\因为这两个条件总是评估为假。但if exist %SystemRoot%\Sysnative\cmd.exe可以在批处理文件中使用,以确定批处理文件是否在 64 位 Windows 上由 32 位 Windows 命令处理器处理,因为在此用例中条件评估为真。

我还建议阅读 Microsoft 文档页面WOW64 Implementation Details and Registry Keys Affected by WOW64,以了解 32 位 Windows 仿真如何在 64 位 Windows 上工作。


一个小问题是附加&在 Windows 命令行的末尾。shell 脚本行末尾的 & 符号仅由 Unix/Linux/Mac shell 脚本解释器解释为在后台运行分离的可执行文件的指令。因此,shell 脚本解释器不会在脚本继续之前或用户可以输入下一个要执行的命令之前等待已启动的可执行文件终止。

Windows 命令处理器cmd.exe将双引号参数字符串之外的 & 符号解释为AND运算符,通常用于在一个命令行上指定多个命令,请参见使用 Windows 批处理文件的单行多命令。如果在&由 解释的命令行上什么都没有cmd.exe,Windows 命令处理器将忽略AND运算符。

因此,不要&在 Windows 命令行上附加。


命令行的批处理文件中还有两个小问题:

"C:/Windows/System32/SysinternalsSuite/PsExec.exe" \\server -i -u **** -p **** c:\\directory\\sub\\test.bat

Windows 上的目录分隔符\/Microsoft 在文档页面Naming Files, Paths, and Namespaces中的解释不同。在将字符串传递给适当的文件系统函数之前,Windows 内核默认替换文件/文件夹字符串中的 all /by 。\但是 Linux/Mac 目录分隔符的使用/仍然会导致意外行为。

例子:

在 Windows 命令提示符窗口中运行:

for %I in (C:/Windows/*.exe) do @echo %I

在 Windows 目录中找到的可执行C:文件以不带路径的文件名输出。因此,分配给循环变量I的是一个字符串,它引用驱动器当前目录中的可执行文件C:。但是C:执行此命令行时驱动器上的当前目录很可能不会C:\Windows导致真正处理分配给循环变量的文件名I而不是仅将其打印到控制台窗口时出现问题。

现在在同一命令提示符窗口中运行:

for %I in (C:\Windows\*.exe) do @echo %I

输出与以前相同的文件名,但这次使用完整路径。

结论:不要/在 Windows 上的文件/文件夹字符串中使用,依赖于 Windows 内核的自动更正。/在 Windows 上主要用于选项的开头。

在批处理文件中,两个目录名之间以及目录名和文件名之间的用法\\也总是错误的,必须由 Windows 内核纠正,然后才能通过删除一个反斜杠将文件/文件夹名称字符串传递给文件系统。\\仅在UNC 路径的开头有效。


查看完整回答
反对 回复 2022-05-27
  • 1 回答
  • 0 关注
  • 230 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号