2012-04-17 11 views
20

Mam linię kodu sprawdzającą, czy istnieje katalog, a następnie pobierając listę plików w nim.Directory.Exists nie działa dla ścieżki sieciowej

System.IO.Directory.Exists(@"\\Server\Folder\"); 

Pracuję, gdy go testuję (uruchamiam z visual studio), ale kiedy wdrażam stronę internetową, zawsze zwraca ona wartość false.

Wykonuję tę samą weryfikację dla innego folderu, na innym serwerze (powiedzmy Server2) i działa dobrze.

Wtedy pomyślałem, że to problem z dostępem, ale udostępniony folder i sieć mają dostęp do wszystkich ... Czy jest jeszcze jeden powód, dla którego to nie zadziała?

+6

Czy konto, które działa pod IIS mieć dostęp? – Matthew

+0

Czy nie można odwołać się do 'Server'? – David

Odpowiedz

15

Po uruchomieniu kodu w Visual Studio działa on pod uprawnieniami użytkownika.

Po uruchomieniu kodu w IIS uruchamia się w tożsamości Puli aplikacji, która domyślnie jest wbudowanym użytkownikiem "Usługa sieciowa", jest to lokalne konto użytkownika, które nie ma dostępu poza lokalnym komputerem.

Prawa do udziału sieciowego są pierwszą warstwą, po której sprawdzane są prawa NTFS do katalogu.

Należy zmienić tożsamość puli aplikacji na użytkownika domeny z tymi samymi uprawnieniami, co użytkownik.

+1

To działało również na mój lokalny IIS dla testów, ale ustawienie było dla użytkownika aplikacji, więc to zabierało lokalnemu użytkownikowi systemu Windows połączenie z siecią. Ustawiłem mojego konkretnego użytkownika na IIS oficjalnego serwera i zadziałało. Dzięki. – Amaranth

3

Może trochę się spóźniłem, ale odkryłem, że jest problem z tą metodą klasy Directory. Zamiast Użyłem DirectoryInfo z podszywania się w ten sposób:

new DirectoryInfo(path).Exists 

W ten sposób można uniknąć cały problem zmiany tożsamości, który został zabroniony przez naszego obszaru IT.

Mam nadzieję, że to pomoże komuś!

+0

Nie rozwiązuje to problemu podszywania się pod inne osoby. Główną różnicą jest to, że 'Directory' jest klasą statyczną, a' DirectoryInfo' jest instancją klasy. –

1

Dla przyszłych odniesień, to działa również:

bool result = false; 
try 
{ 
    Directory.GetAccessControl(path); 
    result = true; 
} 
catch (UnauthorizedAccessException) 
{ 
    result = true; 
} 
catch 
{ 
    result = false; 
} 
Powiązane problemy