web-dev-qa-db-fra.com

Directory.Exists ne fonctionne pas pour un chemin d'accès réseau

J'ai une ligne de code vérifiant si un répertoire existe et puis obtenir la liste des fichiers qu'il contient.

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

Je travaille lorsque je le teste (depuis Visual Studio), mais lorsque je déploie le site Web, il renvoie toujours la valeur false.

Je fais la même vérification pour un autre dossier, sur un autre serveur (disons Server2) et cela fonctionne bien.

J'ai alors pensé que c'était un problème d'accès, mais le dossier partagé et le réseau ont tous accès à tout le monde ... Y a-t-il une autre raison pour laquelle cela ne fonctionnerait pas?

23
Amaranth

Lorsque vous exécutez le code dans Visual Studio, il s'exécute sous les droits de votre utilisateur.

Lorsque vous exécutez le code dans IIS, il s'exécute sous l'identité du pool d'applications qui est par défaut l'utilisateur intégré "Service réseau". Il s'agit d'un compte d'utilisateur local qui n'a pas accès en dehors de la machine locale.

Les droits sur le partage réseau constituent la première couche, après quoi les droits NTFS sur le répertoire sont vérifiés.

Vous devez modifier l'identité du pool d'applications en un utilisateur de domaine disposant des mêmes droits que votre utilisateur.

20
Shiraz Bhaiji

Je suis peut-être un peu en retard, mais j’ai constaté qu’il y avait un problème avec cette méthode de la classe Directory ..__ Au lieu de cela, j’ai utilisé DirectoryInfo avec emprunt d’emprunt d'identité de cette façon:

new DirectoryInfo(path).Exists

De cette façon, vous évitez tout le problème de changement d'identité, ce que notre secteur informatique a nié.

J'espère que cela aide quelqu'un!

3
Gonza Oviedo

Pour les références futures, cela fonctionne également:

bool result = false;
try
{
    Directory.GetAccessControl(path);
    result = true;
}
catch (UnauthorizedAccessException)
{
    result = true;
}
catch
{
    result = false;
}
1

Je recevais cette erreur avec le code UNC qui ressemblait à ceci:

@ "\ Server01\c $\Data\SubFolder"

J'ai fait un partage explicite et me suis débarrassé du c$ et lui ai donné l'aspect suivant:

@ "\ Server01\TheData\SubFolder"

et cela a commencé à fonctionner.

Je ne suis pas sûr à 100% que c'est ce qui a résolu le problème des autorisations, mais cela a commencé à fonctionner immédiatement après avoir apporté cette modification.

0
Michael Potter