edi.pfisterer
Goto Top

Besitzer von Ordnern mit VB-Script auslesen

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:


ordner = "Z:\2009_2010"  
Set fs = CreateObject("Scripting.FileSystemObject")  
Set f1 = fs.GetFolder(ordner)
for each unterordner in f1.subfolders
listunter = listunter & unterordner & vbcrlf

Set WshShell = WScript.CreateObject("WScript.Shell")  
ret = WshShell.Run ("besitzer.cmd " & ordner)  



   Set File = fs.OpenTextFile("temp.txt" , 1, true)  
     ' Datei zum Lesen öffnen  


Do While not file.AtEndOfStream
   besitzer = besitzer & file.ReadLine
Loop

listunter = listunter & besitzer & vbcrlf
next


SET objfs= createobject("scripting.filesystemobject")  
strdateiname = "Ordnerliste.csv"  
set objtextstream = objfs.createtextfile(strdateiname, True)
strwritestring = listunter
objtextstream.write strwritestring
objtextstream.close
set objtextstream = nothing
set objfs = nothing
2.) besitzer.cmd

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

Content-ID: 134881

Url: https://administrator.de/forum/besitzer-von-ordnern-mit-vb-script-auslesen-134881.html

Ausgedruckt am: 22.12.2024 um 16:12 Uhr

AndreasBrecht
AndreasBrecht 01.02.2010 um 20:00:32 Uhr
Goto Top
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 face-wink
bastla
bastla 01.02.2010 um 20:39:34 Uhr
Goto Top
... ansonsten als Abwandlung Deines Ansatzes mit Verwendung einer CMD-Zeile:
ordner = "Z:\2009_2010"  
Liste = "Z:\Ordnerliste.txt"  
Set fs = CreateObject("Scripting.FileSystemObject")  
Set f1 = fs.GetFolder(ordner)
If fs.FileExists(Liste) Then fs.DeleteFile(Liste)
Set WshShell = CreateObject("WScript.Shell")  
For Each unterordner In f1.Subfolders
    listunter = listunter & unterordner & vbcrlf 
    CMD = "cmd /c for /f ""skip=7 tokens=4*"" %a in ('dir """ & unterordner & """/q^|findstr /v ""Datei(en) Verzeichnis(se)""') do @echo %a;%b"  
    besitzer = WshShell.Exec(CMD).StdOut.ReadAll
    listunter = listunter & besitzer & vbcrlf
Next
fs.CreateTextFile(Liste).Write listunter

BTW: Weshalb soll es denn VBS sein? Unter CMD wäre es eine (zugegeben etwas längere face-wink) Zeile (hier zum Testen als Version für die Direkteingabe an der Kommandozeile):
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:
@echo off & setlocal
set "Ordner=Z:\2009_2010"  
set "Liste=Z:\Ordnerliste.csv"  

del "%Liste%" 2>nul  
for /d %%i in ("%Ordner%\*.*") 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\
)>>"%Liste%"  
Grüße
bastla
Edi.Pfisterer
Edi.Pfisterer 01.02.2010 um 21:25:57 Uhr
Goto Top
ja, Weltklasse!!!
bin masslos begeistert...

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

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:

Z:\2009_2010\000kiri
domain\Thomas.BOEH!skichallenge;
domain\Andreas.GHADok1.docx;
domain\Andreas.GHADok2.docx;
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!!!
bastla
bastla 01.02.2010 um 22:03:53 Uhr
Goto Top
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 face-wink:
@echo off & setlocal
set "Ordner=Z:\2009_2010"  
set "Liste=Z:\Ordnerliste.csv"  

del "%Liste%" 2>nul  
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:
@echo off & setlocal
set "Ordner=Z:\2009_2010"  
set "Liste=Z:\Ordnerliste.csv"  

del "%Liste%" 2>nul  
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]
bastla
bastla 01.02.2010 um 22:23:25 Uhr
Goto Top
@AndreasBrecht
... könntest Du ja das Ergebnis posten face-wink
Auch wenn ich nicht direkt angesprochen war face-wink:
Ordner = "Z:\2009_2010"  
Liste = "Z:\Ordnerliste.csv"  

Set fso = CreateObject("Scripting.FileSystemObject")  
If fso.FileExists(Liste) Then fso.DeleteFile(Liste)
Set objWMI = GetObject("winmgmts://./root/cimv2")  
For Each Unterordner In fso.GetFolder(ordner).Subfolders
    objWMI.Get("Win32_LogicalFileSecuritySetting='" & Unterordner & "'").GetSecurityDescriptor objSD  
    Listunter = Listunter & vbCrLf & Unterordner.Name & ";" & objSD.Owner.Domain & "\" & objSD.Owner.Name  
Next
fso.CreateTextFile(Liste).Write Mid(Listunter, 3)
Grüße
bastla
Edi.Pfisterer
Edi.Pfisterer 02.02.2010 um 08:16:21 Uhr
Goto Top
@bastla:
Du bist - für heute zumindest face-wink - 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
@echo off & setlocal
set "Ordner=Z:\2009_2010"  
set "Liste=Z:\Ordnerliste.csv"  

del "%Liste%" 2>nul  
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
bastla
bastla 02.02.2010 um 09:37:32 Uhr
Goto Top
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 ) 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:
StartOrdner = "Z:\2009_2010"  
Liste = "Z:\Ordnerliste.csv"  

Set fso = CreateObject("Scripting.FileSystemObject")  
If fso.FileExists(Liste) Then fso.DeleteFile(Liste)
Set objWMI = GetObject("winmgmts://./root/cimv2")  

Listunter = ""  
BearbeiteUnterordner fso.GetFolder(StartOrdner)
fso.CreateTextFile(Liste).Write Mid(Listunter, 3)

Sub BearbeiteUnterordner(Ordner)
For Each Unterordner In Ordner.Subfolders
    objWMI.Get("Win32_LogicalFileSecuritySetting='" & Unterordner.Path & "'").GetSecurityDescriptor objSD  
    Listunter = Listunter & vbCrLf & Unterordner.Path & ";" & objSD.Owner.Domain & "\" & objSD.Owner.Name  
    BearbeiteUnterordner Unterordner
Next
End Sub
Voraussetzung ist dabei natürlich, dass das Script mit den erforderlichen Berechtigungen ausgeführt wird.

Grüße
bastla
Edi.Pfisterer
Edi.Pfisterer 02.02.2010 um 10:35:18 Uhr
Goto Top
hallo!
ich habe - entgegen Deiner Anforderungen - mal die gesamte Ausgabe hier eingestellt....
 Datentr„ger in Laufwerk Z: ist Volume
 Volumeseriennummer: 3E72-2972

 Verzeichnis von Z:\2009_2010\000kiri

27.01.2010  13:34    <DIR>          DOMAIN\Andreas.GHA.
27.01.2010  13:34    <DIR>          VORDEFINIERT\Administra..
20.01.2010  13:09    <DIR>          DOMAIN\Thomas.BOEH!skichallenge
               0 Datei(en)              0 Bytes
               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...]
Edi.Pfisterer
Edi.Pfisterer 02.02.2010 um 10:49:10 Uhr
Goto Top
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...
bastla
bastla 02.02.2010, aktualisiert am 12.11.2013 um 16:12:04 Uhr
Goto Top
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 face-sad ...

Grüße
bastla

P.S.: Jetzt habe ich leider wirklich nicht mehr Zeit
Edi.Pfisterer
Edi.Pfisterer 02.02.2010 um 12:41:40 Uhr
Goto Top
hallo bastla!
Das mit Spaltenposition 63 klingt gut!
denn:
27.01.2010  13:34    <DIR>          DOMAIN\Andreas.GHA. 
27.01.2010  13:34    <DIR>          VORDEFINIERT\Administra..
entspricht doch in wirklichkeit denZeilen
27.01.2010  13:34    <DIR>          .
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?)
20.01.2010  13:09    <DIR>          DOMAIN\Thomas.BOEH!skichallenge 
hm...
77575
77575 02.02.2010 um 20:01:21 Uhr
Goto Top
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:
D:\Downloads\Tesst\ BUILTIN\Users: (OI)(CI)(M)
                    meinPC\benutzer1: (OI)(CI)(F)
                    BUILTIN\Administrators: (I)(F)
                    BUILTIN\Administrators: (I)(OI)(CI)(IO)(F)
                    NT AUTHORITY\SYSTEM: (I)(F)
                    NT AUTHORITY\SYSTEM: (I)(OI)(CI)(IO)(F)
                    NT AUTHORITY\Authenticated Users: (I)(M)
                    NT AUTHORITY\Authenticated Users: (I)(OI)(CI)(IO)(M)
                    BUILTIN\Users: (I)(RX)
                    BUILTIN\Users: (I)(OI)(CI)(IO)(GR,GE)

D:\Downloads\Tesst\blahblub BUILTIN\Users: (I)(OI)(CI)(M)
                            meinPC\benutzer1: (I)(OI)(CI)(F)
                            BUILTIN\Administrators: (I)(F)
                            BUILTIN\Administrators: (I)(OI)(CI)(IO)(F)
                            NT AUTHORITY\SYSTEM: (I)(F)
                            NT AUTHORITY\SYSTEM: (I)(OI)(CI)(IO)(F)
                            NT AUTHORITY\Authenticated Users: (I)(M)
                            NT AUTHORITY\Authenticated Users: (I)(OI)(CI)(IO)(M)
                            BUILTIN\Users: (I)(OI)(CI)(IO)(GR,GE)

D:\Downloads\Tesst\test2.rar BUILTIN\Users: (I)(M)
                             meinPC\benutzer1: (I)(F)
                             BUILTIN\Administrators: (I)(F)
                             NT AUTHORITY\SYSTEM: (I)(F)
                             NT AUTHORITY\Authenticated Users: (I)(M)

D:\Downloads\Tesst\testdatei.txt BUILTIN\Users: (I)(M)
                                 meinPC\benutzer1: (I)(F)
                                 BUILTIN\Administrators: (I)(F)
                                 NT AUTHORITY\SYSTEM: (I)(F)
                                 NT AUTHORITY\Authenticated Users: (I)(M)

D:\Downloads\Tesst\blahblub\sdgsdfg NT AUTHORITY\Authenticated Users: (OI)(CI)(M)
                                    NT AUTHORITY\SYSTEM: (OI)(CI)(F)
                                    meinPC\benutzer1: (OI)(CI)(RX)
                                    BUILTIN\Administrators: (OI)(CI)(F)
                                    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 face-wink
da bin ich schon etwas neidisch, wäre froh wenn ich so 'nen draht und verständniss dafür hätte.

gruss 010101
bastla
bastla 02.02.2010 um 21:47:30 Uhr
Goto Top
Hallo urobe73!

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

Noch ein Versuch mit Batch:
@echo off & setlocal
set "Ordner=Z:\2009_2010"  
set "Liste=Z:\Ordnerliste.csv"  

for /f "tokens=3 delims=:. " %%i in ('chcp 1252') do set "CP=%%i"  
del "%Liste%" 2>nul  
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"  
chcp %CP%>nul
goto :eof

:ProcessDir
>>"%Liste%" echo "%~1\%Info:~23%";%Info:~,23%  
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:
StartOrdner = "Z:\2009_2010"  
Liste = "Z:\Ordnerliste.csv"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set objWMI = GetObject("winmgmts://./root/cimv2")  

Set Liste = fso.CreateTextFile(Liste)
On Error Resume Next
BearbeiteUnterordner fso.GetFolder(StartOrdner)
Liste.Close

Sub BearbeiteUnterordner(Ordner)
For Each Unterordner In Ordner.Subfolders
    objWMI.Get("Win32_LogicalFileSecuritySetting=""" & Replace(Unterordner.Path, "\", "\\") & """").GetSecurityDescriptor objSD  
    Liste.WriteLine Unterordner.Path & ";" & objSD.Owner.Domain & "\" & objSD.Owner.Name  
    BearbeiteUnterordner Unterordner
Next
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
bastla
bastla 02.02.2010, aktualisiert am 12.11.2013 um 16:13:47 Uhr
Goto Top
@ 010101
Eigentlich kenne ich nur so 3 bis 4 CMD-Schnipsel face-wink (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
Edi.Pfisterer
Edi.Pfisterer 03.02.2010 um 11:09:52 Uhr
Goto Top
@ bastla!

OH YEAH, BABY face-wink
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
> 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.


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!!!
77575
77575 03.02.2010 um 19:48:11 Uhr
Goto Top
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
bastla
bastla 03.02.2010 um 21:37:56 Uhr
Goto Top
Hallo 010101!

Vielleicht so (spät, aber doch noch ein Batch face-wink):
@echo off & setlocal
set "Ordner=D:\Test"  
set "Liste=D:\Berechtigungen.txt"  

del "%Liste%" 2>nul  
for /r "%Ordner%" %%i in (.) do >>"%Liste%" cacls /c "%%i"  
Grüße
bastla
77575
77575 06.02.2010 um 16:33:36 Uhr
Goto Top
Zitat von @bastla:
@echo off & setlocal
> set "Ordner=D:\Test"  
> set "Liste=D:\Berechtigungen.txt"  
> 
> del "%Liste%" 2>nul  
> for /r "%Ordner%" %%i in (.) do >>"%Liste%" cacls /c "%%i"  
> 

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:
@echo off & setlocal 
set "Ordner=D:\Test"   
set "Liste=D:\Berechtigungen.txt"   
if exist "%Liste%" del "%Liste%" >nul   
for /r "%Ordner%" %%i in (.) do >>"%Liste%" cacls  "%%i" /c  
endlocal

gruss 010101
bastla
bastla 06.02.2010 um 16:52:12 Uhr
Goto Top
Hallo 01-01-01!

Freut mich, dass es passt ... face-smile

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) face-sad
Das "endlocal" kannst Du übrigens einsparen, da es automatisch am Ende eines Batches ausgeführt wird ....

Grüße
bastla
thl1966
thl1966 23.10.2013 um 12:01:47 Uhr
Goto Top
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
bastla
bastla 23.10.2013 aktualisiert um 13:09:04 Uhr
Goto Top
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
thl1966
thl1966 23.10.2013 um 14:11:10 Uhr
Goto Top
Hallo bastla,

danke für den Hinweis, hat super geklappt!

Genau, dass was ich gesucht hatte.

Vielen Dank.

Gruß
Thomas
Snapst
Snapst 12.11.2013 um 15:14:55 Uhr
Goto Top
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.

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

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 face-sad

Hat vlt. jemand eine Idee ?

Gruß Kevin
bastla
bastla 12.11.2013 um 15:42:14 Uhr
Goto Top
Hallo Snapst und willkommen im Forum!

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

@echo off & setlocal  
set "Ordner=D:\Test"    
set "Liste=D:\Berechtigungen.txt"    
if exist "%Liste%" del "%Liste%" >nul    
for /r "%Ordner%" %%i in (.) do (for /f "tokens=1* delims=\" %%a in ('cacls  "%%i" /c ^|findstr /v   
"NT-AUTORI VORDEFINIERT') do >>"%Liste%" echo %%b   
)

(nur "|findstr" hat dazu geführt, dass keine Liste erstellt wurde. Aber du sagtest ja "ungetestet") face-smile

Danke sehr...
bastla
bastla 12.11.2013 um 16:08:06 Uhr
Goto Top
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 ... face-sad

Grüße
bastla
Snapst
Snapst 18.11.2013 aktualisiert um 08:37:56 Uhr
Goto Top
Guten Morgen,

ich hätte da noch einmal eine kleine Frage face-smile

der Code oben:

@echo off & setlocal   
set "Ordner=D:\Test"     
set "Liste=D:\Berechtigungen.txt"     
if exist "%Liste%" del "%Liste%" >nul     
for /r "%Ordner%" %%i in (.) do (for /f "tokens=1* delims=\" %%a in ('cacls  "%%i" /c ^|findstr /v    
"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
Snapst
Snapst 18.11.2013 um 08:55:52 Uhr
Goto Top
Ich nehme mir mal heraus selbst einen Vorschlag zu posten ^^


set startpath=l:\

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 ;)
bastla
bastla 18.11.2013 um 22:02:49 Uhr
Goto Top
Hallo Snapst!

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

Grüße
bastla
windows10
windows10 17.08.2020 um 07:32:03 Uhr
Goto Top
Hallo zusammen

Der Thread ist schon etwas älter aber auch ich suche sowas,
Das mir nur die Berechtigungen von den Ordnern ausliest
leider funktioniert das Script, welches mit win10 als admin ausgeführt wird, bei mir nicht, :

@echo off & setlocal
set "Ordner=C:\"
set "Liste=C:\Temp\Berechtigungen.txt"
if exist "%Liste%" del "%Liste%" >nul
for /r "%Ordner%" %%i in (.) do (for /f "tokens=1* delims=\" %%a in ('cacls "%%i" /c ^|findstr /v
"NT-AUTORI VORDEFINIERT') do >>"%Liste%" echo %%b

die datei wurde als batch.bat gespeichert
was mache ich falsch ?