حدوث خطأ "ERROR_ACCESS_DENIED" عند محاولة الكتابة إلى ملف موجود في مجلد شبكة مشترك

الخطأ رقم: 22172 (تعديل المحتوى)هام تتضمن هذه المقالة معلومات حول كيفية تعديل التسجيل. قبل تعديل السجل، تأكد من إجراء النسخ الاحتياطي والتأكد من فهمك لطريقة استعادته في حالة حدوث مشكلة. لمزيد من المعلومات حول كيفية عمل نسخة احتياطية واستعادة تحرير التسجيل، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":
وصف 256986 تسجيل Microsoft Windows

الأعراض

قد لا تنجح استدعاء الدالة WriteFile . تواجه هذه الأعراض إذا تحققت الشروط التالية:
  • يتم استخدام جهاز كمبيوتر عميل الذي يقوم بتشغيل حزمة الخدمة Microsoft Windows XP service Pack 1 (SP1).
  • يمكنك استخدام الدالة WriteFile محاولة الكتابة إلى ملف موجود في مجلد شبكة مشترك.
  • مجلد مشترك على كمبيوتر خادم يقوم بتشغيل Microsoft Windows 2000 أو Microsoft Windows Server 2003.
بالإضافة إلى ذلك، قد تتلقى رسالة الخطأ التالية:
ERROR_ACCESS_DENIED

السبب

تحدث هذه المشكلة إذا تحققت الحالتين التاليتين:
  • عند استخدام الدالة CreateFile لإنشاء الملف، حددت الثابت GENERIC_WRITE في المعلمة دوديسيريداكسيس .
  • يتم تمكين server Message Block (SMB) توقيع للاتصال بين الكمبيوتر العميل وجهاز الكمبيوتر الملقم.

الحل البديل

للتغلب على هذه المشكلة، استخدم إحدى الطرق التالية:
  • تعيين ثابت GENERIC_READ والثابت GENERIC_WRITE في المعلمة دوديسيريداكسيس .
  • تعديل توقيع SMB.

تعيين ثابت GENERIC_READ والثابت GENERIC_WRITE في المعلمة دوديسيريداكسيس

استخدم التعليمات البرمجية التالية لإنشاء الملف.

ملاحظة: استبدل العناصر النائبة التالية:
  • استبدال العنصر النائب 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 في معلمة دوديسيريداكسيس عند استخدام الدالة 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) التالي على الويب:
خصائص

رقم الموضوع: 842792 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات