Se produce o eroare "ERROR_ACCESS_DENIED" atunci când încercați să scrie într-un fișier care se află într-un folder partajat de rețea


Important Acest articol conține informații despre modificarea valorilor din registry. Înainte de a modifica registry, asigurați-vă că o copie de rezervă și asigurați-vă că înțelegeți cum să restaurați registry dacă apare o problemă. Pentru informații despre cum să creați copii de rezervă, restaurarea și editarea registry, faceți clic pe următorul număr de articol pentru a vedea articolul în baza de cunoștințe Microsoft:
256986 Descrierea registry din Microsoft Windows

Simptome


Un apel pentru funcția WriteFile poate să nu reușească. Apare acest simptom atunci când următoarele condiții sunt adevărate:
  • Utilizați un computer client care execută Microsoft Windows XP Service Pack 1 (SP1).
  • Utilizați funcția WriteFile pentru a încerca să scrie într-un fișier care se află într-un folder partajat de rețea.
  • Folderul partajat este pe un computer server care execută Microsoft Windows 2000 sau Microsoft Windows Server 2003.
În plus, este posibil să primiți următorul mesaj de eroare:
ERROR_ACCESS_DENIED

Cauza


Această problemă apare atunci când următoarele condiții sunt adevărate:
  • Atunci când se utilizează funcția CreateFile pentru a crea fișierul, specificat numai Constanta GENERIC_WRITE în parametrul dwDesiredAccess .
  • Server semnarea mesaj Block (SMB) este activat pentru comunicare între computerul client și server computerul.

Soluție


Pentru a rezolva această problemă, utilizați oricare dintre următoarele metode:
  • Specificați Constanta GENERIC_READ și Constanta GENERIC_WRITE în parametrul dwDesiredAccess .
  • Modificați semnarea SMB.

Specificați Constanta GENERIC_READ și Constanta GENERIC_WRITE în parametrul dwDesiredAccess

Utilizați următorul cod pentru a crea fișierul.

Notă Înlocuiți substituenții următoarele:
  • Înlocuiți Substituentul NumeServer cu numele unui computer server care execută Windows 2000 sau Windows Server 2003.
  • Înlocuiți Substituentul NumeFolder cu numele unui folder de rețea partajat pe un computer 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);

Modificați semnarea SMB

Avertisment Dacă utilizați editorul de Registry incorect, pot apărea probleme grave care pot necesita reinstalarea sistemului de operare. Microsoft nu poate garanta că aveți posibilitatea să rezolvați problemele care rezultă din utilizarea incorectă a Registry Editor. Utilizaţi editorul de Registry pe propriul risc.
Urmați acești pași pe computerul server și pe computerul client:
  1. În Registry Editor, găsiți, apoi faceți clic pe următoarea subcheie de registry:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lanmanserver\Parameters
  2. În panoul din dreapta al Registry Editor, faceți clic dreapta
    requiresecuritysignature în câmpul nume și apoi faceți clic pe Modify. Apare caseta de dialog Edit DWORD Value.
  3. În caseta Value data , tastați
    0, și apoi faceți clic pe OK.
  4. Închideți Registry Editor, și apoi reporniți computerul.

Mai multe informații


Pași pentru a reproduce comportamentul

  1. Pe un computer care execută Windows XP SP1, utilizați Microsoft Visual C++ 6.0 pentru a crea un simplu Win32 Console Application proiect numit Test. În mod implicit, se creează fișierul Test.cpp.
  2. Creați un fișier prin specificarea numai Constanta GENERIC_WRITE în parametrul dwDesiredAccess atunci când utilizați funcția CreateFile .
  3. Utilizarea
    Function WriteFile pentru a încerca să scrie în fișierul. Pentru aceasta, înlocuiți codul existent în fișierul Test.cpp cu următorul cod.

    Notă Înlocuiți substituenții următoarele:
    • Înlocuiți Substituentul NumeServer cu numele unui computer server care execută Windows 2000 sau Windows Server 2003.
    • Înlocuiți Substituentul NumeFolder cu numele unui folder de rețea partajat pe un computer 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. Compilare și executați aplicația. Apare o fereastră de consolă. Dacă apare comportamentul menționat în secțiunea "simptome", fereastra consolei conține următorul rezultat:
    A apărut o eroare de ERROR_ACCESS_DENIED.
    Apăsați orice tastă pentru a continua.

Referințe


Pentru mai multe informaţii despre funcţia CreateFile și
WriteFile , vizitați următorul site Web Microsoft Developer Network (MSDN):