Accès au répertoire virtuel (lecteur mappé) via la page Web c #/asp.net avec IIS7

J'ai donc un serveur A et un serveur B.

Serveur A: Windows Server 2008R2 Serveur B: Windows Server 2003

La page Web utilise framework 4.0, créé avec VS2013 Pro RC

sur le serveur A ma page Web asp.net/c# est en cours d'exécution sur IIS7 sur le serveur B j'ai un dossier partagé.

Maintenant, j'ai mappé ce dossier partagé du serveur B au serveur A, et il est entièrement accessible via l'explorateur Desktop \ Windows, mais l'accès au dossier à partir de la page Web est une histoire différente.

Pour accéder au dossier, ce que j'ai fait dans IIS7 est, créer un dossier virtuel sous la même page Web, et le pointer vers le lecteur mappé.

Cela aurait bien sûr fonctionné si le dossier aurait été sur le même serveur A, mais comme il se trouve sur un serveur B différent, j'obtiens l'erreur suivante.

Impossible de trouver une partie du chemin 'L: \ a \ b \ fichier.pdf' maintenant le chemin est 100% correct, puisque j'ai vérifié.


Voici quelques informations de débogage supplémentaires:

Impossible de trouver une partie du chemin 'L: \ a \ b \ fichier.pdf'.

Description: Une exception non gérée s'est produite lors de l'exécution de la requête Web en cours. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Détails d'exception: System.IO.DirectoryNotFoundException: impossible   trouver une partie du chemin 'L: \ a \ b \ fichier.pdf'.

     

Erreur de source:

     

Une exception non gérée a été générée lors de l'exécution du   demande Web actuelle. Informations concernant l'origine et l'emplacement de   l'exception peut être identifiée en utilisant la trace de pile d'exception ci-dessous.

     

Trace de pile:

     

[DirectoryNotFoundException: Impossible de trouver une partie du chemin   'L: \ a \ b \ fichier.pdf'.] System.IO .__ Error.WinIOError (Code d'erreur Int32,   String maybeFullPath) +216 System.IO.FileStream.Init (Chemin de chaîne,   Mode FileMode, accès FileAccess, droits Int32, Boolean useRights,   Partage FileShare, Int32 bufferSize, Options FileOptions,   SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy,   Boolean useLongPath) +2481 System.IO.FileStream..ctor (Chemin de chaîne,   Mode FileMode, accès FileAccess, partage FileShare, Int32 bufferSize,   Options FileOptions, String msgPath, Boolean bFromProxy) +229
  System.IO.FileStream..ctor (Chemin de chaîne, mode FileMode, FileAccess   accès, partage FileShare) +102
  System.Web.HttpResponse.WriteFile (String filename, Boolean   readIntoMemory) +166 Reloc.Client.Contracts.openLinkClick (Objet   expéditeur, EventArgs e) dans c: \ Users \ x \ Documents \ Visual Studio   2013 \ Projects \ p \ p \ S \ Listdoc.aspx.cs: 230
  System.Web.UI.WebControls.GridView.HandleEvent (EventArgs e, Boolean   causesValidation, String validationGroup) +1192
  System.Web.UI.WebControls.GridViewRow.OnBubbleEvent (source d'objet,   EventArgs e) +164 System.Web.UI.Control.RaiseBubbleEvent (Objet   source, Arguments EventArgs) +52
  System.Web.UI.Page.ProcessRequestMain (Booléen   includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)   +3707


Je crois que cela pourrait avoir quelque chose à voir avec la permission ou liés, ont essayé de nombreuses choses, sans chance. Alors s'il vous plaît aidez-moi ici. Merci d'avance.

11
ajouté édité
Vues: 1

3 Réponses

Comme le suggère wata, chaque utilisateur obtient ses propres lecteurs mappés. Cela signifie que votre lecteur L: n'est pas le même que le lecteur L: de votre compte de pool d'applications.

En outre, sauf si vous avez modifié le compte de votre pool d'applications, il ne pourra pas accéder au dossier partagé sur l'autre serveur. Vous vous connectez probablement aux deux serveurs à l'aide d'un compte de domaine Active Directory. Si tel est le cas, vous souhaiterez probablement créer un nouveau compte de domaine Active Directory à utiliser comme identité pour votre pool d'applications. Vous pourriez modifier l'identité du pool d'applications pour utiliser votre propre compte de domaine à des fins de développement/test, mais ce n'est pas une pratique de sécurité recommandée dans un système de production.

Une fois que vous avez créé le nouveau "compte de service" Active Directory (pour éviter les tracas futurs, assurez-vous que le mot de passe n'expire pas), vous devez modifier l'identité de votre pool d'applications dans IIS. Accédez aux pools d'applications, recherchez le pool d'applications utilisé par votre site, sélectionnez-le et choisissez Paramètres avancés sur la droite, accédez à Identité, puis cliquez sur le bouton ... pour définir le compte personnalisé, en veillant à ajouter le nom d'utilisateur au nom de domaine: mydomain \ myserviceusername.

Vous devez également autoriser l'accès de votre compte de service au partage du serveur B.

Vous devez maintenant créer un lecteur mappé persistant du serveur A vers le serveur B à l'aide de votre compte de service. Voir ceci pour plus de détails, en veillant à configurer un script qui remappe le disque après un redémarrage en utilisant une commande telle que utilisation nette L: \\ ServerB \ sharedfolder/persistent: yes , en s'assurant que cela soit exécuté en tant que compte de service. Vous pourriez même exécuter cette première chose dans Global.asax.cs Application_Start de votre application. Si vous voulez éviter les tracas des étapes de ce paragraphe, utilisez la suggestion de wata d'utiliser le chemin UNC complet au lieu d'utiliser un lecteur mappé.

Now your web app should be able to access the shared folder on Server B. :-)

10
ajouté
Merci pour l'explication détaillée, qui clarifie allot, et je pense que nous l'avons bientôt travailler, en attendant quelques permissions de l'administrateur.
ajouté l'auteur Mana, source

Le problème est que si vous créez un lecteur mappé, il n'est visible que par l'utilisateur qui l'a créé. Le pool d'applications IIS de votre application s'exécutant probablement sous un autre utilisateur, ce lecteur mappé est invisible. (L'exécution de l'application sous un compte d'utilisateur différent est une bonne pratique de sécurité)

Je suggère ce qui suit: au lieu d'utiliser un lecteur mappé pour le répertoire virtuel, essayez d'utiliser un chemin UNC. Par exemple: créez un répertoire virtuel appelé "documents" qui correspond à \\ ServerB \ a \ b. Ensuite, vous devriez pouvoir accéder à votre fichier avec "documents/fichier.pdf". Gardez à l'esprit que l'utilisateur du pool d'applications IIS de l'application doit avoir accès au partage réseau \\ ServerB \ et aux sous-dossiers et fichiers dont vous avez besoin.

5
ajouté
Pour ceux qui ont besoin de trouver l'UNC (Universal Naming Convention) d'un lecteur mappé, tapez net use dans l'invite de commande par stackoverflow.com/questions/21482825/…
ajouté l'auteur Tony L., source

Vérifiez les autorisations du dossier sur le serveur et assurez-vous que le pool d'applications du site y a accès.

2
ajouté
Pouvez-vous me dire comment je peux donner la permission au pool d'applications du site, ou me référer quelque part je peux lire à ce sujet?
ajouté l'auteur Mana, source
Parlez-vous des autorisations sur le dossier partagé? et dois-je changer les autorisations sur le serveur A ou B
ajouté l'auteur Mana, source