מתרחשת שגיאה "ERROR_ACCESS_DENIED" בעת ניסיון לכתוב אל קובץ שנמצא בתיקיה משותפת ברשת

מידע תמיכה פנימית של Microsoft

באג #: 22172 (תחזוקת תוכן)

חשוב מאמר זה מכיל מידע על שינוי הרישום. לפני שינוי הרישום, הקפד לגבות אותו וודא שאתה יודע כיצד לשחזר את הרישום במקרה שתתעורר בעיה. לקבלת מידע אודות כיצד לגבות, השחזור והעריכה של הרישום, לחץ על מספר המאמר הבא כדי להציג את המאמר הרלוונטי מתוך Microsoft Knowledge Base:

תיאור הרישום של Microsoft Windows

מאפייני הבעיה

קריאה לפונקציה WriteFile עלולים להיכשל. תיתקל בתופעה זו כאשר התנאים הבאים מתקיימים:

  • אתה משתמש מחשב לקוח בו פועל Microsoft Windows XP Service Pack 1 (SP1).

  • השתמש בפונקציה WriteFile כדי לנסות לכתוב קובץ שנמצא בתיקיה משותפת ברשת.

  • התיקיה המשותפת נמצאת במחשב שרת שבו פועל Microsoft Windows 2000 או ב- Microsoft Windows Server 2003.

בנוסף, ייתכן שתקבל את הודעת השגיאה הבאה:

ERROR_ACCESS_DENIED

הגורם

בעיה זו מתרחשת כאשר מתקיימים התנאים הבאים:

  • בעת שימוש בפונקציה CreateFile ליצירת הקובץ, ציינת הקבוע GENERIC_WRITE רק בפרמטר dwDesiredAccess .

  • חתימה על server Message Block (SMB) תהיה זמינה עבור תקשורת בין מחשב הלקוח למחשב השרת.

פתרון הבעיה

כדי לעקוף בעיה זו, השתמש באחת מהשיטות הבאות:

  • ציין הקבוע GENERIC_READ הקבוע GENERIC_WRITE בפרמטר dwDesiredAccess .

  • שנה את חתימת SMB.

ציין את ה-constant GENERIC_READ ואת הקבוע GENERIC_WRITE בפרמטר dwDesiredAccess

להשתמש בקוד הבא כדי ליצור את הקובץ.

הערה החלף את מצייני המיקום הבאים:

  • החלף ServerName מציין המיקום בשם של מחשב שרת שבו פועל Windows 2000 או Windows Server 2003.

  • להחליף את מציין המיקום של שם תיקיה עם השם של תיקיית רשת משותפת במחשב השרת.

// 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. צור קובץ על-ידי ציון הקבוע GENERIC_WRITE רק בפרמטר dwDesiredAccess בעת שימוש בפונקציה CreateFile .

  3. השתמש
    בפונקציה WriteFile כדי לנסות לכתוב לקובץ. כדי לעשות זאת, החלף את הקוד הקיים בקובץ Test.cpp הקוד הבא.

    הערה החלף את מצייני המיקום הבאים:

    • החלף ServerName מציין המיקום בשם של מחשב שרת שבו פועל Windows 2000 או Windows Server 2003.

    • להחליף את מציין המיקום של שם תיקיה עם השם של תיקיית רשת משותפת במחשב השרת.

    :

    #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):

CreateFile

WriteFile

זקוק לעזרה נוספת?

הרחב את הכישורים שלך
סייר בהדרכה
קבל תכונות חדשות לפני כולם
הצטרף למשתתפי Microsoft insider

האם מידע זה היה שימושי?

תודה על המשוב!

תודה על המשוב! נראה שכדאי לקשר אותך לאחד מנציגי התמיכה של Office.

×