我希望有人可以帮助我。 我已经在这个问题上搜索了大约3个小时,但没有发现任何有用的信息。 (不,stackoverflow.com/questions/1539506下的答案没有帮助)
我安装了一个安装了PHP的IIS 7。我将测试网站的身份验证模式设置为“Windows身份验证”。这一切都很好(我在PHP中收到了“REMOTE_USER”)。
现在我必须使用“scandir()”和“is_file()”以及其他一些功能访问网络共享,但我只收到错误消息,例如“访问被拒绝”或“无法打开目录:没有这样的文件或目录“。
权限设置正确:如果我将身份验证设置为“匿名”并将“用户身份”设置为我当前的测试用户,则一切正常,但我必须使用“Windows身份验证”
我也尝试将网络共享设置为虚拟目录,但PHP没有找到此目录(phpinfo()表示“虚拟目录支持”已禁用,但我没有找到任何有关如何启用此功能的内容)
PS:我尝试使用apache服务器进行相同的PHP配置,并且一切都很完美。 (使用“auth_sspi”模块和“reqire valid-user”指令)。但我必须在IIS上完成这项工作。
答案 0 :(得分:1)
我今天早上在一个我一直在努力的简单文件组织应用程序上遇到了这个挑战。
我从安全专家的角度来看并没有看到这一点,虽然我有预感但这并不理想。我的应用程序是私有的,所以我不太担心。据我所知,问题是网络共享必须由IIS AppPool用户安装/授权。
我找到了这个例子,用于在PHP System Call:
的手册页上执行系统调用<?php
function my_exec($cmd, $input = '')
{
$desc = array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w')
);
$proc = proc_open($cmd, $desc, $pipes);
fwrite($pipes[0], $input);
$stdout = stream_get_contents($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
$rtn = proc_close($proc);
return array('stdout' => $stdout, 'stderr' => $stderr, 'return' => $rtn);
}
?>
然后我可以调用它并访问共享:
my_exec('net use \\\\$MachineName\$ShareName /user:$User $Pass');
我发现即使使用单引号,我也必须双重逃避领先\。如果您使用变量并将引号更改为double,则可能需要进行一些调整以使其正确。
请告诉我这对你有什么用,因为我有点好奇。