php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #25805 Problem Accessing Network Shares
Submitted: 2003-10-09 12:16 UTC Modified: 2003-10-12 00:27 UTC
Votes:1
Avg. Score:5.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: mattj at exitcare dot com Assigned:
Status: Not a bug Package: Directory function related
PHP Version: 4.3.3 OS: Windows 2003 Web Server
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: mattj at exitcare dot com
New email:
PHP Version: OS:

 

 [2003-10-09 12:16 UTC] mattj at exitcare dot com
Description:
------------
I've looked at the documentation for opendir() and it says:
opendir -- open directory handle
resource opendir ( string path)

It doesn't specifiy exactly what a valid path is, so maybe this isn't a bug and is working as intended, but I don't know.

I used the following code to just test opendir() accross a network to a windows share. The computer's name I am trying to access is 'matt', the IP is '192.168.0.6', and the name of the share is 'F Drive'. I tried it with both the UNC and the IP with the proper escaping and they didn't work. I also tried them with forward slashes, didn't work either.

The 'F Drive' share on the XP machine PHP is trying to access has Permissions set up to allow read access to 'Everyone', but with the nature of the error, I don't think permissions is even relevant, but I figured I should just mention that in case.

Are windows network shares / UNC's not supported by PHP? I couldn't find any documentation on PHP's manual about network shares. They all returned Invalid Argument.

Reproduce code:
---------------
<?php
$dir1 = "\\\\matt\\F Drive";
$dir2 = "\\\\192.168.0.6\\F Drive";
$dir3 = "//matt/F Drive";
$dir4 = "//192.168.0.6/F Drive";
opendir($dir1);
opendir($dir2);
opendir($dir3);
opendir($dir4);
?>

Expected result:
----------------
Shouldn't error. No output.

Actual result:
--------------
Warning: opendir(\\matt\F Drive): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 6

Warning: opendir(\\192.168.0.6\F Drive): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 7

Warning: opendir(//matt/F Drive): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 8

Warning: opendir(//192.168.0.6/F Drive): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 9

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2003-10-09 12:32 UTC] wez@php.net
MSDN docs on FindFirstFile (the win32 API that underlies opendir) state:

-----
... Similarly, on network shares, you can use an lpFileName of the form "\\server\service\*" but you cannot use an lpFileName that points to the share itself, such as "\\server\service".

To examine any directory other than a root directory, use an appropriate path to that directory, with no trailing backslash. For example, an argument of "C:\windows" will return information about the directory "C:\windows", not about any directory or file in "C:\windows". An attempt to open a search with a trailing backslash will always fail.
-----

So, try it with a trailing backslash.
 [2003-10-09 13:04 UTC] mattj at exitcare dot com
Looks like it yields the same results.

<?php
$dir1 = "\\\\matt\\F Drive\\";
$dir2 = "\\\\192.168.0.6\\F Drive\\";
$dir3 = "//matt/F Drive/";
$dir4 = "//192.168.0.6/F Drive/";
opendir($dir1);
opendir($dir2);
opendir($dir3);
opendir($dir4);
?>

Warning: opendir(\\matt\F Drive\): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 6

Warning: opendir(\\192.168.0.6\F Drive\): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 7

Warning: opendir(//matt/F Drive/): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 8

Warning: opendir(//192.168.0.6/F Drive/): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 9
 [2003-10-10 07:03 UTC] sniper@php.net
"To anyone who needs to use UNC mapped drives with 
OpenDir(), if you are having a problem with OpenDir() reading 
the directory, check your permissions for the share on the 
host machine. Start with giving full permission to everyone 
(which should work fine) and then back accessability until you 
have a problem."

from bug #22153
 [2003-10-10 09:17 UTC] mattj at exitcare dot com
It is not security.
I went to the Sharing tab and clicked the Perissions button for the F Drive Share. I gave Everyone full control. I also went to the Security tab and set Everyone to full control. Applied the changes, reran the script. Exact same result.
 [2003-10-10 11:39 UTC] sniper@php.net
Try renaming those shares not to have that space in them,
for example 'F Drive' -> 'F_Drive'..

 [2003-10-10 13:41 UTC] mattj at exitcare dot com
I redid the share to be called 'fdrive'.
Then updated my script accordingly:
<?php
$dir1 = "\\\\matt\\fdrive\\";
$dir2 = "\\\\192.168.0.6\\fdrive\\";
$dir3 = "//matt/fdrive/";
$dir4 = "//192.168.0.6/fdrive/";
opendir($dir1);
opendir($dir2);
opendir($dir3);
opendir($dir4);
?>
But I still get:

Warning: opendir(\\matt\fdrive\): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 6

Warning: opendir(\\192.168.0.6\fdrive\): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 7

Warning: opendir(//matt/fdrive/): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 8

Warning: opendir(//192.168.0.6/fdrive/): failed to open dir: Invalid argument in C:\Inetpub\wwwroot\ExitCareWeb\test.php on line 9
 [2003-10-12 00:27 UTC] sniper@php.net
Not enough information, assuming this is run under IIS where 
this document applies:

http://support.microsoft.com/default.aspx?scid=kb;en-us;Q189408
 [2003-10-29 08:26 UTC] dr_no at moonraker dot com
Hi there !

Had the same problem... but solved it :)
in fact it IS permission related...
(like sniper@php.net said)

my conf:
WEBsrvr nt5 + Apache/1.3.24 (Win32) PHP/4.3.4RC3-dev
SMBsrvr nt5

the deal:
WEBsrvr access a share on SMBsrvr with opendir()

the problem:
$d = opendir('\\SMBsrvr\whatever');
Warning: opendir(\\SMBsrvr\whatever): failed to open dir: Invalid argument in C:\Inetpub\www\script.php on line x
--`this is not a usefull warning !`

$fp = fopen('\\SMBsrvr\whatever\file.ext','rb');
Warning: fopen(\\SMBsrvr\whatever\file.ext): failed to open stream: Permission denied in C:\Inetpub\www\script.php on line y
--`hmm, hmm, more interresting...`


At this point had to investigate a bit more:
Apparently apache + php know that \\SMBsrvr\whatever exists and that it is a valid directory ressource...


Did some packet log on SMBsrvr:
WEBsrvr sends a SMB `Tree Connect AndX Request` using nullSession
SMBsrvr replies by an ACCESS_DENIED

gotcha !

SMBsrvr doesn't allow nullSession...
but why WEBsrvr tries to connect using nullSession ?
because Apache is running as LocalSystem

From MSDN:
`Windows NT - LocalSystem:
The service has limited access to network resources, such as shares and pipes, because it has no credentials and must connect using a null session. The following registry key contains the NullSessionPipes and NullSessionShares values, which are used to specify the pipes and shares to which null sessions may connect:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
Alternatively, you could add the REG_DWORD value RestrictNullSessAccess to the key and set it to 0 to allow all null sessions to access all pipes and shares created on that machine.`

Enough blabla:
Either you allow the host of share to accept nullSessions
or you create an account with enough privileges on the apache host and when in mmc/Services/Apache/Connexion "Open a session as" - use the newly created account...

All of this is true for Apache, but it should be 'approximatively' the same concept for IIS...

a few references for this 'bug' (that is not)
http://bugs.php.net/bug.php?id=24795
http://bugs.php.net/bug.php?id=22153
http://bugs.php.net/bug.php?id=20813
http://bugs.php.net/bug.php?id=13058
http://bugs.php.net/bug.php?id=12524

attn to: iliaa@php.net; sniper@php.net
there are a lot of bug reports for this local config. problem
maybe an addendum in the documentation could be usefull...

sorry for my bad english...
/hth
/bye

dr_no
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Apr 26 00:01:30 2024 UTC