"ERROR_ACCESS_DENIED" Fehler beim Schreiben in eine Datei, die in einem freigegebenen Netzwerkordner


Wichtig Dieser Artikel enthält Informationen zum Bearbeiten der Registrierung. Bevor Sie die Registrierung ändern, müssen Sie sie sichern und sicherstellen, dass Sie wissen, wie die Registrierung wiederhergestellt werden kann, falls ein Problem auftritt. Informationen zum Sichern, wiederherstellen und Bearbeiten der Registrierung finden Sie im folgenden Artikel der Microsoft Knowledge Base:
256986 Beschreibung der Microsoft Windows-Registrierung

Problembeschreibung


Ein Aufruf der WriteFile -Funktion fehlschlagen. Dieses Symptom tritt auf, wenn Folgendes zutrifft:
  • Sie verwenden einen Clientcomputer, auf der Microsoft Windows XP Service Pack 1 (SP1) ausgeführt wird.
  • Mithilfe die Funktion WriteFile in eine Datei schreiben, die in einem freigegebenen Netzwerkordner.
  • Der freigegebene Ordner ist auf einem Server, auf dem Microsoft Windows 2000 oder Microsoft Windows Server 2003 ausgeführt wird.
Darüber hinaus erhalten Sie folgende Fehlermeldung:
ERROR_ACCESS_DENIED

Ursache


Dieses Problem tritt auf, wenn Folgendes zutrifft:
  • Wenn Sie die Funktion CreateFile zum Erstellen der Datei verwendet, die GENERIC_WRITE-Konstante DwDesiredAccess -Parameter angegebenen.
  • Server Message Block (SMB) Signieren ist für die Kommunikation zwischen dem Client und dem Server-Computer aktiviert.

PROBLEMUMGEHUNG


Um dieses Problem zu umgehen, verwenden Sie eine der folgenden Methoden:
  • Konstante GENERIC_READ und Konstante GENERIC_WRITE DwDesiredAccess Parameter angeben.
  • Ändern Sie die SMB-Signierung.

Geben Sie die Konstante GENERIC_READ und GENERIC_WRITE-Konstante DwDesiredAccess-Parameter

Verwenden Sie den folgenden Code zum Erstellen der Datei.

Hinweis Ersetzen Sie die folgenden Platzhalter:
  • Ersetzen Sie den Platzhalter ServerName mit dem Namen eines Servercomputers, auf dem Windows 2000 oder Windows Server 2003 ausgeführt wird.
  • Ersetzen Sie den Platzhalter Ordnername mit dem Namen der freigegebenen Netzwerkordner auf dem Servercomputer.
// Specify the GENERIC_READ constant and the GENERIC_WRITE constant
// in the dwDesiredAccess parameter when you create the file.
hFile = CreateFile("\\\\ServerName\\FolderName\\Test.txt", GENERIC_READ |
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

SMB-Signaturen ändern

Warnung Bei falscher Verwendung des Registrierungseditors können schwerwiegende Probleme verursacht werden, die möglicherweise eine Neuinstallation des Betriebssystems erforderlich machen. Microsoft kann nicht garantieren, dass Sie Probleme beheben können, die durch eine nicht korrekte Nutzung des Registrierungs-Editor verursacht werden können. Verwenden Sie den Registrierungs-Editor auf eigene Gefahr.
Gehen Sie auf dem Server und auf dem Clientcomputer folgendermaßen vor:
  1. Suchen Sie im Registrierungseditor und klicken Sie auf den folgenden Registrierungsunterschlüssel:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lanmanserver\Parameters
  2. Im rechten Bereich des Registrierungseditors mit der rechten Maustaste
    Requiresecuritysignature Namen Feld und dann auf Ändern. Das Dialogfeld DWORD-Wert bearbeitenwird angezeigt.
  3. Geben Sie im Feld Wert
    0, und klicken Sie dann auf OK.
  4. Registry Editor beenden, und starten Sie den Computer neu.

Weitere Informationen


Schritte zum Reproduzieren des Verhaltens

  1. Verwenden Sie auf einem Computer mit Windows XP SP1, Microsoft Visual C++ 6.0, erstellen Sie eine einfache Win32-Konsolenanwendungsprojekt mit dem Namen Test. Standardmäßig wird die Datei Bezeichnung erstellt.
  2. Erstellen Sie eine Datei die GENERIC_WRITE-Konstante im DwDesiredAccess -Parameter angeben, wenn Sie CreateFile -Funktion verwenden.
  3. Verwenden der
    WriteFile -Funktion, die in die Datei schreiben. Ersetzen Sie dazu den vorhandenen Code in der Datei der Bezeichnung mit dem folgenden Code.

    Hinweis Ersetzen Sie die folgenden Platzhalter:
    • Ersetzen Sie den Platzhalter ServerName mit dem Namen eines Servercomputers, auf dem Windows 2000 oder Windows Server 2003 ausgeführt wird.
    • Ersetzen Sie den Platzhalter Ordnername mit dem Namen der freigegebenen Netzwerkordner auf dem Servercomputer.
    :
    #include "stdafx.h"
    #include "windows.h"
    #include "stdio.h"
    #include "conio.h"

    void main()
    {
    HANDLE hFile;
    char lpBuffer[99999];
    DWORD lpNumberOfBytesWritten;

    // Write data to the buffer that you will
    // you use to write data to the file.
    for (int i = 0; i < 100000; ++i)
    lpBuffer[i] = 'a';

    // Specify only the GENERIC_WRITE constant in the
    // dwDesiredAccess parameter when you create the file.
    hFile = CreateFile("\\\\ServerName\\FolderName\\Test.txt",
    GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    // Try to write the data in the buffer to the file.
    // If the call to the WriteFile function fails,
    // call the GetLastError function.
    if (!WriteFile(hFile, lpBuffer, 100000, &lpNumberOfBytesWritten, NULL))

    // If an ERROR_ACCESS_DENIED error has occurred, inform the user.
    if (GetLastError() == ERROR_ACCESS_DENIED)
    {
    printf("An ERROR_ACCESS_DENIED error has occurred.");
    printf("Press any key to continue.");
    getch();
    }

    // Close the handle to the file.
    CloseHandle(hFile);
    }
  4. Erstellen Sie und führen Sie die Anwendung. Ein Konsolenfenster wird angezeigt. Tritt das Verhalten, das im Abschnitt "Symptome" erwähnte enthält Fenster der Konsole die folgende Ausgabe:
    ERROR_ACCESS_DENIED Fehler.
    Drücken Sie eine beliebige Taste, um fortzufahren.

Referenzen


Weitere Informationen über die Funktion CreateFile und
WriteFile funktionieren, finden Sie auf folgenden Websites von Microsoft Developer Network (MSDN):