使用启用Windows身份验证的IIS访问网络共享

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正常工作。


我的解决方案是将登录用户设置为具有访问网络共享权限的域用户,对于我的情况,这个方法非常完美。 - Robert
1个回答

1

今天早上我在一个简单的文件组织应用程序中遇到了这个挑战。

虽然我没有从安全专家的角度考虑过这个问题,但我有一种预感这并不理想。我的应用程序是私有的,所以我不太担心。据我所知,问题在于网络共享必须由IIS AppPool用户进行挂载/授权。

我在PHP System Call的man页面上找到了执行系统调用的示例:

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

我发现即使使用单引号,我仍然需要双重转义前导的 \。如果您使用变量并将引号更改为双引号,则可能需要进行一些调整才能正确执行。
请告诉我这对您有何影响,因为我有点好奇。

我没有测试过你的解决方案,但我认为如果你需要以不同于IIS AppPool用户的身份访问网络共享,则这是一个很好的可能性。因此,我将您的答案标记为已接受 ;) - Robert
谢谢,我很感激。回复有点慢,一直在拖延。 :) - Henry Rivera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接