當您嘗試寫入網路共用資料夾中的檔案時,就會發生 「 ERROR_ACCESS_DENIED 」 錯誤


重要本文包含修改登錄的相關資訊。您可以修改登錄之前,請務必將它備份起來,並了解如何在發生問題時還原登錄。如需有關如何備份、 還原和編輯登錄的資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件︰
Microsoft Windows 登錄256986說明

狀況


WriteFile函式的呼叫可能會失敗。當下列情況成立時,您會遇到這個徵狀︰
  • 您正在使用的用戶端電腦正在執行 Microsoft Windows XP Service Pack 1 (SP1)。
  • 您可以用於WriteFile函式嘗試將寫入網路共用資料夾中的檔案。
  • 共用的資料夾是在執行 Microsoft Windows 2000 或 Microsoft Windows Server 2003 的伺服器電腦上。
此外,您可能會收到下列錯誤訊息:
ERROR_ACCESS_DENIED

原因


當下列情況成立時,就會發生這個問題︰
  • 當您使用createfile 而函式來建立檔案時,您將在dwDesiredAccess參數中指定 GENERIC_WRITE 常數。
  • 用戶端電腦與伺服器電腦之間的通訊會啟用伺服器訊息區 (SMB) 簽章。

因應措施


若要解決這個問題,請使用下列方法之一︰
  • 請指定 GENERIC_READ 常數和 GENERIC_WRITE 常數dwDesiredAccess參數中。
  • 修改 SMB 簽章。

DwDesiredAccess 參數中指定 GENERIC_READ 常數和 GENERIC_WRITE 常數

您可以使用下列的程式碼,建立檔案。

注意程式碼取代下列預留位置︰
  • 伺服器名稱以取代預留位置的執行 Windows 2000 或 Windows Server 2003 的伺服器電腦名稱。
  • 資料夾名稱以取代預留位置的伺服器電腦上的網路共用資料夾的名稱。
// 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 簽章

警告不當使用 「 登錄編輯程式 」 可能會導致嚴重的問題,甚至必須重新安裝作業系統。Microsoft 不保證您不當使用登錄編輯程式所產生的問題都可以解決。請自行承擔使用登錄編輯器的風險。
在伺服器電腦上,並在用戶端電腦,請依照下列步驟執行︰
  1. 在 「 登錄編輯器 」 中,找出並按一下下列登錄子機碼︰
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lanmanserver\Parameters
  2. 在右窗格的 「 登錄編輯程式中,以滑鼠右鍵按一下
    名稱中的requiresecuritysignature欄位,然後按一下 [修改]。[編輯 DWORD 值] 對話方塊隨即出現。
  3. 在 [數值資料] 方塊中,輸入
    0,然後按一下[確定]
  4. 結束登錄編輯程式],然後重新啟動電腦。

更多的資訊


重現問題的步驟

  1. 在電腦上正在執行 Windows XP SP1,使用 Microsoft Visual C++ 6.0 建立的名為 Test 的簡單 Win32 主控台應用程式專案。根據預設,會建立 Test.cpp 檔案。
  2. 藉由在dwDesiredAccess參數中指定 GENERIC_WRITE 常數,當您使用createfile 而函式中建立檔案。
  3. 使用
    WriteFile函式,以嘗試寫入檔案。若要這麼做,請將 Test.cpp 檔案中現有的程式碼取代下列程式碼。

    注意程式碼取代下列預留位置︰
    • 伺服器名稱以取代預留位置的執行 Windows 2000 或 Windows Server 2003 的伺服器電腦名稱。
    • 資料夾名稱以取代預留位置的伺服器電腦上的網路共用資料夾的名稱。
    :
    #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. 建置並再執行應用程式。主控台視窗隨即出現。如果發生 < 徵狀=""> 一節所述的行為,主控台視窗會包含下列輸出︰
    ERROR_ACCESS_DENIED 錯誤。
    請按任意鍵繼續。

參考


如需有關createfile 而函式,
WriteFile運作,請造訪下列 Microsoft 開發人員網路 (MSDN) 網站︰