Παρουσιάζεται σφάλμα "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 στην παράμετρο dwDesiredAccess .
  • Υπογραφή του Server Message Block (SMB) είναι ενεργοποιημένη για την επικοινωνία μεταξύ του υπολογιστή-πελάτη και του διακομιστή.

Εναλλακτικός τρόπος αντιμετώπισης

Για να επιλύσετε αυτό το ζήτημα, χρησιμοποιήστε μία από τις ακόλουθες μεθόδους:
  • Καθορίστε τη σταθερά GENERIC_READ και η GENERIC_WRITE σταθερά στην παράμετρο dwDesiredAccess .
  • Τροποποιήστε την υπογραφή SMB.

Καθορίστε τη σταθερά GENERIC_READ και η GENERIC_WRITE σταθερά στην παράμετρο dwDesiredAccess

Χρησιμοποιήστε τον ακόλουθο κώδικα για να δημιουργήσετε το αρχείο.

Σημείωση Αντικαταστήστε τα ακόλουθα σύμβολα κράτησης θέσης:
  • Αντικαταστήστε το κείμενο κράτησης θέσης όνομα διακομιστή με το όνομα του διακομιστή υπολογιστή που εκτελεί 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, και στη συνέχεια κάντε κλικ στο κουμπί OK.
  4. Κλείστε τον Επεξεργαστή μητρώου και, στη συνέχεια, κάντε επανεκκίνηση του υπολογιστή.

Περισσότερες πληροφορίες

Βήματα για την αναπαραγωγή της συμπεριφοράς

  1. Σε έναν υπολογιστή που εκτελεί το Windows XP SP1, χρησιμοποιήστε το Microsoft Visual C++ 6.0 για να δημιουργήσετε ένα απλό έργο εφαρμογής κονσόλας Win32 που ονομάζεται δοκιμής. Από προεπιλογή, δημιουργείται το αρχείο Test.cpp.
  2. Δημιουργήστε ένα αρχείο καθορίζοντας μόνο τη σταθερά GENERIC_WRITE στην παράμετρο dwDesiredAccess , όταν χρησιμοποιείτε τη συνάρτηση CreateFile .
  3. Χρήση του
    Η συνάρτηση WriteFile για να δοκιμάσετε να κάνετε εγγραφή στο αρχείο. Για να γίνει αυτό, αντικαταστήστε τον υπάρχοντα κώδικα στο αρχείο Test.cpp με τον παρακάτω κώδικα.

    Σημείωση Αντικαταστήστε τα ακόλουθα σύμβολα κράτησης θέσης:
    • Αντικαταστήστε το κείμενο κράτησης θέσης όνομα διακομιστή με το όνομα του διακομιστή υπολογιστή που εκτελεί 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 Developer Network (MSDN) στο Web:
Ιδιότητες

Αναγνωριστικό άρθρου: 842792 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια