2009-07-20 28 views
14

w PHP (XAMPP) zainstalowana na komputerze z systemem Windows XP Próbuję odczytać katalog, który istnieje na lokalnym serwerze sieciowym. Im przy użyciu is_dir(), aby sprawdzić, czy jest to katalog, który można odczytać.Ścieżka dostępu do sieci php pod Windows

W Eksploratorze Windows wpisuję \\\server\dir i wyświetla się katalog. Gdy mapuję dysk sieciowy, można uzyskać do niego dostęp również z z:\dir.

W PHP Mam ten skrypt:

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

Dla $dir ja próbowałem:

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

i

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

Ale nigdy nie uzyskać sukces? Każdy pomysł? thx

Odpowiedz

9

Rozwiązałem go zmieniając kilka rzeczy w rejestrze serwera jak wyjaśniono w ostatniej odpowiedzi w tej dyskusji:

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

Dzięki VolkerK i Gumbo tak! Uwielbiam stackoverflow i ich wspaniałych ludzi, którzy pomagają wam tak niesamowicie szybko !!

EDIT (zaczerpnięte z php.net):

Usługa ma ograniczony dostęp do zasobów sieciowych, takich jak akcje i rur, ponieważ nie ma poświadczeń i musi łączyć się przy użyciu NULL sesji. Następujący klucz rejestru zawiera NullSessionPipes i NullSessionShares wartości, które są używane do określenia rur i akcje, które mogą łączyć sesje zerowe: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters Alternatywnie, można dodać wartość REG_DWORD RestrictNullSessAccess do przycisku i ustawić ją na 0, aby umożliwić wszystkim zerowe sesje dostęp do wszystkich rur i udziały utworzone w tym machine.`

dodać RestrictNullSessAccess = 0 do registery.

+1

Dotyczy to systemu Windows Server 2003. W przypadku systemu Windows XP upewnij się, że ustawienia Zasady zabezpieczeń lokalnych "Dostęp sieciowy: Pozwól wszystkim użytkownikom na anonimowych użytkowników" są ustawione na Włączone. – Max

+3

Jakie byłyby niektóre z tych rzeczy? Link do php.net nie był bardzo pomocny. Czy możesz tutaj skonsolidować swoje rozwiązanie? – Wes

+1

@Wed edytować odpowiedź. Nadzieja, która pomaga. – Max

3

Spróbuj schemat file: URI:

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

miejsce rozpoczęcie jest zawsze file://. Następny segment ścieżki to serwer. Jeśli znajduje się na komputerze lokalnym, pozostaw to pole puste (patrz drugi przykład). Zobacz także File URIs in Windows.

+0

dzięki za odpowiedź ur, gumbo! Niestety oba rozwiązania nie działają. is_dir() alsways zwraca wartość false. PS: w lokalnym katalogu (na przykład c:/dir) zwraca true! – Max

+0

Czy wypróbowałeś tę ścieżkę w Eksploratorze Windows? To też powinno tam działać. – Gumbo

7

Prawdopodobnie pozwoliłeś xampp zainstalować apache jako usługę i uruchomić skrypty php przez ten apache. Usługa Apache (działająca pod numerem localsystem) nie ma dostępu do sieci w taki sam sposób, jak konto użytkownika.

Usługa działająca w kontekście konta LocalSystem dziedziczy kontekst zabezpieczeń SCM. Identyfikator SID użytkownika jest tworzony z wartości SECURITY_LOCAL_SYSTEM_RID. Konto nie jest powiązane z żadnym zalogowanym kontem użytkownika.
ten ma kilka implikacji:
...
      * Usługa przedstawia poświadczenia komputera do zdalnych serwerów.
...

Można to sprawdzić poprzez uruchomienie Apache jako aplikacji konsoli (apache_start.bat w katalogu xampp powinien zrobić) i ponownie uruchomić skrypt. Możesz użyć zarówno ukośników naprzód jak i wstecz w ścieżce unc. Sugeruję użycie // serwera/udziału, ponieważ php nie dba o/w literałach ciągów znaków.

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