Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Besitzer von Ordnern mit VB-Script auslesen

Frage Entwicklung VB for Applications

Mitglied: Edi.Pfisterer

Edi.Pfisterer (Level 2) - Jetzt verbinden

01.02.2010, aktualisiert 17:59 Uhr, 13221 Aufrufe, 29 Kommentare

da die Frage vor ein paar Tagen auftauchte und ich auch keine Lösung gefunden habe...

Hallo!
Problem:
Alle Ordner in einem Unterordner und deren Besitzer sollen in ein Excel-File ausgegeben werden
siehe hier

Hier meine Lösung:

Das Ding besteht aus 2 Dateien (besser gings auf die schnelle nicht...)

1.) ordner.vbs:


01.
 
02.
ordner = "Z:\2009_2010" 
03.
Set fs = CreateObject("Scripting.FileSystemObject") 
04.
Set f1 = fs.GetFolder(ordner) 
05.
for each unterordner in f1.subfolders 
06.
listunter = listunter & unterordner & vbcrlf 
07.
 
08.
Set WshShell = WScript.CreateObject("WScript.Shell") 
09.
ret = WshShell.Run ("besitzer.cmd " & ordner) 
10.
 
11.
 
12.
 
13.
   Set File = fs.OpenTextFile("temp.txt" , 1, true) 
14.
     ' Datei zum Lesen öffnen 
15.
 
16.
 
17.
Do While not file.AtEndOfStream 
18.
   besitzer = besitzer & file.ReadLine 
19.
Loop 
20.
 
21.
listunter = listunter & besitzer & vbcrlf 
22.
next 
23.
 
24.
 
25.
SET objfs= createobject("scripting.filesystemobject") 
26.
strdateiname = "Ordnerliste.csv" 
27.
set objtextstream = objfs.createtextfile(strdateiname, True) 
28.
strwritestring = listunter 
29.
objtextstream.write strwritestring 
30.
objtextstream.close 
31.
set objtextstream = nothing 
32.
set objfs = nothing 
33.
 
2.) besitzer.cmd

01.
echo J | cacls %1 > temp.txt
Diese Lösung hat allerdings 2 Bugs:

1.) Sie funktioniert nicht, wenn der Überordner ein Leerzeichen enthält wie zB Dokumente und Einstellungen
2.) Der schlimmere Fehler:
Er liest alle Berechtigungen aus, nur nicht den Besitzer...



FALLS JEMAND HELFEN KANN: BITTE DARUM!

Danke
29 Antworten
Mitglied: AndreasBrecht
01.02.2010 um 20:00 Uhr
Schau mal dort : http://www.indented.co.uk/index.php/2009/02/19/reading-ntfs-and-share-s ...
das sollte Dich auf die richtige Spur setzen (suche einfach nach Owner)
Falls Du es zusammenkriegst, könntest Du ja das Ergebnis posten
Bitte warten ..
Mitglied: bastla
01.02.2010 um 20:39 Uhr
... ansonsten als Abwandlung Deines Ansatzes mit Verwendung einer CMD-Zeile:
01.
ordner = "Z:\2009_2010" 
02.
Liste = "Z:\Ordnerliste.txt" 
03.
Set fs = CreateObject("Scripting.FileSystemObject") 
04.
Set f1 = fs.GetFolder(ordner) 
05.
If fs.FileExists(Liste) Then fs.DeleteFile(Liste) 
06.
Set WshShell = CreateObject("WScript.Shell") 
07.
For Each unterordner In f1.Subfolders 
08.
    listunter = listunter & unterordner & vbcrlf  
09.
    CMD = "cmd /c for /f ""skip=7 tokens=4*"" %a in ('dir """ & unterordner & """/q^|findstr /v ""Datei(en) Verzeichnis(se)""') do @echo %a;%b" 
10.
    besitzer = WshShell.Exec(CMD).StdOut.ReadAll 
11.
    listunter = listunter & besitzer & vbcrlf 
12.
Next 
13.
fs.CreateTextFile(Liste).Write listunter
BTW: Weshalb soll es denn VBS sein? Unter CMD wäre es eine (zugegeben etwas längere ) Zeile (hier zum Testen als Version für die Direkteingabe an der Kommandozeile):
01.
for /d %i in ("Z:\2009_2010\*.*") do @(echo %i & @(for /f "skip=7 tokens=4*" %a in ('dir "%i"/q^|findstr /v "Datei(en) Verzeichnis(se)"') do @echo %a;%b) & @echo\)>>Ordnerliste.csv
oder (etwas "transparenter") als Batch:
01.
@echo off & setlocal 
02.
set "Ordner=Z:\2009_2010" 
03.
set "Liste=Z:\Ordnerliste.csv" 
04.
 
05.
del "%Liste%" 2>nul 
06.
for /d %%i in ("%Ordner%\*.*") do ( 
07.
    echo %%i 
08.
    for /f "skip=7 tokens=4*" %%a in ('dir "%%i"/q^|findstr /v "Datei(en) Verzeichnis(se)"') do echo %%a;%%b 
09.
    echo\ 
10.
)>>"%Liste%"
Grüße
bastla
Bitte warten ..
Mitglied: Edi.Pfisterer
01.02.2010 um 21:25 Uhr
ja, Weltklasse!!!
bin masslos begeistert...

einige Fragen hätte ich noch...
(in aller untertänigen Bewunderung

also, ich (bzw. der Kollege von der ursprünglichen Anfrage) wollte eigentlich folgendes Format:

ORDNER; USERNAME (der ";" wegen der besseren Lesbarkeit in der .csv)

ich hab nun Dein vbs-Script verwendet (weil ich mich mit noch eher auskenne als mit DOS), konnte das gewünschte aber nicht ganz herbringen und mit allem probieren ist es auch nicht besser geworden...

bei mir sieht das Ergebnis Deines Entwurfes beispielsweise wie folgt aus:

01.
Z:\2009_2010\000kiri 
02.
domain\Thomas.BOEH!skichallenge; 
03.
domain\Andreas.GHADok1.docx; 
04.
domain\Andreas.GHADok2.docx; 
05.
domain\Andreas.GHADok3.docx;

dh, er zeigt mir
1.) leider nicht den ganzen Benutzernamen (ich habe da vermutet, durch ändern des Wertes Skip etwas zu bewirken - war aber falsche Vermutung)
2.) beinhaltet diese Angabe nicht nur Ordner...
3.) erscheinen die Werte in der falschen Reihenfolge (erst Username, dann Ordner); durch Austausch der Werte a% und b% ist auch nicht das gewünschte passiert...

langer Rede, kurzer Sinn:
ich verstehe leider Bahnhof (ich EI) und würde mich dennoch freuen, wenn Du für mich eine Lösung hättest, die das gewünschte Ergebnis bringt...

Danke jedenfalls für Deine Mühe!!!
Bitte warten ..
Mitglied: bastla
01.02.2010 um 22:03 Uhr
Hallo urobe73!

Da bin ich dann wohl etwas über das Ziel hinausgeschossen und bei den Ordnerinhalten gelandet ...

Wenn es tatsächlich nur um die Unterordner einer Ebene geht, würde ich Dir dennoch die Batch-Variante aufdrängen wollen :
01.
@echo off & setlocal 
02.
set "Ordner=Z:\2009_2010" 
03.
set "Liste=Z:\Ordnerliste.csv" 
04.
 
05.
del "%Liste%" 2>nul 
06.
for /f "skip=7 tokens=4*" %%a in ('dir "%Ordner%" /ad /q^|findstr /v "Datei(en) Verzeichnis(se)"') do echo %%b;%%a>>"%Liste%"
Im Prinzip wird dabei nur ein "dir"-Befehl verwendet und dessen Ausgabe durch das Weglassen der ersten 7 und der letzten beiden Zeilen sowie das Reduzieren auf die relevanten Spalten "behübscht" - konkret:
dir "%Ordner%" /ad /q
liefert eine Liste aller Ordner (wegen "/ad") in "Z:\2009_2010" und gibt zusätzlich zu den "üblichen" Informationen Datum, Zeit und "<DIR>" als Kennzeichen eines Ordners auch den Besitzer an.
findstr /v "Datei(en) Verzeichnis(se)"
filtert alle Zeilen, welche die Strings "Datei(en)" oder "Verzeichnis(se)" enthalten (sollte nur auf die beiden letzten Zeilen zutreffen), aus dem Ergebnis heraus.
for /f "skip=7 tokens=4*" %a
überspringt zum Einen die ersten 7 Zeilen (bis zur Zeile mit "..") und legt zum Anderen fest, dass nur die Spalten 4 (=Besitzer) und alles was danach kommt (=Ordnername mit beliebig vielen Leerzeichen) verwendet werden sollen. Als Trennzeichen zwischen den Spalten gelten defaultmäßig (und sind daher nicht angegeben) Leerzeichen und TAB - damit bleibt von zB
31.01.2010  15:49    <DIR>          DOMÄNE\User           Ein Test-Unterordner
als %%a "DOMÄNE\User" und als %%b "Ein Test-Unterordner". Diese beiden Teile werden schließlich mittels
echo %%b;%%a>>"%Liste%"
(durch ";" getrennt) in der gewünschten Reihenfolge an das Ende der Listendatei angefügt (wegen ">>" und nicht ">", weil Letzteres jedes Mal eine neue Datei erstellen und die bereits Vorhandene damit überschreiben würde).
Ein VBScript zum Aufruf dieses Batches hätte mE keinen Sinn, da nur der Name der Listendatei und der zu bearbeitende Ordner übergeben werden müssten - die Schleife für die "Subfolders" entfiele, da der "dir"-Befehl dies gleich mit erledigt, und auch das Schreiben in die Datei geht in CMD sehr einfach.

Falls es dennoch Dein großer Wunsch sein sollte, das Ganze in VBS "einzukleiden", kann ich das natürlich noch nachreichen ...

... aber dann wäre es ja gleich besser, den Vorschlag von AndreasBrecht aufzugreifen ...

Grüße
bastla

[Edit] Wenn übrigens die gesamte Unterordnerstruktur abgegrast werden sollte, wäre der Batch nur unwesentlich länger:
01.
@echo off & setlocal 
02.
set "Ordner=Z:\2009_2010" 
03.
set "Liste=Z:\Ordnerliste.csv" 
04.
 
05.
del "%Liste%" 2>nul 
06.
for /r "%Ordner%" %%i in (.) do for /f "skip=7 tokens=4*" %%a in ('dir "%%i" /ad /q^|findstr /v "Datei(en) Verzeichnis(se)"') do echo %%~fi\%%b;%%a>>"%Liste%"
[/Edit]
Bitte warten ..
Mitglied: bastla
01.02.2010 um 22:23 Uhr
@AndreasBrecht
... könntest Du ja das Ergebnis posten
Auch wenn ich nicht direkt angesprochen war :
01.
Ordner = "Z:\2009_2010" 
02.
Liste = "Z:\Ordnerliste.csv" 
03.
 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
If fso.FileExists(Liste) Then fso.DeleteFile(Liste) 
06.
Set objWMI = GetObject("winmgmts://./root/cimv2") 
07.
For Each Unterordner In fso.GetFolder(ordner).Subfolders 
08.
    objWMI.Get("Win32_LogicalFileSecuritySetting='" & Unterordner & "'").GetSecurityDescriptor objSD 
09.
    Listunter = Listunter & vbCrLf & Unterordner.Name & ";" & objSD.Owner.Domain & "\" & objSD.Owner.Name 
10.
Next 
11.
fso.CreateTextFile(Liste).Write Mid(Listunter, 3)
Grüße
bastla
Bitte warten ..
Mitglied: Edi.Pfisterer
02.02.2010 um 08:16 Uhr
@bastla:
Du bist - für heute zumindest - mein Held!!!

Wirklich weltklasse Lösung UND dazu noch so erklärt, dass es sogar ein DOS-mässiger Nichtschwimmer wie ich kapiert!
Wirklich wirklich super! Vielen Dank!!!

Ich habe natürlich alle Vorschläge ausprobiert! Leider ist mir bei
01.
@echo off & setlocal 
02.
set "Ordner=Z:\2009_2010" 
03.
set "Liste=Z:\Ordnerliste.csv" 
04.
 
05.
del "%Liste%" 2>nul 
06.
for /r "%Ordner%" %%i in (.) do for /f "skip=7 tokens=4*" %%a in ('dir "%%i" /ad /q^|findstr /v "Datei(en) Verzeichnis(se)"') do echo %%~fi\%%b;%%a>>"%Liste%"
aufgefallen, dass es bei den Usernames noch irgendein Problem gibt.

Das Ergebnis sieht in manchen Zeilen auszugsweise so aus:
Spalte 1: Z:\2009_2010\000kiri\
Spalte 2: DOMAIN\Thomas.BOEH!skichallenge
Die Realtität in diesem Beispiel sieht allerdings so aus, dass es einen Ordner Z:\2009_2010\000kiri\!skichallenge gibt, der dem User Thoams.BOEH gehört...

Ist nicht weiter schlimm, aber vielleicht hast du sogar dafür noch eine Lösung....

Das VBScript liefert diesen beinahe richtige Ergebnis nicht.
Frage allerdings dazu: Du hast sicher eine Idee, wie man auch in diesem Script zusätzlich die gesamte Ordnerstruktur durchsucht, oder?
Falls dem so ist: ich würde mich mächtig freuen, wenn Du mich ein bissl teilhaben lassen würdest an Deinen Fähigkeiten..

Danke nochmals
lg
Bitte warten ..
Mitglied: bastla
02.02.2010 um 09:37 Uhr
Hallo urobe73!

Gib bitte folgenden Befehl an der Kommandozeile ein
dir /ad /q Z:\2009_2010\000kiri>Z:\Inhalt.txt
und poste (unter Verwendung von Code-Tags) aus der entstandenen Datei "Z:\Inhalt.txt" die Zeile mit "!skichallenge" ...

Übrigens: Welches BS verwendest Du?
Die rekursive VBS-Variante könnte etwa so aussehen:
01.
StartOrdner = "Z:\2009_2010" 
02.
Liste = "Z:\Ordnerliste.csv" 
03.
 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
If fso.FileExists(Liste) Then fso.DeleteFile(Liste) 
06.
Set objWMI = GetObject("winmgmts://./root/cimv2") 
07.
 
08.
Listunter = "" 
09.
BearbeiteUnterordner fso.GetFolder(StartOrdner) 
10.
fso.CreateTextFile(Liste).Write Mid(Listunter, 3) 
11.
 
12.
Sub BearbeiteUnterordner(Ordner) 
13.
For Each Unterordner In Ordner.Subfolders 
14.
    objWMI.Get("Win32_LogicalFileSecuritySetting='" & Unterordner.Path & "'").GetSecurityDescriptor objSD 
15.
    Listunter = Listunter & vbCrLf & Unterordner.Path & ";" & objSD.Owner.Domain & "\" & objSD.Owner.Name 
16.
    BearbeiteUnterordner Unterordner 
17.
Next 
18.
End Sub
Voraussetzung ist dabei natürlich, dass das Script mit den erforderlichen Berechtigungen ausgeführt wird.

Grüße
bastla
Bitte warten ..
Mitglied: Edi.Pfisterer
02.02.2010 um 10:35 Uhr
hallo!
ich habe - entgegen Deiner Anforderungen - mal die gesamte Ausgabe hier eingestellt....
01.
 Datentr„ger in Laufwerk Z: ist Volume 
02.
 Volumeseriennummer: 3E72-2972 
03.
 
04.
 Verzeichnis von Z:\2009_2010\000kiri 
05.
 
06.
27.01.2010  13:34    <DIR>          DOMAIN\Andreas.GHA. 
07.
27.01.2010  13:34    <DIR>          VORDEFINIERT\Administra.. 
08.
20.01.2010  13:09    <DIR>          DOMAIN\Thomas.BOEH!skichallenge 
09.
               0 Datei(en)              0 Bytes 
10.
               3 Verzeichnis(se), 280.043.802.624 Bytes frei
Der Ordner 000kiri befindet sich im Besitz von Andreas.GHA
Der Unterordner !skichallenge gehört Thomas.BOEH

Ich hoffe, du kannst mit diesen Angaben etwas anfangen...
Danke!!!

[edit: ich verwende div. Server2008/2008R2 sowie XP --> dh, Z: ist in Wirklichkeit ein Share...]
Bitte warten ..
Mitglied: Edi.Pfisterer
02.02.2010 um 10:49 Uhr
Hallo!
habe jetzt auch die VBS-Version getestet...
Leider bringt sie mir - allerdings nicht immer! - folgenden Fehler

Zeile 14
zeichen 5
Ungültiger Objektpfad
Code: 8004103A
Quelle: SWbemServicesEx

Ich hab es auch schon mit unterschiedlichen Ordnern getestet und leider in 2 von 3 Fällen diesen Fehler erhalten...

An den Rechten kann es nicht gescheitert sein, hab die Tests auch als lokaler Admin auf lokalen Ordnern probiert...
Bitte warten ..
Mitglied: bastla
02.02.2010, aktualisiert 12.11.2013
Hallo urobe73!

Ich hatte mit XP getestet und die oben dargestellte Form der Ausgabe
31.01.2010  15:49    <DIR>          DOMÄNE\User           Ein Test-Unterordner
erhalten - dadurch war die Zerlegung problemlos möglich ...
Ein Server2003 liefert zB
26.10.2009  10:12    <DIR>          VORDEFINIERT\AdministraConf
- hier müsste (wegen des langen Besitzernamens) schon an der Spaltenposition 63 (was sich auch realisieren ließe) getrennt werden.
Wenn allerdings im Vergleich dazu
27.01.2010  13:34    <DIR>          VORDEFINIERT\Administra..
überhaupt keinen Ordnernamen mehr liefert, kann das leider mit der Batch-Version nicht klappen ...

Grüße
bastla

P.S.: Jetzt habe ich leider wirklich nicht mehr Zeit
Bitte warten ..
Mitglied: Edi.Pfisterer
02.02.2010 um 12:41 Uhr
hallo bastla!
Das mit Spaltenposition 63 klingt gut!
denn:
01.
27.01.2010  13:34    <DIR>          DOMAIN\Andreas.GHA.  
02.
27.01.2010  13:34    <DIR>          VORDEFINIERT\Administra..
entspricht doch in wirklichkeit denZeilen
01.
27.01.2010  13:34    <DIR>          . 
02.
27.01.2010  13:34    <DIR>          ..
das lässt mich vermuten, dass die 1. Zeile den Besitzer des aktuellen Ordners zeigt, die 2. Zeile zeigt "was weis ich was".
das eigentlich interessante ist ja die 3. Zeile, die den Besitzer des Unterordners zeigt (oder?)
01.
20.01.2010  13:09    <DIR>          DOMAIN\Thomas.BOEH!skichallenge 
hm...
Bitte warten ..
Mitglied: 77575
02.02.2010 um 20:01 Uhr
hallo an alle,

ich war der erzeuger des ursprünglichen beitrages.
mein ziel war es eigentlich die berechtigungen mit icacls von ordnerstrukturen in eine textdatei zu bekommen.
der befehl icacls gibt schon das richtige format aus, nur das er auch alle inhalte mit ausgibt, was bei einigen tausend dateien recht unübersichtlich wird.

Die Ausgabe sieht dann so aus:
01.
D:\Downloads\Tesst\ BUILTIN\Users: (OI)(CI)(M) 
02.
                    meinPC\benutzer1: (OI)(CI)(F) 
03.
                    BUILTIN\Administrators: (I)(F) 
04.
                    BUILTIN\Administrators: (I)(OI)(CI)(IO)(F) 
05.
                    NT AUTHORITY\SYSTEM: (I)(F) 
06.
                    NT AUTHORITY\SYSTEM: (I)(OI)(CI)(IO)(F) 
07.
                    NT AUTHORITY\Authenticated Users: (I)(M) 
08.
                    NT AUTHORITY\Authenticated Users: (I)(OI)(CI)(IO)(M) 
09.
                    BUILTIN\Users: (I)(RX) 
10.
                    BUILTIN\Users: (I)(OI)(CI)(IO)(GR,GE) 
11.
 
12.
D:\Downloads\Tesst\blahblub BUILTIN\Users: (I)(OI)(CI)(M) 
13.
                            meinPC\benutzer1: (I)(OI)(CI)(F) 
14.
                            BUILTIN\Administrators: (I)(F) 
15.
                            BUILTIN\Administrators: (I)(OI)(CI)(IO)(F) 
16.
                            NT AUTHORITY\SYSTEM: (I)(F) 
17.
                            NT AUTHORITY\SYSTEM: (I)(OI)(CI)(IO)(F) 
18.
                            NT AUTHORITY\Authenticated Users: (I)(M) 
19.
                            NT AUTHORITY\Authenticated Users: (I)(OI)(CI)(IO)(M) 
20.
                            BUILTIN\Users: (I)(OI)(CI)(IO)(GR,GE) 
21.
 
22.
D:\Downloads\Tesst\test2.rar BUILTIN\Users: (I)(M) 
23.
                             meinPC\benutzer1: (I)(F) 
24.
                             BUILTIN\Administrators: (I)(F) 
25.
                             NT AUTHORITY\SYSTEM: (I)(F) 
26.
                             NT AUTHORITY\Authenticated Users: (I)(M) 
27.
 
28.
D:\Downloads\Tesst\testdatei.txt BUILTIN\Users: (I)(M) 
29.
                                 meinPC\benutzer1: (I)(F) 
30.
                                 BUILTIN\Administrators: (I)(F) 
31.
                                 NT AUTHORITY\SYSTEM: (I)(F) 
32.
                                 NT AUTHORITY\Authenticated Users: (I)(M) 
33.
 
34.
D:\Downloads\Tesst\blahblub\sdgsdfg NT AUTHORITY\Authenticated Users: (OI)(CI)(M) 
35.
                                    NT AUTHORITY\SYSTEM: (OI)(CI)(F) 
36.
                                    meinPC\benutzer1: (OI)(CI)(RX) 
37.
                                    BUILTIN\Administrators: (OI)(CI)(F) 
38.
                                    BUILTIN\Users: (CI)(RX)
Wie man sieht mit den enthaltenen Dateien.

Ich will das ganze auch nicht weiterverarbeiten, deshalb reicht mir ein Textdatei. ist eine reine dokumentation.
es hätte ja sein können das jemand ein tool kennt das genau diese aufgabe erfüllt.
schade das icacls keinen schalter dafür hat.

aber trotzdem danke für die hier geposteten code. kann man immer gebrauchen.
..und was den bastla angeht...echt der hammer. der kennt für jede aufgabe nen cmd schnipsel
da bin ich schon etwas neidisch, wäre froh wenn ich so 'nen draht und verständniss dafür hätte.

gruss 010101
Bitte warten ..
Mitglied: bastla
02.02.2010 um 21:47 Uhr
Hallo urobe73!

So - jetzt bin ich hoffentlich etwas konzentrierter als am Vormittag ...

Noch ein Versuch mit Batch:
01.
@echo off & setlocal 
02.
set "Ordner=Z:\2009_2010" 
03.
set "Liste=Z:\Ordnerliste.csv" 
04.
 
05.
for /f "tokens=3 delims=:. " %%i in ('chcp 1252') do set "CP=%%i" 
06.
del "%Liste%" 2>nul 
07.
for /r "%Ordner%" %%i in (.) do for /f "skip=7 tokens=3*" %%a in ('dir "%%i" /ad /q^|findstr /v "Datei(en) Verzeichnis(se)"') do set "Info=%%b" & call :ProcessDir "%%~fi" 
08.
chcp %CP%>nul 
09.
goto :eof 
10.
 
11.
:ProcessDir 
12.
>>"%Liste%" echo "%~1\%Info:~23%";%Info:~,23% 
13.
goto :eof
Damit das wie gewünscht funktionieren kann, müsste allerdings bei Dir die oben besprochene Zeile
20.01.2010  13:09    <DIR>          DOMAIN\Thomas.BOEH!skichallenge
so aussehen:
20.01.2010  13:09    <DIR>          DOMAIN\Thomas.BOEH     !skichallenge
da hier zeichenweise (Name = alles nach den ersten 23 Zeichen, Besitzer = erste 23 Zeichen des 4. Tokens - also im Beispiel: "DOMAIN\Thomas.BOEH !skichallenge") aufgeteilt wird.

Umlaute sollten inzwischen auch vernünftig dargestellt werden.
Hinsichtlich der VBS-Variante habe ich noch nicht vermutlich herausgefunden, wodurch der beschriebene Fehler ausgelöst wird - einen Verdacht habe ich allerdings: Könnte es sein, dass ein Ordnername ein Apostroph enthält? Falls ja, versuch es zwischenzeitlich damit:
01.
StartOrdner = "Z:\2009_2010" 
02.
Liste = "Z:\Ordnerliste.csv" 
03.
 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
Set objWMI = GetObject("winmgmts://./root/cimv2") 
06.
 
07.
Set Liste = fso.CreateTextFile(Liste) 
08.
On Error Resume Next 
09.
BearbeiteUnterordner fso.GetFolder(StartOrdner) 
10.
Liste.Close 
11.
 
12.
Sub BearbeiteUnterordner(Ordner) 
13.
For Each Unterordner In Ordner.Subfolders 
14.
    objWMI.Get("Win32_LogicalFileSecuritySetting=""" & Replace(Unterordner.Path, "\", "\\") & """").GetSecurityDescriptor objSD 
15.
    Liste.WriteLine Unterordner.Path & ";" & objSD.Owner.Domain & "\" & objSD.Owner.Name 
16.
    BearbeiteUnterordner Unterordner 
17.
Next 
18.
End Sub
Da jetzt sofort in die Ausgabedatei geschrieben wird, lässt sich auch nachvollziehen, welches der letzte ordnungsgemäß verarbeitete Ordner war.
Übrigens:
die 2. Zeile zeigt "was weis ich was"
Mit ".." ist immer der übergeordnete Ordner gemeint; sehr nützlich bei relativen Pfadangaben - so kommst Du zB mit
cd ..\Nachbar
in den benachbarten Ordner, ohne wissen zu müssen, wo sich die gesamte Ordnerstruktur befindet (bzw wie der übergeordnete Ordner heißt) - typische Anwendung etwa bei Websites ...

Grüße
bastla
Bitte warten ..
Mitglied: bastla
02.02.2010, aktualisiert 12.11.2013
@ 010101
Eigentlich kenne ich nur so 3 bis 4 CMD-Schnipsel (und so gut wie alle davon hier aus dem Forum, besonders aus Bibers Kommentaren) - aber damit lässt sich gelegentlich schon was anfangen ...
Für Deine Zielsetzung könnte vielleicht AccessEnum das richtige Werkzeug sein ...

Grüße
bastla
Bitte warten ..
Mitglied: Edi.Pfisterer
03.02.2010 um 11:09 Uhr
@ bastla!

OH YEAH, BABY
der letzte VB-Code macht genau das, was er soll!

Das Problem mit dem batch dürfte bei mir wohl genau an folgendem - von Dir geschilderten - liegen:

Damit das wie gewünscht funktionieren kann, müsste allerdings bei Dir die oben besprochene Zeile
01.
> 20.01.2010  13:09    <DIR>          DOMAIN\Thomas.BOEH!skichallenge 
02.
> 
so aussehen:
01.
> 20.01.2010  13:09    <DIR>          DOMAIN\Thomas.BOEH     !skichallenge 
02.
> 
da hier zeichenweise (Name = alles nach den ersten 23 Zeichen, Besitzer = erste 23 Zeichen des 4. Tokens - also im >Beispiel: "DOMAIN\Thomas.BOEH !skichallenge") aufgeteilt > wird.

NAMEMEINERDOMAIN\Thomas.BOEH hat zusamen 23 Buchstaben...
daher wird auch der Username abgeschnitten (der User heisst in Wirklichkeit Thomas.BOEHM)...

jedenfalls:
VIELEN VIELEN DANK für Deine Anregungen! hab wieder viel dazugelernt, und das Produkt kann man so als eigenständige Software sofort einsetzen!

@010101

Verwende den vb-code von "bastla". Der erzeugt Dir genau die Lösung für die von Dir beschriebene Anforderung.
Zeile 1 und 2 entsprechend ändern, als vbs speichern und fertig!

DANKE an Euch - für die Anregung und für die Hilfe!!!
Bitte warten ..
Mitglied: 77575
03.02.2010 um 19:48 Uhr
Zitat von Edi.Pfisterer:
@010101

Verwende den vb-code von "bastla". Der erzeugt Dir genau die Lösung für die von Dir beschriebene Anforderung.
Zeile 1 und 2 entsprechend ändern, als vbs speichern und fertig!

DANKE an Euch - für die Anregung und für die Hilfe!!!

hi,
nee tut es nicht. es werden zwar nur die ordner aufgelistet, aber keine berechtigungen.
mir ging es vorallem darum die vorhandenen berechtigungen zu dokumentieren, nicht nur welcher benutzer oder gruppe zusätzlich zu den vererbten berechtigungen vorhanden sind.

das accessenum wirft auch nur aus, wer berechtigt ist, nicht aber welche berechtigung.

aber egal, danke für eure mühen und den nützlichen beitrag. der ein oder andere kann die hier geposteten code sicher für seine eigenen belange verwenden oder anpassen.

gruss 010101
Bitte warten ..
Mitglied: bastla
03.02.2010 um 21:37 Uhr
Hallo 010101!

Vielleicht so (spät, aber doch noch ein Batch ):
01.
@echo off & setlocal 
02.
set "Ordner=D:\Test" 
03.
set "Liste=D:\Berechtigungen.txt" 
04.
 
05.
del "%Liste%" 2>nul 
06.
for /r "%Ordner%" %%i in (.) do >>"%Liste%" cacls /c "%%i"
Grüße
bastla
Bitte warten ..
Mitglied: 77575
06.02.2010 um 16:33 Uhr
Zitat von bastla:
01.
@echo off & setlocal 
02.
> set "Ordner=D:\Test" 
03.
> set "Liste=D:\Berechtigungen.txt" 
04.
>  
05.
> del "%Liste%" 2>nul 
06.
> for /r "%Ordner%" %%i in (.) do >>"%Liste%" cacls /c "%%i" 
07.
> 

hallo bastla,

bin erst heute dazugekommen es mir anzuschauen.
vielen dank, das funktioniert. ich musste nur den cacls parameter und %%i tauschen, dann kommt genau das raus was ich brauche.
so sieht das ganze dann bei mir aus:
01.
@echo off & setlocal  
02.
set "Ordner=D:\Test"  
03.
set "Liste=D:\Berechtigungen.txt"  
04.
if exist "%Liste%" del "%Liste%" >nul  
05.
for /r "%Ordner%" %%i in (.) do >>"%Liste%" cacls  "%%i" /c 
06.
endlocal
gruss 010101
Bitte warten ..
Mitglied: bastla
06.02.2010 um 16:52 Uhr
Hallo 01-01-01!

Freut mich, dass es passt ...

ich musste nur den cacls parameter und %%i tauschen
Ja, das habe ich beim Posten verschlimmbessert (ursprünglich war das "/c" gar nicht dabei; nachdem ich noch einen (zu) kurzen Blick auf Deinen ursprünglichen Beitrag geworfen hatte, habe ich es dann - der Ordnung halber, aber an der falschen Position - hinzugefügt)
Das "endlocal" kannst Du übrigens einsparen, da es automatisch am Ende eines Batches ausgeführt wird ....

Grüße
bastla
Bitte warten ..
Mitglied: thl1966
23.10.2013 um 12:01 Uhr
Muss das Thema nochmals aufgreifen.

Das letzte Skript funktioniert zwar, liest aber effektiv nur die Sicherheits Gruppen und Benutzernamen aus, die
dem Ordner zugeordnet sind.
Wenn ich im Explorer (Windows 7) den Besitzer (Owner) als Spalte im Explorer hinzufüge, bekomme ich
dann direkt neben dem Ordner oder der Datei die Domäne\UserID angezeigt.

Genau das würde ich gerne rekursiv auslesen.

Am liebsten per VBS.

Wer kann helfen?

Gruß
Thomas
Bitte warten ..
Mitglied: bastla
23.10.2013, aktualisiert um 13:09 Uhr
Hallo thl1966!
... Domäne\UserID angezeigt.

Genau das würde ich gerne rekursiv auslesen.
Genau das sollte doch eigentlich der (VBS-)Ansatz da oben machen ...

Grüße
bastla
Bitte warten ..
Mitglied: thl1966
23.10.2013 um 14:11 Uhr
Hallo bastla,

danke für den Hinweis, hat super geklappt!

Genau, dass was ich gesucht hatte.

Vielen Dank.

Gruß
Thomas
Bitte warten ..
Mitglied: Snapst
12.11.2013 um 15:14 Uhr
Hallo , habe heute das gute Stück hier gefunden und bin schon froh überhaupt etwas gefunden zu haben ^^
Ich bin leider nicht so vertraut mit der Benutzung von batch Dateien.

01.
> @echo off & setlocal  
02.
> set "Ordner=D:\Test"  
03.
> set "Liste=D:\Berechtigungen.txt"  
04.
> if exist "%Liste%" del "%Liste%" >nul  
05.
> for /r "%Ordner%" %%i in (.) do >>"%Liste%" cacls  "%%i" /c 
06.
> endlocal 
07.
> 

Ich habe ein kleines Problem - unzwar versuche ich deinen Code so zu bearbeiten, dass gewisse Strings nicht in die Textdatei geschrieben, sondern vorher gekürzt werden.

Momentan sieht die Textdatei so aus:

C:\Temp Domain\userID: (OI)(CI)C
NT-AUTORITŽT\Authentifizierte Benutzer: (OI)(CI)(ID)C
NT-AUTORITŽT\SYSTEM: (OI)(CI)(ID)F
VORDEFINIERT\Administrators: (OI)(CI)(ID)F
Domain\userID: (OI)(CI)(ID)C
VORDEFINIERT\Users: (OI)(CI)(ID)R

Ich würde aber gerne nur folgendes in der Textdatei stehen haben:

userID: (OI)(CI)C

Dementsprechend soll bei mehreren Usern (bzw. Ordnern) folgendes stehen:

user1ID: (OI)(CI)C
user2ID: (OI)(CI)F
user3ID: (OI)(CI)C

Habe weiter oben gelesen, dass man das anscheinend mit dem "findstr" Befehl machen kann, aber egal wie ich das breche und biege ich steige nicht dahinter, wie das funktionieren könnte

Hat vlt. jemand eine Idee ?

Gruß Kevin
Bitte warten ..
Mitglied: bastla
12.11.2013 um 15:42 Uhr
Hallo Snapst und willkommen im Forum!

Versuch es so (ungetestet):
01.
@echo off & setlocal  
02.
set "Ordner=D:\Test"  
03.
set "Liste=D:\Berechtigungen.txt"  
04.
if exist "%Liste%" del "%Liste%" >nul  
05.
for /r "%Ordner%" %%i in (.) do ( 
06.
    for /f "tokens=1* delims=\" %%a in ('cacls  "%%i" /c|findstr /v "NT-AUTORI VORDEFINIERT"') do >>"%Liste%" echo %%b 
07.
)
Grüße
bastla
Bitte warten ..
Mitglied: Snapst
12.11.2013 um 16:03 Uhr
Vielen Dank für die schnelle Antwort. Ich musste bei dir nur noch ein '^' setzen und es funktioniert

01.
@echo off & setlocal   
02.
set "Ordner=D:\Test"   
03.
set "Liste=D:\Berechtigungen.txt"   
04.
if exist "%Liste%" del "%Liste%" >nul   
05.
for /r "%Ordner%" %%i in (.) do (for /f "tokens=1* delims=\" %%a in ('cacls  "%%i" /c ^|findstr /v  
06.
"NT-AUTORI VORDEFINIERT') do >>"%Liste%" echo %%b  
07.
)
(nur "|findstr" hat dazu geführt, dass keine Liste erstellt wurde. Aber du sagtest ja "ungetestet")

Danke sehr...
Bitte warten ..
Mitglied: bastla
12.11.2013 um 16:08 Uhr
Hallo Snapst!

Yep - die zweite Schleife (für das Abschneiden der Domänen-Angabe) habe ich erst nachträglich drumherumgewickelt und dabei auf das "^" vergessen ...

Grüße
bastla
Bitte warten ..
Mitglied: Snapst
18.11.2013, aktualisiert um 08:37 Uhr
Guten Morgen,

ich hätte da noch einmal eine kleine Frage

der Code oben:

01.
@echo off & setlocal    
02.
set "Ordner=D:\Test"    
03.
set "Liste=D:\Berechtigungen.txt"    
04.
if exist "%Liste%" del "%Liste%" >nul    
05.
for /r "%Ordner%" %%i in (.) do (for /f "tokens=1* delims=\" %%a in ('cacls  "%%i" /c ^|findstr /v   
06.
"NT-AUTORI VORDEFINIERT') do >>"%Liste%" echo %%b
sorgt ja dafür, dass ALLE Unterordner des angegebenen Pfades durchsucht und aufgelistet werden. Gibt es eine Möglichkeit dies auf eine bestimme Ebene zu beschränken ?

Das heißt (als kleines Beispiel):

Laufwerk D:\ enthält die Ordner "Software" und "Hardware".

Unter D:\Software\ gibt es die Unterordner "Office" und "Tools".

Office und Tools enthalten weitere Ordner.
Ich frage mich jetzt, ob es mit Abänderung des obigen Codes möglich ist, nur bis zur Ebene D:\Software\ auszulesen ?
Also die Berechtigungen für D:\Software\Tools und D:\Software\Office abzufragen, aber nicht die der Unterordner von Tools und Office.

Hoffe das war verständlich ^^

Viele Grüße
Snapst
Bitte warten ..
Mitglied: Snapst
18.11.2013 um 08:55 Uhr
Ich nehme mir mal heraus selbst einen Vorschlag zu posten ^^


01.
set startpath=l:\ 
02.
 
03.
For /f "skip=2 tokens=3,*" %%i in ('dir "%startpath%"^|findstr /C:DIR') do @for /f "skip=2 tokens=3,*" %%m in ('dir "%startpath%%%j"^|findstr /C:DIR') do echo %%j;%%n>>m:\test.txt
Das erfüllt meine Zwecke wie ich gerade festgestellt habe. Fehlen nur kleine Anpassungen aber ansonsten für mich ausreichend.

Schönen Tag noch ;)
Bitte warten ..
Mitglied: bastla
18.11.2013 um 22:02 Uhr
Hallo Snapst!

Wenn Du das nächste Mal eine Schleife über Ordner benötigst, kannst Du "for /d" verwenden ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Ähnliche Inhalte
Outlook & Mail
gelöst Email Anhänge speichern VB Script aber nur bestimmte Dateitypen (Outlook) (4)

Frage von LindeUnimog zum Thema Outlook & Mail ...

VB for Applications
gelöst VB Script rekursiv statt nur ein Ordner (4)

Frage von Saschaaaaa zum Thema VB for Applications ...

VB for Applications
gelöst VB Script nach gefundenem Wort die nächsten 4 Zeichen ersetzten (2)

Frage von deutsch73 zum Thema VB for Applications ...

Batch & Shell
gelöst Verschieben von Ordnern mittels Excelliste und Script (6)

Frage von StrgAltEntf zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...