네트워크 공유 폴더에 있는 파일에 쓰려고 할 때 "ERROR_ACCESS_DENIED" 오류 발생


중요: 레지스트리를 수정 하는 방법에 대 한 정보가 나와 있습니다. 레지스트리를 수정 하기 전에 반드시 백업 하 고 문제가 발생할 경우 레지스트리를 복원 하는 방법을 알고 있는지 확인 하십시오. 백업, 복원 및 레지스트리 편집 방법에 대 한 내용은 Microsoft 기술 자료의 다음 문서 번호를 클릭 합니다.
256986 Microsoft Windows 레지스트리 설명

증상


WriteFile 함수 호출을 실패할 수 있습니다. 다음 조건이 충족 될 때이 문제가 발생 합니다.
  • Microsoft Windows XP 서비스 팩 1 (SP1)을 실행 하는 클라이언트 컴퓨터를 사용 하 고.
  • 네트워크 공유 폴더에 있는 파일에 기록할 WriteFile 함수를 사용 합니다.
  • Microsoft Windows 2000 또는 Microsoft Windows Server 2003을 실행 하는 서버 컴퓨터에 있는 공유 폴더가입니다.
또한 다음과 같은 오류 메시지가 나타날 수 있습니다.
ERROR_ACCESS_DENIED

원인


이 문제는 다음 조건에 해당할 때 발생 합니다.
  • CreateFile 함수를 사용 하는 파일을 만들 때만 GENERIC_WRITE 상수 dwDesiredAccess 매개 변수에서 지정한.
  • 서버 메시지 블록 (SMB) 서명을 클라이언트 컴퓨터와 서버 컴퓨터 간의 통신에 사용 됨.

해결 방법


이 문제를 해결 하려면 다음 방법 중 하나를 사용.
  • DwDesiredAccess 매개 변수에서 GENERIC_READ 상수와 GENERIC_WRITE 상수를 지정 합니다.
  • SMB 서명을 수정 합니다.

DwDesiredAccess 매개 변수에 GENERIC_READ 상수와 GENERIC_WRITE 상수를 지정 합니다.

다음 코드를 사용 하 여 파일을 만들 수 있습니다.

참고: 자리 표시자를 다음과 같이 바꿉니다.
  • 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 s p 1을 실행 하는 컴퓨터에서 Microsoft Visual C++ 6.0을 사용 하 여 테스트 라는 간단한 Win32 콘솔 응용 프로그램 프로젝트를 만듭니다. 기본적으로는 Test.cpp 파일이 생성 됩니다.
  2. CreateFile 함수를 사용 하는 경우 dwDesiredAccess 매개 변수에서는 GENERIC_WRITE 상수를 지정 하 여 파일을 만듭니다.
  3. 사용 하는
    파일에 기록할 WriteFile 함수입니다. 이렇게 하려면 Test.cpp 파일의 기존 코드를 다음 코드로 바꿉니다.

    참고: 자리 표시자를 다음과 같이 바꿉니다.
    • 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 Developer Network (MSDN) 웹 사이트를 방문 하십시오.