Ocorre um erro "ERROR_ACCESS_DENIED" quando tenta escrever um ficheiro que está numa pasta partilhada da rede

Traduções de Artigos Traduções de Artigos
Artigo: 842792 - Ver produtos para os quais este artigo se aplica.
importante Este artigo contém informações sobre como modificar o registo. Antes de modificar o registo, certifique-se de que efectua uma cópia de segurança e de que compreende como o restaurar o registo se ocorrer um problema. Para obter informações sobre como efectuar uma cópia de segurança, restaurar e editar o registo, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
256986Descrição do registo do Microsoft Windows
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Uma chamada para a função de WriteFile poderá não ter êxito. Detectar este sintoma quando se verificam as seguintes condições:
  • Está a utilizar um computador cliente com o Microsoft Windows XP Service Pack 1 (SP1).
  • Utilizar a função de WriteFile para tentar escrever num ficheiro está numa pasta partilhada de rede.
  • A pasta partilhada estiver num computador servidor com o Microsoft Windows 2000 ou Microsoft Windows Server 2003.
Além disso, poderá receber a seguinte mensagem de erro:
ERROR_ACCESS_DENIED

Causa

Este problema ocorre quando se verificam as seguintes condições:
  • Quando utilizou a função CreateFile para criar o ficheiro, apenas a constante GENERIC_WRITE é especificada no parâmetro dwDesiredAccess .
  • Assinatura do servidor SMB (Message Block) está activada para comunicação entre o computador cliente e o computador servidor.

Como contornar

Para contornar este problema, utilize um dos seguintes métodos:
  • Especificar a constante GENERIC_READ e o GENERIC_WRITE constante no parâmetro dwDesiredAccess .
  • Modificar a assinatura SMB.

Especificar a constante GENERIC_READ e a constante GENERIC_WRITE no parâmetro dwDesiredAccess

Utilize o seguinte código para criar o ficheiro.

Nota Substitua os seguintes marcadores de posição:
  • Substitua o marcador de posição ServerName o nome de um computador de servidor com o Windows 2000 ou Windows Server 2003.
  • Substitua o marcador de posição FolderName o nome de uma pasta partilhada de rede no computador 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 a assinatura SMB

aviso Se utilizar o Editor de registo incorrectamente, poderá provocar problemas graves que poderão forçar a reinstalação do sistema operativo. Microsoft não garante que os problemas resultantes da utilização incorrecta do Editor de registo possam ser resolvidos. As suas próprias risco da utilização do Editor de registo.
Siga estes passos no computador servidor e no computador cliente:
  1. No Editor de registo, localize e, em seguida, clique na seguinte subchave do registo:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lanmanserver\Parameters
  2. No painel da direita do Editor de registo, clique com o botão direito do rato requiresecuritysignature no campo Nome e, em seguida, clique em Modificar . Editar valor DWORD é apresentada a caixa de diálogo.
  3. Na caixa dados do valor , escreva 0 e, em seguida, clique em OK .
  4. Saia do Editor de registo e, em seguida, reinicie o computador.

Mais Informação

Passos para reproduzir o comportamento

  1. Num computador com o Windows XP SP1, utilize o Microsoft Visual C++ 6.0 para criar um projecto de aplicação de consola Win32 simples com o nome teste. Por predefinição, o ficheiro Test.cpp é criado.
  2. Crie um ficheiro, especificando apenas a constante GENERIC_WRITE no parâmetro dwDesiredAccess quando utiliza a função CreateFile .
  3. Utilize a função de WriteFile tentar escrever no ficheiro. Para o fazer, substitua o código existente no ficheiro Test.cpp com o seguinte código.

    Nota Substitua os seguintes marcadores de posição:
    • Substitua o marcador de posição ServerName o nome de um computador de servidor com o Windows 2000 ou Windows Server 2003.
    • Substitua o marcador de posição FolderName o nome de uma pasta partilhada de rede no computador 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. Compilar e executar a aplicação. Aparece uma janela de consola. Se o comportamento mencionado na secção "Sintomas" persistir, a janela de consola contém o seguinte resultado:
    Ocorreu um erro ERROR_ACCESS_DENIED.
    Prima qualquer tecla para continuar.

Referências

Para obter mais informações sobre a função CreateFile e a função de WriteFile , visite os seguintes Web sites da Microsoft Developer Network (MSDN):
CreateFile
http://msdn2.microsoft.com/en-us/library/aa363858.aspx
WriteFile
http://msdn2.microsoft.com/en-us/library/aa365747.aspx

Propriedades

Artigo: 842792 - Última revisão: 17 de janeiro de 2007 - Revisão: 1.5
A informação contida neste artigo aplica-se a:
  • Microsoft Windows XP Professional SP1 nas seguintes plataformas
    • Microsoft Windows Server 2003 Standard Edition
    • the operating system: Microsoft Windows 2000
  • Microsoft Windows XP Home Edition SP1 nas seguintes plataformas
    • Microsoft Windows Server 2003 Standard Edition
    • the operating system: Microsoft Windows 2000
Palavras-chave: 
kbmt kbclient kbprb kberrmsg kbregistry kbkern32dll kbapi kbsmb kbserver KB842792 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 842792

Submeter comentários

 

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