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

Nº de error: 22172 (Mantenimiento de contenido)importante este artículo contiene información acerca de cómo modificar el registro. Antes de modificar el registro, asegúrese de realizar una copia de seguridad y asegúrese de que sabe cómo restaurarlo si ocurre algún problema. Para obtener información acerca de cómo hacer copia de seguridad, restaurar y modificar el registro, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

Síntomas

Una llamada a la función WriteFile puede no tener éxito. Experimenta este síntoma cuando se cumplen las condiciones siguientes:
  • Está utilizando un equipo cliente que está ejecutando Microsoft Windows XP Service Pack 1 (SP1).
  • Utilice la función WriteFile para intentar escribir en un archivo que se encuentra en una carpeta compartida de red.
  • Es la carpeta compartida en un equipo servidor que está ejecutando 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 se utiliza la función CreateFile para crear el archivo, sólo la constante GENERIC_WRITE ha especificado en el parámetro dwDesiredAccess .
  • Firma de Server Message Block (SMB) está habilitada para la comunicación entre el equipo cliente y el equipo servidor.

Solución alternativa

Para evitar este problema, utilice cualquiera de los métodos siguientes:
  • Especificar la constante GENERIC_READ y la constante GENERIC_WRITE en el parámetro dwDesiredAccess .
  • Modifique la firma SMB.

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

Utilice el código siguiente para crear el archivo.

Nota: Reemplace a los siguientes marcadores:
  • Reemplace el marcador de posición del nombre del servidor con el nombre de un equipo servidor que ejecuta Windows 2000 o Windows Server 2003.
  • Reemplace el marcador de posición del nombre de carpeta 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 provocar problemas graves que conlleven la reinstalación del sistema operativo. Microsoft no puede garantizar que pueda solucionar los problemas derivados del uso incorrecto del Editor del registro. Utilice el Editor del registro bajo su propio riesgo.
En el equipo servidor y en el equipo cliente, siga estos pasos:
  1. En el Editor del registro, busque y, a continuación, haga clic en la subclave del registro siguiente:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lanmanserver\Parameters
  2. En el panel derecho del Editor del registro, haga clic en
    requiresecuritysignature en el nombre del campo y, a continuación, haga clic en Modificar. Aparecerá el cuadro de diálogo Editar valor DWORD.
  3. En el cuadro información del valor , escriba
    0y, a continuación, haga clic en Aceptar.
  4. Salga del Editor del registro y, a continuación, reinicie el equipo.

Más información

Pasos para reproducir el comportamiento

  1. En un equipo que está ejecutando el SP1 de Windows XP, utilice Microsoft Visual C++ 6.0 para crear un proyecto simple de aplicación de consola Win32 denominada Test. De forma predeterminada, se crea el archivo Test.cpp.
  2. Cree un archivo especificando sólo la constante GENERIC_WRITE en el parámetro dwDesiredAccess cuando se utiliza la función CreateFile .
  3. Utilice el
    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 a los siguientes marcadores:
    • Reemplace el marcador de posición del nombre del servidor con el nombre de un equipo servidor que ejecuta Windows 2000 o Windows Server 2003.
    • Reemplace el marcador de posición del nombre de carpeta 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 ejecute la aplicación. Aparecerá una ventana de consola. Si se produce el comportamiento que se menciona en la sección "Síntomas", la ventana de la consola contiene el siguiente resultado:
    Se ha producido un error ERROR_ACCESS_DENIED.
    Presione cualquier tecla para continuar.

Referencias

Para obtener más información acerca de la función CreateFile y el
WriteFile función, visite los siguientes sitios Web de Microsoft Developer Network (MSDN):
Propiedades

Id. de artículo: 842792 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios