2017-12-29 32 views
0

Betrachten sie einen folgenden Code-SnippetUnreadable Dateiattribute auf Windows

#include <iostream> 
    #include <windows.h> 
    int main() 
    { 
     WIN32_FILE_ATTRIBUTE_DATA wfad; 

     GetFileAttributesEx(("C:\\TEMP\\noreadfile"), GetFileExInfoStandard, &wfad); //"noreadfile" is unreadable file 
     std::cout << wfad.dwFileAttributes; // 128             
     return 0; 
    } 

Für eine lesbare Datei (Datei, die nicht lesen Berechtigungen oder die Datei hat, die ihre Leseberechtigungen gesetzt als „Verweigern“ in seinen Eigenschaften -> Registerkarte Sicherheit) unter Windows GetFileAttributesEx gibt FILE_ATTRIBUTE_NORMAL zurück, was bedeutet, dass no other attribute is set für diese Datei.

Dieses Attribut wird auch für schreib- und nicht schreibgeschützte Dateien zurückgegeben.

Wir verwenden diese Informationen, um die Berechtigungen für Dateien in unserem Produktcode festzulegen.

Wir folgerten, dass GetFileAttributesEx möglicherweise falsche Attribut im Falle von nicht lesbaren Dateien zurückgibt. Wir fragen uns, ob unsere Schlussfolgerung richtig ist oder nicht. Wenn ja, ist das ein bekanntes Problem mit GetFileAttributesEx?

Wenn nicht, dann

Was ist der richtige Weg, um die Dateiattribute zu bekommen (vielleicht Dateiberechtigungen?) Für eine unlesbaren Datei mit dem Windows-API oder, wenn möglich mit Boost-oder Standard C++ Bibliotheken Dateisystem?

+1

Dateiattribute (z. B. schreibgeschützt, System, ausgeblendet usw.) haben nichts mit Dateisicherheit zu tun. Rufen Sie [GetNamedSecurityInfo'] (https://msdn.microsoft.com/en-us/library/aa446645) auf, um eine DACL (DACL) zu erhalten. – eryksun

Antwort

1

Es ist wahrscheinlich überhaupt nicht erfolgreich. Wenn Sie die documentation for GetFileAttributesEx betrachten, gibt es tatsächlich eine BOOL zurück.

Rückgabewert Wenn die Funktion erfolgreich ist, ist der Rückgabewert ein Wert ungleich Null .

Wenn die Funktion fehlschlägt, ist der Rückgabewert Null (0). Um die Fehlerinformationen zu erhalten, rufen Sie GetLastError.

Meine Vermutung ist, dass "Fwad" nicht definiert ist, wenn der Anruf fehlschlägt. Versuchen Sie, den Rückgabewert für eine Fehleranzeige zu überprüfen. Meine Vermutung ist, dass GetLastError etwas wie ERROR_ACCESS_DENIED zurückgibt.

Die Windows-API löst keine Ausnahmen aus, daher müssen Sie fast jeden Rückgabewert überprüfen.

+0

Es ist korrekt, dass das OP nach Erfolg sucht, aber es ist unwahrscheinlich, dass das Lesen von Dateiattributen in diesem Fall fehlschlägt, selbst wenn die Dateisicherheit das Recht verweigert, sie zu lesen. Das OP ist sehr wahrscheinlich berechtigt, das übergeordnete Verzeichnis "C: \ Temp" aufzulisten. Dies ermöglicht implizit das Lesen der Attribute jeder Datei im Verzeichnis. – eryksun

+0

In ähnlicher Weise ermöglicht der Lösch-Kind-Zugriff auf das Verzeichnis das Löschen von Dateien, für die das schreibgeschützte Attribut nicht festgelegt wurde, auch wenn die Sicherheit einer Datei dies nicht zulässt. Dies sind die beiden Fälle, in denen die Sicherheit des übergeordneten Verzeichnisses die der enthaltenen Datei übertrifft. – eryksun

+0

Odd ... Der generische "Lesezugriff" ist [sollte] (https://technet.microsoft.com/en-us/library/cc783530 (v = ws.10) .aspx) include "Leseattribut", Aber soweit ich das beurteilen kann, kann ich alle Attribute aller Dateien sehen, solange ich das Verzeichnis, in dem sie sich befinden, auflisten kann. –

Verwandte Themen