Foutbericht 'ERROR_ACCESS_DENIED' treedt op wanneer u probeert te schrijven naar een bestand in een gedeelde netwerkmap


Belangrijk Dit artikel bevat informatie over het wijzigen van het register. Voordat u het register wijzigt, moet u er voor zorgen dat u een back-up heeft gemaakt en zorg ervoor dat u weet hoe u het register kunt herstellen als er een probleem optreedt. Voor informatie over hoe u een back-up maakt van het register en het herstellen of bewerken van het register, klikt u op het volgende artikel in de Microsoft Knowledge Base:
256986 beschrijving van het Microsoft Windows-register

Symptomen


Een aanroep naar de functie WriteFile mislukt. Dit symptoom doet zich voor wanneer de volgende voorwaarden voldaan wordt:
  • U gebruikt een clientcomputer met Microsoft Windows XP Service Pack 1 (SP1) wordt uitgevoerd.
  • Met de functie WriteFile kunt u probeert te schrijven naar een bestand in een gedeelde netwerkmap.
  • De gedeelde map zich op een server waarop Microsoft Windows 2000 of Microsoft Windows Server 2003 wordt uitgevoerd.
Bovendien wordt het volgende foutbericht weergegeven:
ERROR_ACCESS_DENIED

Oorzaak


Dit probleem treedt op wanneer aan de volgende voorwaarden voldaan wordt:
  • Als u de CreateFile -functie gebruikt om het bestand te maken, kunt u alleen de constante GENERIC_WRITE opgegeven in de parameter dwDesiredAccess .
  • Server Message Block (SMB)-ondertekening is ingeschakeld voor de communicatie tussen de client en de server-computer.

Tijdelijke oplossing


Om dit probleem te omzeilen, gebruikt u een van de volgende methoden:
  • De constante GENERIC_READ en de GENERIC_WRITE-constante opgeven in de parameter dwDesiredAccess .
  • Wijzig de SMB-ondertekening.

De constante GENERIC_READ en de GENERIC_WRITE-constante opgeven in de parameter dwDesiredAccess

De volgende code gebruiken om het bestand te maken.

Opmerking De volgende tijdelijke aanduidingen vervangen:
  • Tijdelijke aanduiding voor de servernaam vervangen door de naam van een server waarop Windows 2000 of Windows Server 2003 wordt uitgevoerd.
  • De mapnaam tijdelijke aanduiding vervangen door de naam van een map op de server.
// 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-ondertekening wijzigen

Waarschuwing Als u de Register-Editor onjuist gebruikt, kunnen er ernstige problemen veroorzaken dat u uw besturingssysteem opnieuw moet installeren. Microsoft kan niet garanderen dat problemen die voortkomen uit een onjuist gebruik van Register-Editor kunnen worden opgelost. Gebruik de Register-Editor op eigen risico.
Volg deze stappen op de server en op de clientcomputer:
  1. In de Register-Editor, zoek en klik op de volgende registersubsleutel:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lanmanserver\Parameters
  2. In het rechterdeelvenster van Register-Editor met de rechtermuisknop op
    requiresecuritysignature in de naam van het veld en klik vervolgens op wijzigen. Het dialoogvenster DWORD-waarde bewerkenwordt weergegeven.
  3. Typ in het vak Waardegegevens
    0, en klik vervolgens op OK.
  4. Sluit de Register-Editor af en start de computer opnieuw op.

Meer informatie


Stappen om het gedrag te reproduceren

  1. Gebruik op een computer waarop Windows XP SP1, Microsoft Visual C++ 6.0 voor het maken van een eenvoudige consoletoepassing Win32-project met de naam Test. Standaard wordt het bestand Test.cpp gemaakt.
  2. Een bestand maken door alleen de constante GENERIC_WRITE in de parameter dwDesiredAccess als u de functie CreateFile .
  3. Gebruik de
    WriteFile functie probeert te schrijven naar het bestand. U doet dit door met de volgende code vervangen de bestaande code in het bestand Test.cpp.

    Opmerking De volgende tijdelijke aanduidingen vervangen:
    • Tijdelijke aanduiding voor de servernaam vervangen door de naam van een server waarop Windows 2000 of Windows Server 2003 wordt uitgevoerd.
    • De mapnaam tijdelijke aanduiding vervangen door de naam van een map op de server.
    :
    #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. Bouw en de toepassing wordt uitgevoerd. Een consolevenster weergegeven. Als dat wordt vermeld in de sectie 'Symptomen' in dit geval bevat het consolevenster de volgende uitvoer:
    Er is een fout ERROR_ACCESS_DENIED opgetreden.
    Druk op een willekeurige toets om verder te gaan.

Referenties


Voor meer informatie over de CreateFile -functie en de
WriteFile werkt, gaat u naar de volgende websites van Microsoft Developer Network (MSDN):