webentwicklung-frage-antwort-db.com.de

Erteilen von Schreibberechtigungen für einen UNC-Netzwerkordner für ASP.NET unter IIS 7.5 und Windows Server 2008 R2

BLUF

Unsere Anwendung versucht, mithilfe eines ASP.NET-Webdiensts unter .NET 4.5, IIS 7.5 und Windows Server 2008 R2 eine Datei in einen UNC-Ordner zu schreiben. Jeder Versuch, die Datei an den gewünschten Speicherort zu schreiben, führt jedoch zu einer Ausnahme, bei der der Zugriff verweigert wird.

Die Aufgabe scheint einfach zu sein, aber ich und mein Team haben dies schon eine Weile behoben, und wir sind ratlos darüber, was den Fehler verursachen könnte. Nachfolgend finden Sie Details zu unserem Setup und den bisher erprobten und gefundenen Funktionen. Die Namen wurden geändert, um die Unschuldigen zu schützen.

Umgebungs-Setup

Der Webserver mywebserver hat eine Website mit dem Namen My.Site.Com und einen entsprechenden Anwendungspool mit dem Namen My.Site.Com. Der Anwendungspool ist wie folgt konfiguriert.

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

Der UNC-Pfad, in den wir schreiben möchten, lautet \ myotherserver\mydirectories\output ​​wobei mydirectories die tatsächliche Freigabe ist. Auf dieser Freigabe wurde einer Domänengruppe mit dem Namen mygroup-www die volle Berechtigung für die Freigabe und alle Unterordner erteilt. Das Computerkonto (d. H. Mywebserver) ist ein Mitglied dieser mygroup-www-Gruppe.

HINWEIS: Momentan befindet sich dieser UNC-Pfad tatsächlich auf demselben Computer, mywebserver. Dies wird jedoch irgendwann auf eine andere Maschine als mywebserver in unserer Testumgebung und in der Produktionsumgebung verschoben, wenn diese bereit ist. Derzeit habe ich nur die Testumgebung, mit der ich Probleme beheben kann.

Der Fehler kann durch Ausführen des folgenden Codes repliziert werden.

[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;
    }
}

Fehlerbehebung

Fehlgeschlagene Versuche

Wir haben verschiedene Kombinationen von Gruppen-/Benutzerberechtigungen für die Ordner ausprobiert (siehe unten). Bei diesen Tests wurde auch Process Monitor ausgeführt. Für jede Konfiguration haben wir das gleiche Ergebnis gesehen. Der Prozess w3wp.exe hat versucht, die Datei am gewünschten Speicherort zu erstellen, hat jedoch das Ergebnis ZUGRIFF VERWEIGERT gemeldet. Der Benutzer jeder Konfiguration war IIS APPPOOL\My.Site.Com wie erwartet.

  1. Erteilen von meineDomäne\meineMaschine $ vollständigen Berechtigungen für \ meinServer\meineVerzeichnisse
  2. Erteilen von meineDomäne\meineMaschine $ vollständigen Berechtigungen für \ meinServer\meineVerzeichnisse\Ausgabe

HINWEIS: Ich habe auch versucht, den Code so zu ändern, dass read eine einfache Datei aus \ myotherserver\mydirectories\output. Beim Versuch, read die Datei zu lesen, schlägt der Prozess mit der Meldung ACCESS DENIED fehl, wie dies beim Schreiben der Datei der Fall war.

Erfolgreiche Versuche

Wir haben auch verschiedene Konfigurationen ausprobiert, die funktionierten.

Erteilen Sie die lokalen Berechtigungen IIS APPPOOL\My.Site.Com

Die erste Konfiguration bestand darin, IIS APPPOOL\My.Site.Com die vollständigen Berechtigungen für \ myotherserver\mydirectories zu erteilen. Die Datei wurde erfolgreich geschrieben, der Benutzer des Prozesses war jedoch völlig unerwartet Ein Domänenkonto, das für eine Webanwendung auf demselben Computer auf einer anderen Website eingerichtet wurde. Dies ist nach wie vor sehr verwirrend, hat jedoch funktioniert, da das "andere" Konto auch über Schreibberechtigungen für die Freigabe verfügt.

Dies funktioniert in der Produktion nicht, da wir keine lokalen Konten verwenden können, um Zugriff auf Netzwerkressourcen zu gewähren, aber es handelt sich dennoch um einen interessanten Datenpunkt.

Ändern Sie die App-Pool-Identität in Domänenbenutzer

Die zweite Konfiguration, die funktionierte, war die Änderung der Identität des My.Site.Com-Anwendungspools in ein Domänenkonto, das die vollen Berechtigungen für \ myotherserver\mydirectories hatte. Dies war ein "Vanilla" -Domänenkonto, das von uns manuell erstellt wurde. Wir haben nicht erfasst, was der Benutzer des Prozesses war, aber das könnte ein weiterer nützlicher Datenpunkt sein.

Diese Option ist möglicherweise möglich, weicht jedoch von den Best Practices für IIS 7.5 ab und ist in unserer Produktionsumgebung aufgrund recht strenger IT-Richtlinien möglicherweise nicht zulässig.

Führen Sie die Site auf meinem Entwicklungscomputer aus

Der dritte Test bestand darin, die Site lokal auf meinem Entwicklungscomputer auszuführen, mydevmachine. Meine lokale IIS Konfiguration ist identisch mit mywebserver mit der Ausnahme, dass ich Windows 7 anstelle von Windows Server 2008 verwende. Ich habe die vollständigen Berechtigungen für meineDomäne\meineDevMaschine erteilt = zu \ myotherserver\mydirectories und führte die Anwendung aus. Die Datei wurde erfolgreich geschrieben. Laut Process Monitor wurde der Benutzer für den Prozess korrekt auf IIS APPPOOL\My.Site.Com eingestellt.

Fazit

Wir möchten den Schreibzugriff wie vorgesehen mit dem Computerkonto von mywebserver aktivieren. Wir haben gelesen: ApplicationPoolIdentity-Benutzer kann keine Dateien im freigegebenen Ordner in Windows Server 2008 ändern und Berechtigungen für den freigegebenen Ordner für IIS 7 Anwendungspoolidentität in der gesamten Domäne und - Anwendungspoolidentitäten .

Nach diesen Informationen können wir sollte das Computerkonto verwenden, um Lese- und Schreibzugriff auf Netzwerkressourcen wie den UNC-Pfad zu gewähren. Tatsächlich kann ich dies auf die gewünschte Weise tun, wenn ich die Website von meinem Entwicklungscomputer aus starte.

Es gibt ein paar Gedanken, die mir einfallen. Möglicherweise stimmt etwas mit dem Computerkonto des Test-Webservers nicht. Oder vielleicht stört diese "andere" Software den Prozess irgendwie.

Irgendwelche Gedanken darüber, was dieses Problem verursachen könnte? Was sollten wir sonst noch tun, um Fehler zu beheben?

28
Ryan Taylor
  1. Starten Sie Ihren 'mywebserver' neu.

  2. Bewundern Sie die jetzt mysteriös funktionierende ApplicationPoolIdentity.

  3. Installieren Sie MS HotFix KB2545850 , und erfahren Sie die Details zu diesem Fehler in KB2672809 . Dort werden auch die Schritte zum Reproduzieren gezeigt und dieses anscheinend zufällige Problem veranschaulicht. Direkter Download-Link hier .

  4. Spekulieren Sie, warum Microsoft es in den 3 Jahren seit der Veröffentlichung dieses Hotfixes nicht geschafft hat, ein normales Windows-Update zu veröffentlichen. Während die Leute immer noch weiter rennen und sich wegen dieses dunklen Problems die Haare ausreißen.

  5. Erfahren Sie mehr über die anderen Leute, die dieses Geschenk von MS geteilt und genossen haben, das immer noch weitergibt:

Ihr Windows 7-Entwicklercomputer hat wahrscheinlich gut funktioniert, da er öfter als der Server neu startet. Herzlichen Glückwunsch zu Ihrem sehr gut geschriebenen und ausführlichen Fehlerbericht. Ich sehe das selten hier.

20
Amit Naidu

Ich hatte ein ähnliches Problem beim Zugriff auf eine Netzwerkfreigabe mithilfe von AppPoolIdentity in einer ASP.NET-Anwendung (Zugriff verweigert). Mit einem NetworkService-Konto oder einem anderen Domänenkonto funktionierte das, aber dies war nicht die beste Lösung habe aber endlich etwas gefunden, das funktionierte.

Ich habe herausgefunden, dass das Netzwerkdienstkonto nicht beim Zugriff auf die Freigaben verwendet wurde, genau wie Sie es getan haben (ich erwartete das Konto "domain\machine $").

Dies funktionierte für uns: Gehen Sie auf Ihrer IIS Website zur Authentifizierung und ändern Sie das Element Anonyme Authentifizierung in "Anwendungspoolidentität". Standardmäßig ist "IUSR" eingestellt. Das hat unser Problem gelöst.

Möglicherweise kann auch das Aktivieren von ASP.NET-Identitätswechseln (noch im Authentifizierungsmenü) hilfreich sein.

Thibault

2

Ich bin mit demselben Problem konfrontiert, das ich durch Erstellen eines Domänenkontos für jede Umgebung (QA, STAGE, PRODUCTION) gelöst habe. In der Anwendungspoolidentität habe ich ein benutzerdefiniertes Konto festgelegt und den Domänenbenutzer für das jeweilige Konto verwendet. Jetzt habe ich die Möglichkeit, Dateien aus UNC Path zu schreiben und zu lesen.