3

我希望这里有人可以帮助我。我在这个问题上搜索了大约 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 上完成这项工作。

4

1 回答 1

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');

我发现即使使用单引号,我也必须对前导 \ 进行双重转义。如果您使用变量并将引号更改为双引号,则可能需要进行一些调整才能使其正确。

请让我知道这对你来说是如何工作的,因为我有点好奇。

于 2013-09-17T14:54:41.260 回答