Ett "ERROR_ACCESS_DENIED"-fel uppstår när du försöker skriva till en fil i en delad nätverksmapp


Viktigt Denna artikel innehåller information om hur du ändrar registret. Innan du ändrar i registret bör du se till att säkerhetskopiera den och se till att du förstår hur du återställer registret om det uppstår problem. Information om hur du säkerhetskopierar, återställer och redigerar registret klickar du på följande artikelnummer och läser artikeln i Microsoft Knowledge Base:
256986 beskrivning av registret i Microsoft Windows

Symptom


Ett anrop till funktionen WriteFile misslyckas. Det här problemet uppstår när följande villkor är uppfyllda:
  • Du använder en dator som kör Microsoft Windows XP Service Pack 1 (SP1).
  • Med funktionen WriteFile försök att skriva till en fil i en delad nätverksmapp.
  • Den delade mappen finns på en server som kör Microsoft Windows 2000 eller Microsoft Windows Server 2003.
Dessutom kan du få följande felmeddelande:
ERROR_ACCESS_DENIED

Orsak


Det här problemet uppstår när följande villkor är uppfyllda:
  • När du har använt funktionen CreateFile filen anges GENERIC_WRITE konstanten i parametern dwDesiredAccess .
  • Signering av Server Message Block (SMB) är aktiverat för kommunikationen mellan klienten och servern.

Temporär lösning


Undvik problemet genom att använda någon av följande metoder:
  • Ange GENERIC_READ konstant och GENERIC_WRITE konstant i parametern dwDesiredAccess .
  • Ändra SMB-signering.

Ange GENERIC_READ konstant och GENERIC_WRITE konstant i parametern dwDesiredAccess

Använd följande kod för att skapa filen.

Obs! Ersätt följande platshållare:
  • Ersätt ServerName platshållare med namnet på en serverdator som kör Windows 2000 eller Windows Server 2003.
  • Ersätt platshållaren mappnamn med namnet på en delad nätverksmapp på serverdatorn.
// 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);

Ändra SMB-signering

Varning Om du använder Registereditorn fel kan du orsaka allvarliga problem som kräver att du måste installera om operativsystemet. Microsoft kan inte garantera att du kan lösa problem som uppstår om du använder Registereditorn på ett felaktigt sätt. Använd Registereditorn på egen risk.
Gör följande på servern och på klienten:
  1. Leta upp och klicka på följande registerundernyckel i Registereditorn:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lanmanserver\Parameters
  2. Högerklicka i den högra rutan i Registereditorn
    requiresecuritysignature i namn fältet och klicka sedan på Ändra. Dialogrutan Redigera DWORD-värdevisas.
  3. Skriv i rutan data
    0, och klicka sedan på OK.
  4. Avsluta Registereditorn och starta sedan om datorn.

Mer Information


Åtgärder för att återskapa problemet

  1. Använd Microsoft Visual C++ 6.0 på en dator som kör Windows XP SP1, för att skapa en enkel Win32 Console Application-projekt som heter Test. Som standard skapas filen Test.cpp.
  2. Skapa en fil genom att ange GENERIC_WRITE konstanten i parametern dwDesiredAccess när du använder funktionen CreateFile .
  3. Använd den
    WriteFile funktion att skriva till filen. Genom att ersätta den befintliga koden i filen Test.cpp med följande kod.

    Obs! Ersätt följande platshållare:
    • Ersätt ServerName platshållare med namnet på en serverdator som kör Windows 2000 eller Windows Server 2003.
    • Ersätt platshållaren mappnamn med namnet på en delad nätverksmapp på serverdatorn.
    :
    #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. Kompilera och kör programmet. En konsol öppnas. Om problemet som beskrivs i avsnittet "Symptom" uppstår innehåller konsolfönstret följande utdata:
    Ett ERROR_ACCESS_DENIED-fel har inträffat.
    Tryck på valfri tangent för att fortsätta.

Referenser


Mer information om funktionen CreateFile och
WriteFile fungerar, finns på följande Microsoft Developer Network (MSDN)-webbplatser: