WSH - Besitz übernehmen, Ordner-Inhalte

cumulonimbus8

Fleet Admiral
Registriert
Apr. 2012
Beiträge
18.928
Hallo!

Vermutlich habe ich da schlicht einen Meter zu kurz gedacht oder mich verstolpert.

Über einen erprobte rekursiven Aufruf wollte ich innerhalb einer Ordnerstruktur (also dieser Ordner und alle darunter mit allem darin) den Besitz übernehmen. Was für das (rein ordnerbezogene) Setzen des Read-Only-Attributes (klar erkannt, Icons für Ordner unter XP die über XCOPY oder ROBOCOPY angelegt wurden, wobei natürlich die DeskTop.Ini mitkommt, nur das Attribut nicht…) kappt das so weit reibungslos.
Code:
DIM WSHShell, WScriptShell, FSO, Argumente, Argument, QT, Meldung
SET WSHShell = WScript.CreateObject("WScript.Shell")
SET WScriptShell = WScript.CreateObject("WScript.Shell") 
SET FSO = CreateObject("Scripting.FileSystemObject")

QT = CHR(34)
Argumente = Wscript.Arguments.Count
IF Argumente = 0 THEN WScript.Quit
Argument=UCASE(Wscript.Arguments(0))
REM Der Mutterordner muss aus der Iteration raus
Meldung = Argument & " (" & FSO.GetFolder(Argument).Files.Count & ")"
WSHShell.Run "TAKEOWN " & QT & Argument & QT, 7, FALSE
CALL DateienAblaufen(Argument)
REM Nun der eigentliche Lauf durch die Struktur
CALL OrdnerAbsuchen (Argument)
WSHShell.PopUp Meldung, 15, "Bearbeitet wurden:", 64 + 0
WScript.Quit

SUB OrdnerAbsuchen(LW)
DIM Ordner
DIM OrdnerName
 IF FSO.GetFolder(LW & "\").SubFolders.Count > 0 THEN
  FOR EACH Ordner IN FSO.GetFolder(LW & "\").SubFolders
   OrdnerName = LW & "\" & Ordner.Name
   Meldung = Meldung  & vbCr & LW & "\" & Ordner.Name & _
    " (" & FSO.GetFolder(LW & "\" & Ordner.Name).Files.Count & ")"
   WSHShell.Run "TAKEOWN " & QT & LW & "\" & Ordner.Name & QT, 7, FALSE
   CALL DateienAblaufen(LW & "\" & Ordner.Name)
   CALL OrdnerAbsuchen(LW & "\" & Ordner.Name)
  NEXT
 END IF
END SUB

SUB DateienAblaufen(OD)
DIM Datei
 IF FSO.GetFolder(OD).Files.Count > 0 THEN
  FOR EACH Datei IN FSO.GetFolder(OD).Files
   WSHShell.Run "TAKEOWN " & QT & OD & "\" & Datei.Name & QT, 7, FALSE
  NEXT
 END IF
END SUB
Offensichtlich knallt es in Zeile 22 weil ich da wie es scheint keine Rechte auf den Ordner habe - bloß dachte ich in Zeile 12 mir die schon an Land gezogen zu haben?
Welche Bäume stehen da die verhindern, dass ich den Wald sehe?

CN8
 
Ginge vielleicht auch… …oder evtl. nicht

Im Grunde war da ja Code den ich einfach umgestrickt hatte. Typische Weiterdenkfaulheit.

CACLS wird mir allerdings für «Datei» in seiner Hilfe angezeigt, mein Plan war aber (unkompliziertes TAKOWN.EXE) über das Kontextmenü eines Ordners bzw. eben dann mit allem Inhalt auszulösen. Eine einzelne Datei erreiche ich über HKCR\*\SHELL.
Welche CACLS-Syntax, mit einem Ordner gefüttert, übernimmt für ihn und alles darin den Besitz (also User durch mich ersetzen)?

CN8


Also stellen wir die Frage anders:
nach dem gespoilerten Code müsste ich doch in Zeile 12 mir so viele Rechte beschafft haben zumindest diese Ordner zu sichten wie viele Unterordner (item Dateien) da drin sind.
Was also geht da vom Grundsatz her schief, dass VBS und sein FSO dort gegen die Wand knallt?


Eben hatte ich CHKDSK-Reste gefunden und so eine Funktion gebraucht. War, mit Formel-1 nebendran im Fernseher eine schneckenlahme Kickarbeit…

Gibts also einen passende CACLS-Befehl? Oder wenn nicht: wie will ich in VBS an die Informationen kommen die mir der Explorer per Anzeige und gewiss auch DIR mühelos zu liefern im Stande sind?
 
Zuletzt bearbeitet:
WSH - Besitz übernehmen, Ordner-Inhalte / Des Rätsels Lösung

Wie es scheint war die Aktion ungeschickt gestrickt (Reihenfolge) und der Prozesser ist natürlich flotter als die Platte:
Code:
DIM WSHShell, WScriptShell, FSO, Argumente, Argument, QT, Meldung
SET WSHShell = WScript.CreateObject("WScript.Shell")
SET WScriptShell = WScript.CreateObject("WScript.Shell") 
SET FSO = CreateObject("Scripting.FileSystemObject")

QT = CHR(34)
Argumente = Wscript.Arguments.Count
IF Argumente = 0 THEN WScript.Quit
Argument=UCASE(Wscript.Arguments(0))
REM Der Mutterordner muss aus der Iteration raus
WSHShell.Run "TAKEOWN " & QT & Argument & QT, 7, FALSE
REM Unser Prozessor ist flotter als das Dateisystem…
CALL Warte
REM …diese Abfrage würde deswegen knallen.
Meldung = Argument & " (" & FSO.GetFolder(Argument).Files.Count & ")"
CALL DateienAblaufen(Argument)
REM Nun der eigentliche Lauf durch die Struktur
CALL OrdnerAbsuchen (Argument)
WSHShell.PopUp Meldung, 15, "Bearbeitet wurden:", 64 + 0
WScript.Quit

SUB OrdnerAbsuchen(LW)
DIM Ordner
DIM OrdnerName
 FOR EACH Ordner IN FSO.GetFolder(LW & "\").SubFolders
  OrdnerName = LW & "\" & Ordner.Name
  WSHShell.Run "TAKEOWN " & QT & LW & "\" & Ordner.Name & QT, 7, FALSE
  CALL Warte
  Meldung = Meldung  & vbCr & LW & "\" & Ordner.Name & _
   " (" & FSO.GetFolder(LW & "\" & Ordner.Name).Files.Count & ")"
  CALL DateienAblaufen(LW & "\" & Ordner.Name)
  CALL OrdnerAbsuchen(LW & "\" & Ordner.Name)
 NEXT
END SUB

SUB DateienAblaufen(OD)
DIM Datei
 IF FSO.GetFolder(OD).Files.Count > 0 THEN
  FOR EACH Datei IN FSO.GetFolder(OD).Files
   WSHShell.Run "TAKEOWN " & QT & OD & "\" & Datei.Name & QT, 7, FALSE
  NEXT
 END IF
END SUB

SUB Warte
DIM PlusEins
 PlusEins=TIMER+1
 WHILE TIMER < PlusEins
 WEND
END SUB
Man muss (aua, aua, aua…) erst mal etwas besitzen bevor man Informationen erhebt (die Meldung-Zeilen) und man muss dem Dateisystem Zeit geben die Besitzübernahme wortwörtlich zu realisieren, also wartet man ein Sekündchen.
Vor dem For-Each würde auch wieder die Abfrage auf ist-was-drin einen Unfall generieren. Wieso ich das überhaupt vor das For-Each geschaltet habe frage ich mich gerade da For-Each hier mühelos auch ein Nichts verdaut.

CN8
 
Zurück
Oben