Při pokusu o zápis do souboru ve sdílené síťové složce, dojde k chybě "ERROR_ACCESS_DENIED"

Důležité: Tento článek obsahuje informace o úpravě registru. Před úpravou registru, nezapomeňte zálohovat a ujistěte se, že víte, jak registr obnovit v případě výskytu problému. Informace o zálohování, obnovení a úpravě registru klepněte na následující číslo článku databáze Microsoft Knowledge Base:
256986 Popis registru systému Microsoft Windows

Příznaky

Volání funkce WriteFile pravděpodobně nebude úspěšný. Těmto potížím dochází, pokud jsou splněny následující podmínky:
  • Používáte klientský počítač se systémem Microsoft Windows XP Service Pack 1 (SP1).
  • Při pokusu o zápis do souboru ve sdílené síťové složce pomocí funkce WriteFile .
  • Sdílené složky je na serveru se systémem Microsoft Windows 2000 nebo Microsoft Windows Server 2003.
Navíc může zobrazit následující chybová zpráva:
ERROR_ACCESS_DENIED

Příčina

K tomuto problému dochází, pokud jsou splněny následující podmínky:
  • Při použití funkce CreateFile vytvořit soubor zadaný v parametru dwDesiredAccess pouze všeobecné_zápis konstanta.
  • Pro komunikaci mezi klientským počítačem a počítači serveru je povoleno podepisování Server Message Block (SMB).

Jak potíže obejít

Chcete-li tento problém vyřešit, použijte některou z následujících metod:
  • Zadejte konstantu všeobecné_čtení a všeobecné_zápis konstanta v parametru dwDesiredAccess .
  • Úprava, podepisování paketů SMB.

Zadat konstantu všeobecné_čtení a všeobecné_zápis konstanta v parametru dwDesiredAccess

Následující kód použijte k vytvoření souboru.

Poznámka: Nahraďte následující zástupné symboly:
  • Nahraďte zástupný symbol název_serveru název počítače serveru se systémem Windows 2000 nebo Windows Server 2003.
  • Nahraďte zástupný symbol pro název složky název síťové sdílené složky na serveru.
// 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);

Úprava, podepisování paketů SMB

Upozornění: Použijete-li Editor registru nesprávně, můžete způsobit vážné problémy, které mohou vyžadovat přeinstalaci operačního systému. Společnost Microsoft nemůže zaručit, že potíže vzniklé v důsledku nesprávného použití Editoru registru budete moci vyřešit. Pomocí Editoru registru na vlastní nebezpečí.
V počítači serveru a v klientském počítači, postupujte takto:
  1. V editoru registru vyhledejte a poté vyberte následující podklíč registru:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lanmanserver\Parameters
  2. V pravém podokně Editoru registru klepněte pravým tlačítkem myši
    requiresecuritysignature v název pole a potom klepněte na příkaz změnit. Zobrazí se dialogové okno Upravit hodnotu DWORD.
  3. Do pole Údaj hodnoty zadejte
    0a potom klepněte na tlačítko OK.
  4. Ukončete Editor registru a restartujte počítač.

Další informace

Kroky pro reprodukci chování

  1. V počítači se systémem Windows XP SP1 slouží k vytvoření jednoduché aplikace konzoly Win32 projektu s názvem Test Microsoft Visual C++ 6.0. Ve výchozím nastavení je vytvořen soubor Test.cpp.
  2. Vytvořte soubor zadáním pouze konstanta všeobecné_zápis v parametru dwDesiredAccess při použití funkce CreateFile .
  3. Použití
    Funkce WriteFile pokusu o zápis do souboru. Chcete-li to provést, nahraďte existující kód v souboru Test.cpp následující kód.

    Poznámka: Nahraďte následující zástupné symboly:
    • Nahraďte zástupný symbol název_serveru název počítače serveru se systémem Windows 2000 nebo Windows Server 2003.
    • Nahraďte zástupný symbol pro název složky název síťové sdílené složky na serveru.
    :
    #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. Sestavte a spusťte aplikaci. Zobrazí se okno konzoly. Pokud dochází k chování, která je uvedena v části "Příznaky", okno konzoly obsahuje následující výstup:
    Došlo k chybě ERROR_ACCESS_DENIED.
    Stisknutím libovolné klávesy pokračujte.

Odkazy

Další informace o funkci CreateFile a
WriteFile funkce, navštivte následující webové servery Microsoft Developer Network (MSDN):
Vlastnosti

ID článku: 842792 - Poslední kontrola: 17. 2. 2017 - Revize: 2

Váš názor