【发布时间】:2015-10-22 15:11:49
【问题描述】:
我一直在搜索有关此错误的 StackExchange 主题,但没有找到任何与我所遇到的情况相符的主题。
我目前的状态是我有一个网页,其中包含使用 d3.js 设置的可视化,其中一些对象是可点击的。单击其中一个后,将通过 AJAX 执行 php 脚本(根据单击的对象传递变量),通过该脚本对 MSSQL 数据库运行查询,该数据库返回要通过 FTP 检索的图像列表。到目前为止,我知道这部分是有效的。
代码托管在运行 IIS 的 Win 2008 r2 服务器上。
检索图像数组后,将执行一个循环,查看它们是否已下载,如果没有,则在下面的循环中通过 FTP 获取图像:
if(in_array($fileName,$files)) {
//*** Look to see if the image has already been FTP'd
$fileTo = "C:/inetpub/wwwroot/IRIS/images/" . $fileName;
} else {
$FTP_HOST = $wrow["serverId"] . ".prod.com";
// *** Create the FTP object
$ftpObj = new FTPClient();
// *** Connect
try{
$ftpObj->connect($FTP_HOST,$FTP_USER,$FTP_PASS);
} catch (PDOException $uc) {
header('Content-type: application/json');
echo json_encode("Error making the FTP connection");
die();
}
$fileFrom = $wrow["fileSpec"];
$fileTo = "C:/inetpub/wwwroot/IRIS/images/" . $fileName;
try {
$ftpObj->downloadFile($fileFrom,$fileTo);
}catch (PDOException $uc) {
header('Content-type: application/json');
echo json_encode("Error transfering the file");
die();
}
}
代码进入最后的 try/catch 循环,调用我在 downloadFile 所在的 FTP 类。请注意,在建立连接时,所有用户都使用相同的用户名和密码。
在ftp_class.php中连接如下:
public function connect ($server, $ftpUser, $ftpPassword, $isPassive = false) {
// *** Set up basic connection
$this->connectionId = ftp_connect($server);
// *** Login with username and password
$loginResult = ftp_login($this->connectionId, $ftpUser, $ftpPassword);
// *** Sets passive mode on/off (default off)
ftp_pasv($this->connectionId, $isPassive);
// *** Check connection
if ((!$this->connectionId) || (!$loginResult)) {
$this->logMessage('FTP connection has failed!',true);
$this->logMessage('Attempted to connect to ' . $server . ' for user ' . $ftpUser, true);
return false;
} else {
$this->logMessage('Connected to ' . $server . ', for user ' . $ftpUser);
$this->loginOk = true;
return true;
}
}
下载文件如下:
public function downloadFile($fileFrom,$fileTo) {
$asciiArray = array('txt','csv');
$extension = end(explode('.',$fileFrom));
if(in_array($extension,$asciiArray)) {
$mode = FTP_ASCII;
} else {
$mode = FTP_BINARY;
}
if(ftp_get($this->connectionId,$fileTo,$fileFrom,$mode,0)) {
$this->logMessage("file " . $fileTo . " successfully downloaded");
return true;
} else {
$this->logMessage("There as an error downloading file " . $fileTo,true);
return false;
}
}
我通过 Active Directory 角色管理对我的应用程序的安全访问(这一切都在公司 Intranet 上),但请再次注意,ftp 用户名和密码不依赖于这些角色。
这是我遇到的问题。如果任何服务器管理员尝试获取、保存在我的服务器上并显示,它工作正常。如果某些不是管理员的用户尝试做同样的事情,它可以正常工作,但大多数用户无法完全执行。由于用户必须将文件写入图像文件夹(见上面的路径),我已将该文件夹共享给我需要访问的 Active Directory 角色,并为他们提供对该特定文件夹的读写权限。
返回的错误是:
警告:ftp_get(C:/inetpub/wwwroot/IRIS/images/041351W0006010251F00000064I04.jpg):无法打开流:C:\inetpub\wwwroot\dred\ 中的权限被拒绝ftp_class.php 第 113 行
行
警告:ftp_get():打开 C:/inetpub/wwwroot/IRIS/images/041351W0006010251F00000064I04 时出错C:\inetpub\wwwroot\dred\ftp_class.php 中的 .jpg 在 113
第 113 行是 ftp_get 所在的行(见上文)。
我在故障排除中尝试了一些方法:
- 让 Active Directory 角色管理员写入我的服务器(不是我打算保留的东西,只是在试验):这有效
- 授予 Active Directory 角色对服务器 c 驱动器(同样,只是测试)以及 inetpub 和 wwwroot 的完全读/写/更改访问权限:不起作用
- 将
ftp_pasv()设置为 True:无效
我想就是这样!任何建议将不胜感激。
【问题讨论】:
-
用户是否以某种方式通过 IIS 进行身份验证以访问脚本? IIS 是否可能在远程用户的上下文中运行 PHP?
-
感谢史蒂夫的评论。我对 IIS 非常缺乏经验,我不确定如何验证您的问题。如果您有任何提示,请告诉我。我应该注意,此应用程序的所有其他 php 对所有用户都适用,这只是我遇到问题的 ftp 序列。
-
查看this question 并使用 var_dump($_SERVER) 或类似方法查看 PHP 是否以客户端用户身份运行。这可能会影响 IIS 在使用 AD 时允许的权限。
-
好的,我在 PHP 中调用“downloadFile”的部分插入了 var_dump($_SERVER)(如果我把它放在“downloadFile”中,它就不会执行)。我不确定这是否是正确的地方。无论哪种方式,它都将我的服务器名称作为 USERNAME 返回,将个人网络 ID(即,不是 AD 值)作为 LOGON_USER 和 AUTH_USER 返回。可以访问图像的人和不能访问图像的人都是这种情况。我是否在正确的地方寻找正确的东西?