我正在尝试使用openfiles.exe来获取远程服务器上当前打开的文件的信息。我可以从命令提示符运行Web服务器所在的命令,因此我知道它在Web服务器和我正在尝试定位的服务器之间起作用。但是,当我尝试在PHP中调用相同的命令时,我得到一个Apache错误日志条目:“错误:目标系统必须运行Windows XP或更高版本。” Web服务器在Xp Pro上运行,目标服务器在Windows Server 2003上。从命令提示符下,命令运行完美,甚至是网络上的旧Windows 2000服务器,就在我从PHP运行它时,它似乎有一个问题。有没有人对为什么和/或如何解决这个问题有任何想法?
我正在使用的代码是:
$output = shell_exec("openfiles /query /s servername");
echo $output;
$i = 0;
$c = count($output);
while ($i < $c) {
$dump = $output[$i];
echo $dump ."<br>";
$i++;
}
shell_exec(),system()和exec()的行为完全相同,就像从批处理文件运行命令一样。一个稍微有趣的转折是,如果我删除“/ s servername”部分,它会输出以下内容:
Files Opened Remotely via local share points:
---------------------------------------------
INFO: No shared open files found.
...所以就好像/ s标志正在抛出它。就像我说的,它在命令提示符下工作正常,所以我知道可执行文件能够从目标服务器中提取信息;我只需要找出为什么PHP似乎有同样的问题......
答案 0 :(得分:3)
您的Apache服务器在错误的帐户下运行,并且没有远程IPC $份额的权限;)
编辑 - 完整帖子:
可能是权限吗? Apache运行的用户是什么?当您从命令提示符执行此操作时,您可能会将其作为域管理员帐户或其他具有连接到远程计算机上的IPC $共享的正确权限的帐户(IIRC,这样就完成了这样的事情) )。虽然Apache可能没有,但它可能只是一个误导性的错误消息,当实际发生的是它无法联系IPC $共享并假设远程计算机没有“Windows XP或更高版本......” / p>
在XP版本的openfiles上,有/ u和/ p选项可以传递用户名和密码;坚持在那里测试域名管理员凭据,看看是否有效。如果是,请创建一个没有文件存储权限的受限AD帐户并使用这些凭据或其他内容,以确保没有人可以窃取您的主域管理员帐户。