Php доступ к сетевой папке windows

Нужно получить файлы из сетевой папки через php (web-сервер Apache+php на Windows2008 R2 Enterprise) На самом сервере я могу подключить сетевую папку, все данные мне в ней доступны, но когда пытаюс...

Нужно получить файлы из сетевой папки через php (web-сервер Apache+php на Windows2008 R2 Enterprise)
На самом сервере я могу подключить сетевую папку, все данные мне в ней доступны, но когда пытаюсь тоже самое сделать через php, в ответ получаю
false.
Пробовала подключаться следующим образом:

$directory_path="\\192.168.1.5\my_dir\";
//$directory_path="//192.168.1.5my_dir";
if(!is_dir($directory_path))
  die($directory_path.' is not direction!');
if(!file_exists($directory_path.'text.txt'))
  die($directory_path.'text.txt not found!');

Программа валится еще на проверке директории. Пробовала прописывать разные пути. На сам каталог дала пользователям полные права, Apache запускаю под администратором, в реестре пробовала прописывать переменную HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesLanmanServerParametersRestrictNullSessAccess = 0 по совету отсюда.
Пожалуйста, подскажите, какие еще настройки нужно сделать, чтобы эта сетевая папка стала доступной?
P.S. Попробовала создать ссылку по рекомендации.

 mklink /D MySymLink "\serverpathtofolder"  

PHP видит каталог MySymLink но на все что внутри него выводит false.

within PHP (XAMPP) installed on a Windows XP Computer Im trying to read a dir which exists on a local network server. Im using is_dir() to check whether it is a dir that I can read.

In Windows Explorer I type \serverdir and that dir is being shown.
When I map a network drive a can access it with z:dir as well.

In PHP I have that script:

<?php if( is_dir($dir){ echo 'success' } ) ?>

For $dir I tried:

  • /server/dir
  • //server/dir
  • serverdir
  • \serverdir
  • \\server\dir

and

  • z:dir
  • z:\dir
  • z:/dir
  • z://dir

But I never get success?
Any idea?
thx

Gumbo's user avatar

Gumbo

635k107 gold badges772 silver badges839 bronze badges

asked Jul 20, 2009 at 14:11

Max's user avatar

I solved it by changing some stuff in the registry of the server as explained in the last answer of this discussion:

http://bugs.php.net/bug.php?id=25805

Thanks to VolkerK and Gumbo anyway!
I love stackoverflow and their great people who help you so incredibly fast!!

EDIT (taken from php.net):

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_MACHINESYSTEMCurrentControlSetServicesLanmanServerParameters
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.`

add RestrictNullSessAccess=0 to your registery.

answered Jul 20, 2009 at 20:10

Max's user avatar

MaxMax

1,1043 gold badges15 silver badges21 bronze badges

3

You probably let xampp install apache as service and run the php scripts trough this apache. And the apache service (running as localsystem) is not allowed to access the network the way your user account is.

A service that runs in the context of the LocalSystem account inherits the security context of the SCM. The user SID is created from the SECURITY_LOCAL_SYSTEM_RID value. The account is not associated with any logged-on user account.
This has several implications:

   * The service presents the computer’s credentials to remote servers.

You can test this by starting the apache as console application (apache_start.bat in the xampp directory should do that) and run the script again. You can use both forward and backward slashes in the unc path. I’d suggest using //server/share since php doesn’t care about / in string literals.

<?php
$uncpath = '//server/dir';
$dh = opendir($uncpath);
echo "<pre>n";
var_dump($dh, error_get_last());
echo  "n</pre>";

Community's user avatar

answered Jul 20, 2009 at 15:15

VolkerK's user avatar

VolkerKVolkerK

94.8k20 gold badges162 silver badges226 bronze badges

Try the file: URI scheme:

file://server/dir
file:///Z:/dir

The begin is always file://. The next path segment is the server. If it’s on your local machine, leave it blank (see second example). See also File URIs in Windows.

answered Jul 20, 2009 at 14:15

Gumbo's user avatar

GumboGumbo

635k107 gold badges772 silver badges839 bronze badges

2

Yes, I know this is an old post, but I still found it, and if anyone else does…
On Windows, with newer servers, verify the SMB is installed and enabled on the target machine.

answered Jan 17, 2020 at 15:54

Jams's user avatar

JamsJams

113 bronze badges

within PHP (XAMPP) installed on a Windows XP Computer Im trying to read a dir which exists on a local network server. Im using is_dir() to check whether it is a dir that I can read.

In Windows Explorer I type \serverdir and that dir is being shown.
When I map a network drive a can access it with z:dir as well.

In PHP I have that script:

<?php if( is_dir($dir){ echo 'success' } ) ?>

For $dir I tried:

  • /server/dir
  • //server/dir
  • serverdir
  • \serverdir
  • \\server\dir

and

  • z:dir
  • z:\dir
  • z:/dir
  • z://dir

But I never get success?
Any idea?
thx

Gumbo's user avatar

Gumbo

635k107 gold badges772 silver badges839 bronze badges

asked Jul 20, 2009 at 14:11

Max's user avatar

I solved it by changing some stuff in the registry of the server as explained in the last answer of this discussion:

http://bugs.php.net/bug.php?id=25805

Thanks to VolkerK and Gumbo anyway!
I love stackoverflow and their great people who help you so incredibly fast!!

EDIT (taken from php.net):

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_MACHINESYSTEMCurrentControlSetServicesLanmanServerParameters
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.`

add RestrictNullSessAccess=0 to your registery.

answered Jul 20, 2009 at 20:10

Max's user avatar

MaxMax

1,1043 gold badges15 silver badges21 bronze badges

3

You probably let xampp install apache as service and run the php scripts trough this apache. And the apache service (running as localsystem) is not allowed to access the network the way your user account is.

A service that runs in the context of the LocalSystem account inherits the security context of the SCM. The user SID is created from the SECURITY_LOCAL_SYSTEM_RID value. The account is not associated with any logged-on user account.
This has several implications:

   * The service presents the computer’s credentials to remote servers.

You can test this by starting the apache as console application (apache_start.bat in the xampp directory should do that) and run the script again. You can use both forward and backward slashes in the unc path. I’d suggest using //server/share since php doesn’t care about / in string literals.

<?php
$uncpath = '//server/dir';
$dh = opendir($uncpath);
echo "<pre>n";
var_dump($dh, error_get_last());
echo  "n</pre>";

Community's user avatar

answered Jul 20, 2009 at 15:15

VolkerK's user avatar

VolkerKVolkerK

94.8k20 gold badges162 silver badges226 bronze badges

Try the file: URI scheme:

file://server/dir
file:///Z:/dir

The begin is always file://. The next path segment is the server. If it’s on your local machine, leave it blank (see second example). See also File URIs in Windows.

answered Jul 20, 2009 at 14:15

Gumbo's user avatar

GumboGumbo

635k107 gold badges772 silver badges839 bronze badges

2

Yes, I know this is an old post, but I still found it, and if anyone else does…
On Windows, with newer servers, verify the SMB is installed and enabled on the target machine.

answered Jan 17, 2020 at 15:54

Jams's user avatar

JamsJams

113 bronze badges

Firework

102 / 93 / 36

Регистрация: 01.04.2013

Сообщений: 649

1

Доступ к сетевой папке

27.11.2013, 10:09. Показов 9103. Ответов 16

Метки нет (Все метки)


Когда файл лежит у меня, я его читаю хорошо. Но вот мне нужно считать файл в сетевой папке.
Пытаюсь так

PHP
1
2
3
$path = '\192.168.0.10Publicprogramservice_carold_MonitorPr.txt';
$content = file_get_contents($path);
echo $content;

Но ничего не выходит.
К папке есть доступ по логину и паролю. Я сделал автоматический вход. Но может в скрипте где-то всё-таки надо прописать пароль и логин для входа?



0



127 / 127 / 25

Регистрация: 20.11.2009

Сообщений: 498

27.11.2013, 10:32

2

Скорее всего придется пользоваться curl(); чтобы передавать логин и пароль для доступа



0



102 / 93 / 36

Регистрация: 01.04.2013

Сообщений: 649

27.11.2013, 11:35

 [ТС]

3

Я об этом тоже думал. Только вот как? С курлом мало знаком. Нужен пример.



0



Vovan-VE

13207 / 6595 / 1041

Регистрация: 10.01.2008

Сообщений: 15,069

27.11.2013, 15:38

4

Цитата
Сообщение от Firework
Посмотреть сообщение

PHP
1
$path = '\192.168.0.10Publicpro...
PHP
1
2
$path = '\\192.168.0.10\Public\pro...';
echo $path;



0



Firework

102 / 93 / 36

Регистрация: 01.04.2013

Сообщений: 649

28.11.2013, 15:02

 [ТС]

5

Цитата
Сообщение от Vovan-VE
Посмотреть сообщение

PHP
1
2
$path = '\\192.168.0.10\Public\pro...';
echo $path;

Ничего не изменилось…



0



13207 / 6595 / 1041

Регистрация: 10.01.2008

Сообщений: 15,069

28.11.2013, 15:09

6

Цитата
Сообщение от Firework
Посмотреть сообщение

Ничего не изменилось…

Цитата
Сообщение от Firework
Посмотреть сообщение

Я сделал автоматический вход.

Скрипт выполняется в какой ОС?
Скрипт выполняется от имени какого пользователя? Того самого, у которого автовход настроен, или у другого?



0



102 / 93 / 36

Регистрация: 01.04.2013

Сообщений: 649

28.11.2013, 15:12

 [ТС]

7

Win7.
Тот же самый пользователь.
Только после перезагрузки компьютера надо снова вводить пароль.



0



13207 / 6595 / 1041

Регистрация: 10.01.2008

Сообщений: 15,069

28.11.2013, 15:53

8

Цитата
Сообщение от Firework
Посмотреть сообщение

Win7.
Тот же самый пользователь.

На всякий случай продолжу.
Скрипт работает под веб-сервером? Тот запущен, как служба? Службы могут быть запущены от имени другого пользователя, а не от того, под которым Вы обычно работаете.



0



Firework

102 / 93 / 36

Регистрация: 01.04.2013

Сообщений: 649

28.11.2013, 15:58

 [ТС]

9

Понятия не имею. Думаю от моего же имени.

Добавлено через 3 минуты

PHP
1
$path = 'ftp://ivanov:123421@192.168.0.250/old_MonitorPr.txt';

Вот так находит содержимое файла с фтп-сервера. Где ivanov — login, 123421 — password.
Но мне нужно с сетевой папки.



0



13207 / 6595 / 1041

Регистрация: 10.01.2008

Сообщений: 15,069

28.11.2013, 16:01

10

Цитата
Сообщение от Firework
Посмотреть сообщение

Понятия не имею. Думаю от моего же имени.

Значит, надо выяснить. В этом и может заключаться проблема: это у Вас автовход, а у него — нет.

Добавлено через 59 секунд
Не уверен, что получится, но в качестве эксперимента: file://user:pass@host/path



0



102 / 93 / 36

Регистрация: 01.04.2013

Сообщений: 649

28.11.2013, 16:06

 [ТС]

11

Цитата
Сообщение от Vovan-VE
Посмотреть сообщение

а у него — нет

У кого у него? Я сам же этот скрипт запускаю.

Добавлено через 3 минуты

Цитата
Сообщение от Vovan-VE
Посмотреть сообщение

Значит, надо выяснить. В этом и может заключаться проблема: это у Вас автовход, а у него — нет.

Добавлено через 59 секунд
Не уверен, что получится, но в качестве эксперимента: file://user:pass@host/path

не получается



0



13207 / 6595 / 1041

Регистрация: 10.01.2008

Сообщений: 15,069

28.11.2013, 16:09

12

Цитата
Сообщение от Firework
Посмотреть сообщение

У кого у него?

Еще раз:

Цитата
Сообщение от Vovan-VE
Посмотреть сообщение

Скрипт работает под веб-сервером? Тот запущен, как служба? Службы могут быть запущены от имени другого пользователя, а не от того, под которым Вы обычно работаете.

Цитата
Сообщение от Firework
Посмотреть сообщение

Понятия не имею. Думаю от моего же имени.

Цитата
Сообщение от Vovan-VE
Посмотреть сообщение

Значит, надо выяснить.



0



Firework

102 / 93 / 36

Регистрация: 01.04.2013

Сообщений: 649

28.11.2013, 16:13

 [ТС]

13

Мне просто надо знать как прописывать пароль и логин к защищённой сетевой папке.
Я привёл работающий пример с ftp.

PHP
1
$path = 'ftp://ivanov:123421@192.168.0.250/r.php';

Т.е. логин и пароль прописываются перед адресом.
Я хочу знать, как по этой аналогии это делается с сетевыми папками?



0



13207 / 6595 / 1041

Регистрация: 10.01.2008

Сообщений: 15,069

28.11.2013, 16:25

14

Насколько я понял, для UNC вообще не предусмотрено возможности указать логин и пароль.



0



102 / 93 / 36

Регистрация: 01.04.2013

Сообщений: 649

28.11.2013, 16:35

 [ТС]

15

Цитата
Сообщение от Vovan-VE
Посмотреть сообщение

UNC

щта???



0



13207 / 6595 / 1041

Регистрация: 10.01.2008

Сообщений: 15,069

28.11.2013, 16:37

16

Цитата
Сообщение от Firework
Посмотреть сообщение

щта???

Этот Ваш \hostpath — это оно и есть.

Не проще сетевой диск перманентно подключить для общего пользования?



0



102 / 93 / 36

Регистрация: 01.04.2013

Сообщений: 649

29.11.2013, 14:49

 [ТС]

17

Ну тут такая политика компании.
Надо всё запретить, а потом, когда попросят начальство, и начальство скажет сисадминам, то сисадмины дадут доступ.

Добавлено через 1 минуту
а почему на фтп сервере можно прописывать пароль и логин в пути к файлу?

Добавлено через 22 часа 6 минут



0



Подскажите как реализовать на php доступ к расшарам другого компа в сети, например хочу вывести все расшаренные папки с компа адрес которого 10.18.29.1
может я просто туплю:) но все равно кто если знает подскажите плиз)

5 ответов

36K

25 января 2008 года

dmdz

3 / / 25.01.2008

Таже проблема. Пытаюсь прочитать все файлы из расшаренной папки:

Код:

foreach (glob(«\x.x.x.xx*.*») as $name)
      echo $name . «<br/>»;

Так не вышло. Пытался монтировать расшаренную папку как диск в системе.

Код:

foreach (glob(«x:*.*») as $name)
      echo $name . «<br/>»;

Так тоже не работает. Неужели PHP не умеет работать с расшаренными папками?

8

25 января 2008 года

mfender

3.5K / / 15.06.2005

права посмотрите на директорий. у апача должен быть доступ хотя бы на чтение. апач не является ни администратором, ни опытным пользователем.

36K

26 января 2008 года

dmdz

3 / / 25.01.2008

Total Commander то нормально открывает шару. Он запущен от того же пользователя что и Apache.

36K

27 января 2008 года

dmdz

3 / / 25.01.2008

Решил проблему поставив одинаковый пароль для Administrator’а на обоих системах, в этом случае система не запрашивает пароль при открытии расшаренной папки. Решение кривоватое, но работает. -) Наверно можно конечно объединить компы в домен и открыть доступ к папке для конкретного пользователя на другой машине, но не стал заморачиваться. При обращении к расшаренной папке также следует экранировать обратные слеши:

Код:

opendir(‘\\computer_name\shared_folder’);

Почему-то по-прежнему не работает обращение к сетевому диску:

Код:

Но это уже не столь важно обращаться к шаре напрямую даже удобней. -)

35K

01 февраля 2008 года

Elizar

2 / / 13.01.2008

решил проблему обращаясь scandir(‘//10.18.29.1/shared’) выводит все что в этой папке содержится,но осталась проблема что не может собснно открыть корень,т.е scandir(‘//10.18.29.1’) не прокатывает

За последние 24 часа нас посетили 9773 программиста и 1237 роботов. Сейчас ищут 250 программистов …


  1. Volt(220)

    Volt(220)
    Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1

    Есть:
    Две машины под Windows. Назовем их С1 и С2.
    На С1 есть папка resource. У этой папки открыт доступ по сети для определенного пользователя.
    Задача:
    1) С помощью PHP взять файлы из этой папки и положить их в папку на С2.
    2) С помощью PHP положить файлы в эту папку.
    Вопросы:
    1) Как подключиться?
    2) Чем брать?


  2. Костян

    Костян
    Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО


  3. Volt(220)

    Volt(220)
    Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1

    Костян
    Стучаться на С1 по IP через 135 порт по протоколу TCP?

  4. подключится при помощи
    net
    команды/ключи монтирования дисков поищи сам.
    А дальше тупо копируешь


  5. Volt(220)

    Volt(220)
    Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1

  6. да.

    Только может их проще подключить на этапе настройки? Зачем козе баян и монтирование дисков из скрипта?


  7. Volt(220)

    Volt(220)
    Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1

    Попробуем.В смысле?

    1. copy(«\\10.20.30.40\resource\tt.txt», «dirForCopy/tt.txt»);

    ??

  8. Ну если ты подмонтировал его как диск.
    То и копировать с диска на диск.

    1. copy(‘D:/file’, ‘O:/file’);

    А понимает ли php функция copy() под винду такое указание путей я не в курсе.
    какая-то из cmd команд понимала.


  9. Volt(220)

    Volt(220)
    Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1

    Похоже что понимает, но вся эта конструкция выдает:

    перед copy идет:

    1. $cmd=«net use $path $pass /user:$user«;

  10. Прав нет?

    Собственно:
    — берешь в руки консоль.
    — монтируешь диск
    — копируешь файлы.
    Если не получается, то надо смотреть почему.
    Если все получается, воспроизводишь эти же действия в скрипте.

    Или не понимает :) могло не найти файла.

    Я не помню точно синтаксиса. Но все же, указывай для copy путь от дисков, а не от имени ПК.
    Т.е. D:path1
    а не \compnamepathpath1


  11. Volt(220)

    Volt(220)
    Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1

    Из консоли то выходит, т.е. тот же net use в cmd, и иконки между окошками спокойно таскаются.

    \compnamepath — в окошках работает, а вот дать этому диску букву и попробовать работать через нее стоит.

    Спасибо за помощь.


  12. Volt(220)

    Volt(220)
    Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1

    При назначении буквы:
    scandir — failed to open dir: No error
    copy — failed to open stream: No such file or directory
    glob — возвращает пустой массив

    Но
    Все то же самое с моего компьютера работает ну ура.
    Вывод:
    Либо пользователю под которым работает php не хватает прав.
    Либо связка Windows Server+IIS+php работает с файлами как-то иначе, чем Windows XP+Apache+php.


  13. Luge

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск


  14. Volt(220)

    Volt(220)
    Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1

    На Apache все работает.

    Хотя кто сказал что IIS не может страдать тем же самым?…

  15. Apache небось с mod_php

    а

    небось FastCGI

    рекомендую посмотреть под каким пользователем запускается PHP.


  16. Apple

    Apple
    Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2

    Во избежании недоразумений всегда и везде используем обратный слеш — это раз.
    Работаем со всем с помощью стандартных функций командной строки Windows.
    Я бы работал с proc_open, но можем и с system/exec

    Т.е copy берется не со стороны РНР, а в командной строке (exec(‘copy …’)).
    Команды subst, mkdir, rmdir и т.д.
    Не используй функции РНР.


  17. Volt(220)

    Volt(220)
    Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1

в PHP (XAMPP), установленном на компьютере с Windows XP, Im пытается прочитать dir, который существует на сервере локальной сети. Im, используя is_dir() чтобы проверить, является ли это dir, который я могу прочитать.

в Проводнике Windows я набираю serverdir и этот dir показывается.
Когда я сопоставляю сетевой диск, он может получить к нему доступ с помощью z:dir как хорошо.

в PHP у меня есть этот скрипт:

<?php if( is_dir($dir){ echo 'success' } ) ?>

на $dir I попробовал:

  • /server/dir
  • //server/dir
  • serverdir
  • serverdir
  • serverdir

и

  • z:dir
  • z:dir
  • z:/dir
  • z://dir

но я никогда не добиваюсь успеха?
Есть идеи?
thx

3 ответов


Я решил это, изменив некоторые вещи в реестре сервера, как описано в последнем ответе этого обсуждения:

http://bugs.php.net/bug.php?id=25805

спасибо VolkerK и Гамбо в любом случае!
Я люблю stackoverflow и их великих людей, которые помогают вам так невероятно быстро!!

EDIT (взято из php.net):

сервис имеет ограниченный доступ к сетевым ресурсам, таким как акции
и трубы, потому что она имеет нет учетных данных и должен подключиться с помощью null
сессия. Следующий раздел реестра содержит NullSessionPipes и
Значения NullSessionShares, используемые для указания каналов и
акции нулевых сессий может подключиться:
Система реестра HKEY_LOCAL_MACHINE\CurrentControlSet науслугиLanmanServerпараметры
Кроме того, вы можете добавить значение REG_DWORD
RestrictNullSessAccess к ключу и установите его в 0, чтобы разрешить все null
сеансы для доступа ко всем каналам и общим ресурсам, созданным на этом машина.`

добавьте RestrictNullSessAccess=0 в свой реестр.


вы, вероятно, позволите xampp установить apache в качестве службы и запустить PHP-скрипты через этот apache. И служба apache (работает как localsystem) не разрешен доступ к сети, как ваша учетная запись пользователя.

служба, которая выполняется в контексте учетной записи LocalSystem, наследует контекст безопасности SCM. SID пользователя создается из значения SECURITY_LOCAL_SYSTEM_RID. учетная запись не связана ни с одним зарегистрированным пользователем счет.
Это имеет несколько последствий:

   * служба представляет учетные данные компьютера удаленным серверам.

вы можете проверить это, запустив Apache как консольное приложение (apache_start.bat в каталоге xampp должен это сделать) и снова запустить скрипт. Вы можете использовать как прямые, так и обратные косые черты в пути unc. Я бы предложил использовать / / server / share, так как php не заботится о / in string константы.

<?php
$uncpath = '//server/dir';
$dh = opendir($uncpath);
echo "<pre>n";
var_dump($dh, error_get_last());
echo  "n</pre>";

попробовать file: схема URI:

file://server/dir
file:///Z:/dir

начало всегда file://. Следующий сегмент пути-сервер. Если он находится на вашем локальном компьютере, оставьте его пустым (см. Второй пример). См. также файл URIs в Windows.


Понравилась статья? Поделить с друзьями:
  • Photoscape x pro торрент windows 10
  • Photos windows 10 как поменять язык
  • Php windows iconv windows 1251 utf 8
  • Photos companion windows 10 скачать бесплатно на русском языке
  • Php windows call to undefined function curl init