Schreibschutz von Verzeichnissbäumen Abfragen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Schreibschutz von Verzeichnissbäumen Abfragen?

Beitrag von GreyEnt »

Guten Morgen.
Haette mal eine Frage.
Auf meinem Fileserver sind einige Verzeichnisse schreibgeschützt.
Diese Verzeichnisse will ich "entlarven".
Folgendes kleines Programm geht den Filebaum durch und schreibt in jedes Verzeichniss eine Datei.
Bei Schreibschutz wird der Pfad aufgelistet.
Das funktioniert praechtig.
Gibt es aber eine Lösung ohne die Testdatei zu erzeugen?
Bin mir sicher die Lösung geht auch sauber. :)

Vielen Dank schonmal.
GreyEnt

Hier mein Tool in 5.62.

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   RW-Check
;   Dieses Programm checkt ein Verzeichnisbaum auf schreibschutz.
;   22.07.2018 GreyEnt
;   Geschrieben für PureBasic 5.62(x64) Windows
;    
;
; ------------------------------------------------------------
;

If OpenWindow(0, 100, 100, 800, 600, "Read - Write Check", #PB_Window_MinimizeGadget)
  
  pfad = ListViewGadget(#PB_Any,  10, 10, 150, 100)
  dir = ButtonGadget  (#PB_Any , 170, 10, 70 , 24, "Directory")
  scan = ButtonGadget  (#PB_Any , 250, 10, 60 , 24, "scan...")
  clipboard = ButtonGadget  (#PB_Any , 320, 10, 110 , 24, "Create Report File")
  DisableGadget(clipboard, 1)
  
  ListViewGadget(2,  10, 120, WindowWidth(0)-20, 460)
  
  TextGadget(3,170,60,60,24,"Progress:")
  TextGadget(4,230,60,120,24,"Select Directory")
  TextGadget(5,170,90,600,24,"Current...")
  
  countdir.l=0
  
  NewList dirlist.s()

  Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_Gadget
      
      ;{ Verzeichnis auswählen
      If EventGadget() = dir ; Verzeichnis auswählen
        Path$ =""
        Path$ = PathRequester("Bitte wählen Sie einen Pfad aus", "c:\")
        If Path$<>""
          ClearGadgetItems(pfad) 
          AddGadgetItem(pfad, -1, Path$)
          countdir=0
          SetGadgetText(5,"Current")
          SetGadgetText(4,"Select Scan...")
        EndIf
      EndIf
      ;}
      
      ;{ scan
      If EventGadget() = scan ; Read
        ClearList(dirlist()) 
        For pathindex = 0 To CountGadgetItems(pfad)
          AddElement(dirlist())
          countdir=0
          SetGadgetText(5,"Current")
          dirlist() = GetGadgetItemText(pfad, pathindex)
          praefix.s=dirlist()
        Next
        StartTime = ElapsedMilliseconds()             
      
      While ListSize(dirlist()) > 0
        FirstElement(dirlist())
        If ExamineDirectory(0, dirlist() , "*.*")
          praefix=dirlist()

          While NextDirectoryEntry(0)
            FileName$ = DirectoryEntryName(0)
            If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
              If FileName$<>"." And FileName$<>".."
              AddElement(dirlist())
              dirlist() = praefix + FileName$ + "\"
              countdir+1
              viewdir.s = dirlist()
              If CreateFile(0, dirlist()+"loeschmich.txt")
                Else
                  AddGadgetItem(2, -1, dirlist()+" read only")
                EndIf
                ;CloseFile(0)
              ;Debug dirlist()
              EndIf
            Else
              EndIf
              Delay(1)
                ElapsedTime = ElapsedMilliseconds()-StartTime 
                  If ElapsedTime > 100
                    SetGadgetText(4, Str(countdir)+ " Directorys scanned")
                    SetGadgetText(5, viewdir)
                    StartTime = ElapsedMilliseconds()             
                  EndIf
          Wend
                
          FinishDirectory(0)
          SetGadgetText(4,"Finish")
        
        EndIf ;ExamineDirectory
        
        FirstElement(dirlist())
        DeleteElement(dirlist())

      Wend ;ListSize(dirlist()) > 0
    DisableGadget(clipboard, 0)
    EndIf ;EventGadget() = scan ; Read
    ;}
    
      ;{ Clipboard
    If EventGadget() = clipboard ; Ergebnis kopieren
      CreateFile(0, "Report.txt")
      WriteStringN(0,"CPU Name: "+CPUName())
      WriteStringN(0,"Computer Name: "+ComputerName())
      WriteStringN(0,"OS Version "+Str(OSVersion()))
      WriteStringN(0,"User Name: "+UserName())
      InitNetwork() 
      WriteStringN(0,"Host Name: "+Hostname() )
      Date$ = FormatDate("%yyyy/%mm/%dd", Date())
      Time$ = FormatDate("%hh:%ii:%ss", Date())
      WriteStringN(0,"Date: "+Date$+" Time: "+Time$)
      
      
      For Eintrag= 0 To CountGadgetItems(2)
        WriteStringN(0, GetGadgetItemText(2, Eintrag))
      Next
    CloseFile(0)
    DisableGadget(clipboard, 1)
      EndIf
      ;}
    
    EndIf ;EventID = #PB_Event_Gadget
    
  Until EventID = #PB_Event_CloseWindow

EndIf ;OpenWindow(0, 100, 100, 800, 600, "Read - Write Check", #PB_Window_MinimizeGadget)

End
__________________________________________________
Code-Tags hinzugefügt
28.07.2018
RSBasic
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Schreibschutz von Verzeichnissbäumen Abfragen?

Beitrag von Sicro »

Code: Alles auswählen

Procedure.i IsWriteProtectionSet(Directory)
  Protected Result
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    Result = Bool(DirectoryEntryAttributes(Directory) & #PB_FileSystem_ReadOnly)
  CompilerElse ; #PB_OS_Linux, #PB_OS_MacOS
    Result = Bool(Not (DirectoryEntryAttributes(Directory) & #PB_FileSystem_WriteUser))
  CompilerEndIf
  ProcedureReturn Result
EndProcedure

Code: Alles auswählen

While NextDirectoryEntry(0)
  ...
  If IsWriteProtectionSet(0)
    AddGadgetItem(2, -1, dirlist()+" read only")
  EndIf
  ...
Wend
Zuletzt geändert von Sicro am 28.07.2018 20:42, insgesamt 4-mal geändert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Re: Schreibschutz von Verzeichnissbäumen Abfragen?

Beitrag von GreyEnt »

Einfach Hammer.
Dankeschön.
Und danke für die Code-Tags korrektur.
:praise:

Ich muß nach Hause und ausprobieren....
Gruß
GreyEnt
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Re: Schreibschutz von Verzeichnissbäumen Abfragen?

Beitrag von GreyEnt »

Hallo.
Hab gleich die Lösung ausprobiert.
Brauche aber doch noch mal Hilfe. :(
Tut mir Leid.
Mit der Lösung erziele ich kein Treffer.
Was hab ich da nicht richtig?

Vielen Dank schonmal.
Gruß
GreyEnt

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   RW-Check
;   Dieses Programm checkt ein Verzeichnisbaum auf schreibschutz.
;   22.07.2018 GreyEnt
;   Geschrieben für PureBasic 5.62(x64) Windows
;    
;
; ------------------------------------------------------------
;
    Macro IsWriteProtectionAvailable(Directory)
      Bool(DirectoryEntryAttributes(Directory) & #PB_FileSystem_ReadOnly)
    EndMacro


If OpenWindow(0, 100, 100, 800, 600, "Read - Write Check", #PB_Window_MinimizeGadget)
  
  pfad = ListViewGadget(#PB_Any,  10, 10, 150, 100)
  dir = ButtonGadget  (#PB_Any , 170, 10, 70 , 24, "Directory")
  scan = ButtonGadget  (#PB_Any , 250, 10, 60 , 24, "scan...")
  clipboard = ButtonGadget  (#PB_Any , 320, 10, 110 , 24, "Create Report File")
  DisableGadget(clipboard, 1)
  
  ListViewGadget(2,  10, 120, WindowWidth(0)-20, 460)
  
  TextGadget(3,170,60,60,24,"Progress:")
  TextGadget(4,230,60,120,24,"Select Directory")
  TextGadget(5,170,90,600,24,"Current...")
  
  countdir.l=0
  
  NewList dirlist.s()

  Repeat
    EventID = WaitWindowEvent()

    If EventID = #PB_Event_Gadget
      
      ;{ Verzeichnis auswählen
      If EventGadget() = dir ; Verzeichnis auswählen
        Path$ =""
        Path$ = PathRequester("Bitte wählen Sie einen Pfad aus", "c:\")
        If Path$<>""
          ClearGadgetItems(pfad) 
          AddGadgetItem(pfad, -1, Path$)
          countdir=0
          SetGadgetText(5,"Current")
          SetGadgetText(4,"Select Scan...")
        EndIf
      EndIf
      ;}
      
      ;{ scan
      If EventGadget() = scan ; Read
        ClearList(dirlist()) 
        For pathindex = 0 To CountGadgetItems(pfad)
          AddElement(dirlist())
          countdir=0
          SetGadgetText(5,"Current")
          dirlist() = GetGadgetItemText(pfad, pathindex)
          praefix.s=dirlist()
        Next
        StartTime = ElapsedMilliseconds()             
      
      While ListSize(dirlist()) > 0
        FirstElement(dirlist())
        If ExamineDirectory(0, dirlist() , "*.*")
          praefix=dirlist()

          While NextDirectoryEntry(0)
            
            FileName$ = DirectoryEntryName(0)
            If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
              If FileName$<>"." And FileName$<>".."
              AddElement(dirlist())
              dirlist() = praefix + FileName$ + "\"
              countdir+1
                            
                If IsWriteProtectionAvailable(0)
                  AddGadgetItem(2, -1, dirlist()+" read only")
                EndIf
                
              ;If CreateFile(0, dirlist()+"loeschmich.txt")
              ;  Else
              ;    AddGadgetItem(2, -1, dirlist()+" read only")
              ;  EndIf
                
              EndIf
            Else
              EndIf
              Delay(1)
                ElapsedTime = ElapsedMilliseconds()-StartTime 
                  If ElapsedTime > 100
                    SetGadgetText(4, Str(countdir)+ " Directorys scanned")
                    SetGadgetText(5, dirlist())
                    StartTime = ElapsedMilliseconds()             
                  EndIf
          Wend
                
          FinishDirectory(0)
          SetGadgetText(4,"Finish")
        
        EndIf ;ExamineDirectory
        
        FirstElement(dirlist())
        DeleteElement(dirlist())

      Wend ;ListSize(dirlist()) > 0
    DisableGadget(clipboard, 0)
    EndIf ;EventGadget() = scan ; Read
    ;}
    
      ;{ Clipboard
    If EventGadget() = clipboard ; Ergebnis kopieren
      CreateFile(0, "Report.txt")
      WriteStringN(0,"CPU Name: "+CPUName())
      WriteStringN(0,"Computer Name: "+ComputerName())
      WriteStringN(0,"OS Version "+Str(OSVersion()))
      WriteStringN(0,"User Name: "+UserName())
      InitNetwork() 
      WriteStringN(0,"Host Name: "+Hostname() )
      Date$ = FormatDate("%yyyy/%mm/%dd", Date())
      Time$ = FormatDate("%hh:%ii:%ss", Date())
      WriteStringN(0,"Date: "+Date$+" Time: "+Time$)
      
      
      For Eintrag= 0 To CountGadgetItems(2)
        WriteStringN(0, GetGadgetItemText(2, Eintrag))

        ;Debug Zeile$
        ;Text$=Text$+Zeile$
      Next
    CloseFile(0)
        ;ClearClipboard()
        ;SetClipboardText(Text$)
    DisableGadget(clipboard, 1)
      EndIf
      ;}
    
    EndIf ;EventID = #PB_Event_Gadget
    
  Until EventID = #PB_Event_CloseWindow

EndIf ;OpenWindow(0, 100, 100, 800, 600, "Read - Write Check", #PB_Window_MinimizeGadget)

End
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Schreibschutz von Verzeichnissbäumen Abfragen?

Beitrag von Sicro »

Ich habe herausgefunden, dass unter Windows Verzeichnisse im Normalfall keinen Schreibschutz-Attribut haben können:
FILE_ATTRIBUTE_READONLY
A file that is read-only. Applications can read the file, but cannot write to it or delete it. This attribute is not honored on directories.
Quelle: https://docs.microsoft.com/de-de/window ... -constants

Hier noch ein paar Informationen darüber:
https://www.drwindows.de/windows-anleit ... uetzt.html

Ich habe meinen Code mit

Code: Alles auswählen

SetFileAttributes(DirectoryPath$, #PB_FileSystem_ReadOnly)
getestet, dass das Schreibschutz-Attribut mit "Gewalt" setzt.

Wie es aussieht, ist deine ursprüngliche Vorgehensweise (Testdatei erstellen) die einfachste und beste Methode.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Re: Schreibschutz von Verzeichnissbäumen Abfragen?

Beitrag von GreyEnt »

@Sicro.
Ich habe zu danken. :praise: :allright:
Gruß
GreyEnt
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Antworten