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

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:842792
重要本文包含修改登錄的相關資訊。 修改登錄之前請確定它備份起來,並請確定您瞭解如何在發生問題時還原登錄。如如何備份、 還原,以及編輯登錄有關,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
256986Microsoft Windows 登錄的描述
徵狀
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 的伺服器電腦的名稱取代 ServerName 版面配置區。
  • 伺服器電腦上的網路共用資料夾的名稱取代 FolderName 版面配置區。
// 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 建立簡單的 Win32 主控台應用程式專案,名為測試。預設情況下,會建立 Test.cpp 檔案。
  2. 藉由使用 CreateFile 函式時,在 dwDesiredAccess 參數中指定只 GENERIC_WRITE 常數建立檔案。
  3. 使用 WriteFile 函數來嘗試寫入至檔案。若要執行此動作將 Test.cpp 檔案中現有的程式碼取代下列程式碼上。

    附註取代下列位置:
    • 執行 Windows 2000 或 Windows Server 2003 的伺服器電腦的名稱取代 ServerName 版面配置區。
    • 伺服器電腦上的網路共用資料夾的名稱取代 FolderName 版面配置區。
    #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 開發 o 人 h 員 û 工 u 具 ã 網路 (MSDN) 網站:

警告:本文為自動翻譯

內容

文章識別碼:842792 - 最後檢閱時間:01/17/2007 07:16:57 - 修訂: 1.5

Microsoft Windows XP Professional SP1, Microsoft Windows XP Home Edition SP1

  • kbmt kbclient kbprb kberrmsg kbregistry kbkern32dll kbapi kbsmb kbserver KB842792 KbMtzh
意見反應