Accorder des permissions d'écriture à un dossier UNC en réseau pour ASP.NET sous IIS 7.5 et Windows Server 2008 R2

BLUF

notre application tente d'écrire un fichier dans un dossier UNC en utilisant un ASP.NET service web fonctionnant sous .NET 4.5, IIS 7.5, et Windows Server 2008 R2. Cependant, toute tentative d'écrire le fichier à l'emplacement souhaité résultats dans un accès refusé d'exception.

la tâche semble simple cependant moi et mon équipe ont été dépannage ce depuis un moment maintenant et nous sommes stumped quant à ce qui peut être à l'origine de l'erreur. Ci-dessous sont les détails de notre installation et de ce que nous avons essayé et trouvé à ce jour. Les noms ont été changés pour protéger les innocents.

Environnement Setup

le serveur web, mywebserver , a un site Web nommé My.Site.Com avec un pool d'applications correspondant nommé My.Site.Com . Le pool d'applications est configuré comme suit:

 .NET Framework Version     : v4.0
 Enable 32-bit Applications : False
 Managed Pipeline Mode      : Integrated
 Name                       : My.Site.Com
 Identity                   : ApplicationPoolIdentity
 Load User Profile          : False

Le chemin d'accès UNC nous sommes tente d'écrire est myotherservermydirectoriessortie mydirectories est bien le partager. Sur cette part, un groupe de domaines nommé mygroup-www a reçu les permissions complètes pour la part et tous les sous-dossiers. Le compte machine (i.e., mywebserver) est un membre de ce groupe myGroup-www.

NOTE: pour le moment, ce chemin UNC vit réellement sur le même machine, mywebserver. Cependant, ce sera éventuellement déplacé vers une machine autre que mywebserver dans notre environnement d'essai et de production lorsque qu'il est prêt. Actuellement, je n'ai qu'un seul environnement de test à résoudre.

l'erreur peut être répliquée en exécutant le code suivant.

[WebMethod]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]
public string ExportReport(int reportId)
{
    try
    {
        string output = ConfigHelper.OutputPath + "test.html"; // UNC path
        string url = ConfigHelper.VirtualPath + "test.html";
        string[] lines = { "Hello", "World!" };
        File.WriteAllLines(output, lines);                     // Access Denied!
        return url;
    }
    catch (System.Exception ex)
    {
        Logger.ErrorException("Error exporting report", ex);
        throw;
    }
}

dépannage

L'Échec Des Tentatives

nous avons essayé divers combinaisons de permissions groupe/utilisateur sur les dossiers (listées ci-dessous). Lors de l'exécution de ces tests, nous avons également exécuté Process Monitor. Pour chaque configuration, nous avons vu le même résultat. Le w3wp.exe process a tenté de créer le fichier à l'endroit voulu mais a rapporté un résultat de Accès refusé . L'utilisateur de chaque configuration était IIS APPPOOLMy.Site.Com comme prévu.

  1. octroi mydomainmymachine$ toutes les autorisations nécessaires pour myotherservermydirectories
  2. Octroi mydomainmamachine$ toutes les autorisations nécessaires pour myotherservermydirectoriessortie

NOTE: j'ai aussi essayé de modifier le code pour qu'il se lise a simple fichier de myotherservermydirectoriessortie . Lorsque en essayant de lire le dossier, le processus échoue avec un accès refusé message comme il l'a fait lors de l'écriture du fichier.

Tentatives Réussies

nous avons également essayé plusieurs configurations qui ont fonctionné.

Grant the local IIS APPPOOLMy.Site.Com autorisations

la première configuration à travailler était d'accorder le IIS APPPOOLMy.Site.Com les permissions complètes à myotherservermydirectories le fichier a été écrit avec succès mais l'utilisateur du processus était tout à fait inattendu un compte de domaine qui a été mis en place pour une application web sur la même machine dans un autre site web. Cela reste très déroutant mais a fonctionné car le compte 'other' a aussi des permissions d'écriture sur le partage.

cela ne fonctionnera pas dans la production car nous ne pouvons pas utiliser les comptes locaux pour accorder l'accès aux ressources en réseau mais est un point de données intéressant néanmoins.

Changer l'Application Identité du Pool d'Utilisateur de Domaine

La deuxième configuration qui a travaillé à modifier la My.Site.Com application de la piscine, d'identifier de compte de domaine qui ont eu plein les autorisations pour myotherservermydirectories . Il s'agissait d'un compte de domaine "vanille" qui a été créé manuellement par nous. Nous n'avons pas saisi ce qu'était l'utilisateur du processus, mais cela pourrait être une autre donnée utile. point.

cette option peut être possible, mais elle s'écarte des meilleures pratiques avec IIS 7.5 et peut ne pas être autorisée dans notre environnement de production en raison de politiques informatiques assez strictes.

exécuter le Site sur ma machine de développement

le troisième test consistait à faire tourner le site localement sur ma machine de développement, mydevmachine . Ma configuration IIS locale est identique à mywebserver sauf que J'exécute Windows 7 au lieu de Windows Server 2008. J'ai accordé des permissions complètes pour mydomainmydevmachine au myotherservermydirectories et j'ai lancé l'application. Le dossier a été rédigé avec succès. Selon Process Monitor l'utilisateur pour le processus a été correctement réglé à IIS APPPOOLMy.Site.Com .

Conclusion

Nous aimerions activez l'accès en écriture tel que Conçu en utilisant le compte machine de mywebserver . Nous avons lu ApplicationPoolIdentity utilisateur ne peut pas modifier les fichiers dans le dossier partagé dans Windows Server 2008 et Permissions pour le dossier partagé pour IIS 7 Application Pool Identity à travers le domaine et Application Pool Identities .

selon ces informations nous devrait être en mesure d'utiliser le compte machine pour accorder l'accès en lecture et en écriture aux ressources en réseau telles que le chemin UNC. En fait, je peux le faire de la manière souhaitée lors de l'exécution du site web à partir de ma machine de développement.

il y a quelques pensées qui viennent à l'esprit. Peut-être qu'il y a quelque chose qui ne va pas avec le compte machine du serveur web de test. Ou peut-être que cet "autre" logiciel interfère avec le processus d'une façon ou d'une autre.

toutes les pensées quant à qu'est-ce qui peut causer ce problème? Que faire d'autre pour résoudre les problèmes?

28
demandé sur Community 2014-03-07 06:43:07

3 réponses

  1. redémarrez votre 'mywebserver'.

  2. S'émerveillent de la mystérieuse identité D'application.

  3. installez MS HotFix KB2545850 et apprenez les détails de ce bogue dans KB2672809 qui montre également les étapes pour reproduire et démontrer ce problème apparemment aléatoire. Lien de téléchargement Direct ici .

  4. spéculer pourquoi Microsoft n'a pas réussi à publier une mise à jour normale de windows pour cela dans les 3 années depuis que ce hotfix a été publié. Pendant que les gens continuent à courir dans elle et tirant leurs cheveux hors à cause de ce problème obscur.

  5. en savoir plus sur les autres gens qui ont partagé et apprécié ce don de la SP qui continue encore à donner:

votre machine Windows 7 dev a probablement bien fonctionné parce qu'elle redémarre plus souvent que le serveur. Félicitations pour votre très bien écrit et complet bug rapport. Je le vois rarement ici.

20
répondu Amit Naidu 2017-05-23 11:47:07

j'ai eu un problème similaire accéder à une part de réseau en utilisant Apppoolentity dans un ASP.NET demande (Accès refusé). L'utilisation D'un compte NetworkService ou d'un autre compte de domaine a fonctionné, mais ce n'était pas la meilleure solution. J'ai fait presque tous les tests que tu as fait mais j'ai finalement trouvé quelque chose qui a marché.

j'ai compris que le compte de service réseau n'a pas été utilisé lors de l'accès aux actions, tout comme vous l'avez fait (je m'attendais à Domaine\machine$ account)

Cela a fonctionné pour nous: Sur votre site Web IIS, allez à authentification et changez L'élément D'authentification anonyme en "Application Pool Identity". Il est par défaut défini à"IUSR". Cela a résolu notre problème.

peut-être aussi activé ASP.NET l'usurpation d'identité (toujours dans le menu authentification) peut aider.

Thibault

2
répondu Thibault Deflers 2014-10-17 14:56:22

j'ai fait face au même problème, j'ai résolu en créant un compte de domaine pour chaque environnement (QA, étape, PRODUCTION). Dans Application pool identity j'ai défini le compte personnalisé et j'ai utilisé l'utilisateur de domaine pour le compte respectif. Maintenant, il me donne la capacité d'écrire et de lire les fichiers à partir de UNC Path.

0
répondu Srinivasu Velagapudi 2015-10-21 17:22:36