Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel bietet eine Lösung für unerwartete Fehler, die auftreten, wenn Sie von einer Anwendung aus auf einen freigegebenen Ordner zugreifen.
Ursprüngliche KB-Nummer: 2990989
Symptome
Betrachten Sie das folgende Szenario:
- Sie erstellen einen freigegebenen Ordner in Windows Server 2008 R2 und erteilen dann Benutzer A Leseberechtigung für den Ordner.
- Sie erstellen einen Unterordner im freigegebenen Ordner, deaktivieren die vererbbaren Berechtigungen vom übergeordneten Ordner des Unterordners und gewähren Benutzer A keine Leseberechtigung für den Unterordner.
- Sie melden sich bei einem Windows Server 2012-basierten Server als Benutzer A an und führen dann eine Anwendung aus, die FindFirstFile für den freigegebenen Ordner aufruft.
In diesem Szenario schlägt die Anwendung fehl. Darüber hinaus wird der Fehler ERROR_ACCESS_DENIED nicht wie erwartet zurückgegeben. Stattdessen wird eine der folgenden Fehlercodes zurückgegeben:
Unerwarteter Netzwerkfehler. (ERROR_UNEXP_NET_ERR – Unerwarteter Netzwerkfehler)
Der Parameter ist falsch. (ERROR_INVALID_PARAMETER) (Ungültiger Parameter)
Wenn die anwendung, die Sie ausführen, davon ausgeht, dass ERROR_ACCESS_DENIED in dieser Situation zurückgegeben wird, um zu signalisieren, dass sie nicht über das entsprechende Zugriffsrecht verfügt, ist es möglich, dass diese Annahme falsch ist.
Ursache
Dieses Problem tritt auf, da eine SMB-Komponente im Kernelmodus STATUS_UNEXPECTED_NETWORK_ERROR in einer Situation zurückgibt, in der eine Ein-/Ausgabe mit STATUS_ERROR_ACCESS_DENIED fehlschlagen sollte. Gleichzeitig fordert die SMB-Komponente in einem anderen Thread E/A an. Dieser Thread kann STATUS_INVALID_PARAMETER zurückgeben.
Diese NT-Status, die die SMB-Komponente zurückgibt, werden in einen der folgenden Win32-Fehler übersetzt, wenn die NT-Status an die Datei- oder Ordner-APIs übergeben werden:
- FEHLER_UNERWARTETER_NETZWERKFEHLER
- FEHLER_UNGÜLTIGER_PARAMETER
Beschluss
Wenn eine Anwendung davon ausgeht, dass ERROR_ACCESS_DENIED in dieser Situation zurückgegeben wird, um festzustellen, ob sie über das entsprechende Zugriffsrecht verfügt und ERROR_UNEXP_NET_ERR oder ERROR_INVALID_PARAMETER erhält, wenn sie auf den Unterordner des freigegebenen Ordners ohne Zugriffsrecht zugreift, kann es dieses Problem vermeiden, indem es dieselbe Verarbeitung ausführt wie beim Erhalt ERROR_ACCESS_DENIED.
Weitere Informationen
Wenn der Unterordner geöffnet wird, werden im Clientumleiter von Windows Server 2012 zwei SMB-Pakete gesendet. Ein Paket ist ein "create"-Paket, und das andere ist ein "Abfrageverzeichnis"-Paket. Das Erstellungspaket öffnet das Verzeichnis, und das Abfrageverzeichnispaket ermöglicht es dem Umleitungsmodul, Informationen zum Unterordner zu ermitteln, damit er den Unterordner ordnungsgemäß verarbeiten kann. Das Erstellen eines Pakets schlägt mit STATUS_ACCESS_DENIED fehl. Danach schlägt das Abfrageverzeichnispaket aber auch mit STATUS_UNEXPECTED_NETWORK_ERROR fehl. Daher gibt es zwei Fehlercodes. Da die Abfrageverzeichnisaktion nach dem Erstellen aufgetreten ist, wird der Fehlercode des Abfrageverzeichnisses zurückgegeben.
Selbst wenn der Entwurf von Windows so geändert wurde, dass ERROR_ACCESS_DENIED zurückgegeben werden konnte, kann die Anwendung, die auf eine Netzwerkfreigabe zugreift, weiterhin ERROR_UNEXP_NET_ERR erhalten, da ein tatsächlicher Netzwerkfehler auftreten kann, z. B. ein Serverabsturz, ein Netzwerkstromverlust usw.
Beachten Sie außerdem, dass es einen Unterschied zwischen der Ein-/Ausgabe zu lokalen Laufwerken und der Ein-/Ausgabe zu Netzwerkdateifreigaben gibt. Obwohl die von der Anwendung verwendeten APIs (CreateFile, ReadFile, FindFirstFile usw.) identisch sind, ist das Speichersystem, das die Arbeit ausführt, unterschiedlich. Wenn eine Anwendung auf eine lokale Datei zugreift, erstellt die API ein IRP und sendet diese an den Dateisystemtreiber (NTFS.SYS), und die E/A-Anforderung wird schließlich an die Datenträgertreiber gesendet. Wenn eine Anwendung auf eine Netzwerkfreigabe zugreift, ruft die API ein Client-/Server-Netzwerkprotokoll auf. Die API sendet die Anforderung an den Clientumleiter, und dann erstellt der Clientumleiter ein SMB-Paket und sendet das SMB-Paket an den Server. Der Serverdienst empfängt das Paket und führt dann den E/A-Vorgang aus. Nachdem der E/A-Vorgang abgeschlossen ist, sendet der Dienst des Servers ein Antwort-SMB-Paket an die Clientumleitung, und die Clientumleitung gibt an die Anwendung zurück.
Aufgrund dieser Unterschiede kann die API verschiedene Arten von Fehlern zurückgeben. Bei lokalen Dateien gibt die API keine Netzwerkfehler zurück. Bei netzwerkverbundenen Dateien kann die API Dateizugriffsfehler wie ERROR_ACCESS_DENIED und Netzwerkfehler wie ERROR_UNEXP_NET_ERR zurückgeben, da in einem Netzwerk beide Fehlertypen auftreten können. Dieses Verhalten ist beabsichtigt und wird an den folgenden beiden Speicherorten in der Microsoft Developer Network (MSDN) Library dokumentiert: