你目前正处于脱机状态,正在等待 Internet 重新连接

当您试图写入网络共享文件夹中的文件时,将出现"ERROR_ACCESS_DENIED"错误

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 842792
重要本文包含有关修改注册表的信息。 在修改注册表之前,请务必对其进行备份,并确保您了解如何还原注册表发生问题。有关如何备份、 还原,和编辑注册表单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256986在 Microsoft 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 常量

下面的代码用于创建该文件。

注意替换以下占位符:
  • ServerName 占位符替换为正在运行 Windows 2000 或 Windows Server 2003 的服务器计算机的名称。
  • 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 的。默认状态下,创建 Test.cpp 文件。
  2. 通过使用 CreateFile 函数时 dwDesiredAccess 参数中指定仅 GENERIC_WRITE 常量来创建一个文件。
  3. WriteFile 函数用于尝试写入文件。要这样做将 Test.cpp 文件中的现有代码替换下面的代码。

    注意替换以下占位符:
    • ServerName 占位符替换为正在运行 Windows 2000 或 Windows Server 2003 的服务器计算机的名称。
    • 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 开发人员网络 (MSDN) 的网站:

警告:本文已自动翻译

属性

文章 ID: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
反馈