Se produce un error "ERROR_ACCESS_DENIED" cuando intenta escribir en un archivo que está en una carpeta compartida de red

Seleccione idioma Seleccione idioma
Id. de artículo: 842792 - Ver los productos a los que se aplica este artículo
importante este artículo contiene información acerca de cómo modificar el Registro. Antes de modificar el Registro, asegúrese de hacer una copia de seguridad del mismo y de que sabe cómo restaurarlo si ocurre algún problema. Para obtener información sobre cómo realizar una copia de seguridad, restaurar y modificar el Registro, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
256986Definición del Registro de Microsoft Windows
Expandir todo | Contraer todo

En esta página

Síntomas

No puede correctamente una llamada a la función WriteFile . Experimenta este síntoma cuando se cumplen las condiciones siguientes:
  • Estás utilizando un equipo cliente que está ejecutando Microsoft Windows XP Service Pack 1 (SP1).
  • Utilice la función de WriteFile para intentar escribir en un archivo que está en una carpeta compartida de red.
  • La carpeta compartida está en un equipo servidor que ejecuta Microsoft Windows 2000 o Microsoft Windows Server 2003.
Además, puede recibir el siguiente mensaje de error:
ERROR_ACCESS_DENIED

Causa

Este problema se produce cuando se cumplen las condiciones siguientes:
  • Cuando utiliza la función CreateFile para crear el archivo, que ha especificado sólo la constante GENERIC_WRITE en el parámetro dwDesiredAccess .
  • Firma de bloque de mensajes (SMB) de servidor está habilitada para la comunicación entre el equipo cliente y el equipo servidor.

Solución

Para solucionar este problema, siga cualquiera de los métodos que se muestran a continuación:
  • Especificar la constante GENERIC_READ y la GENERIC_WRITE constante en el parámetro dwDesiredAccess .
  • Modificar la firma SMB.

Especificar la constante GENERIC_READ y la constante GENERIC_WRITE en el parámetro dwDesiredAccess

Utilice el siguiente código para crear el archivo.

Nota Reemplace los marcadores de posición siguientes:
  • Reemplace el marcador de posición ServerName con el nombre de un equipo servidor que ejecuta Windows 2000 o Windows Server 2003.
  • Reemplace el marcador de posición FolderName con el nombre de una carpeta compartida de red en el equipo servidor.
// 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);

Modificar la firma SMB

Advertencia si utiliza incorrectamente el Editor del Registro, puede causar serios problemas que tal vez requieran volver a instalar el sistema operativo. Microsoft no garantiza que pueda solucionar los problemas resultantes del uso incorrecto del Editor del Registro. Utilice el Editor del Registro bajo su responsabilidad.
En el equipo servidor y en el equipo cliente, siga estos pasos:
  1. En el Editor del registro, busque y haga clic en la siguiente subclave del registro:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lanmanserver\Parameters
  2. En el panel derecho del Editor del registro, haga clic con el botón secundario en requiresecuritysignature en el campo nombre y, a continuación, haga clic en Modificar . Editar valor DWORD aparecerá el cuadro de diálogo.
  3. En el cuadro datos del valor , escriba 0 y, a continuación, haga clic en Aceptar .
  4. Cierre el Editor del Registro y reinicie el equipo.

Más información

Pasos para reproducir el comportamiento

  1. En un equipo que ejecuta Windows XP SP1, utilice Microsoft Visual C++ 6.0 para crear un proyecto de aplicación de consola Win32 sencillo denominado prueba. De forma predeterminada, se crea el archivo Test.cpp.
  2. Crear un archivo especificando la constante de GENERIC_WRITE en el parámetro dwDesiredAccess cuando se utiliza la función CreateFile .
  3. Utilice la función WriteFile para intentar escribir en el archivo. Para ello, reemplace el código existente en el archivo Test.cpp con el código siguiente.

    Nota Reemplace los marcadores de posición siguientes:
    • Reemplace el marcador de posición ServerName con el nombre de un equipo servidor que ejecuta Windows 2000 o Windows Server 2003.
    • Reemplace el marcador de posición FolderName con el nombre de una carpeta compartida de red en el equipo servidor.
    :
    #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. Genere y a continuación, ejecute la aplicación. Aparece una ventana de consola. Si se produce el comportamiento que se menciona en la sección "Síntomas", la ventana de consola contiene el siguiente resultado:
    Error ERROR_ACCESS_DENIED.
    Presione cualquier tecla para continuar.

Referencias

Para obtener más información acerca de la función CreateFile y la función WriteFile , visite los siguientes sitios Web de Microsoft Developer Network (MSDN):
CreateFile
http://msdn2.microsoft.com/en-us/library/aa363858.aspx
WriteFile
http://msdn2.microsoft.com/en-us/library/aa365747.aspx

Propiedades

Id. de artículo: 842792 - Última revisión: miércoles, 17 de enero de 2007 - Versión: 1.5
La información de este artículo se refiere a:
  • Microsoft Windows XP Professional SP1 sobre las siguientes plataformas
    • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
    • the operating system: Microsoft Windows 2000
  • Microsoft Windows XP Home Edition SP1 sobre las siguientes plataformas
    • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
    • the operating system: Microsoft Windows 2000
Palabras clave: 
kbmt kbclient kbprb kberrmsg kbregistry kbkern32dll kbapi kbsmb kbserver KB842792 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 842792

Enviar comentarios

 

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