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

文章翻譯 文章翻譯
文章編號: 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) 網站:
CreateFile
http://msdn2.microsoft.com/en-us/library/aa363858.aspx
WriteFile
http://msdn2.microsoft.com/en-us/library/aa365747.aspx

屬性

文章編號: 842792 - 上次校閱: 2007年1月17日 - 版次: 1.5
這篇文章中的資訊適用於:
  • Microsoft Windows XP Professional SP1?應用於:
    • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
    • the operating system: Microsoft Windows 2000
  • Microsoft Windows XP Home Edition SP1?應用於:
    • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
    • the operating system: Microsoft Windows 2000
關鍵字:?
kbmt kbclient kbprb kberrmsg kbregistry kbkern32dll kbapi kbsmb kbserver KB842792 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:842792
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com