Besitzer von Ordnern mit VB-Script auslesen

edi.pfisterer
Goto Top

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:


2.) besitzer.cmd


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-Key: 134881

Url: https://administrator.de/contentid/134881

Ausgedruckt am: 27.06.2022 um 23:06 Uhr

Mitglied: 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
Mitglied: bastla
bastla 01.02.2010 um 20:39:34 Uhr
Goto Top
... ansonsten als Abwandlung Deines Ansatzes mit Verwendung einer CMD-Zeile:

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):
oder (etwas "transparenter") als Batch:
Grüße
bastla
Mitglied: 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:



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!!!
Mitglied: 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:
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:
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.
filtert alle Zeilen, welche die Strings "Datei(en)" oder "Verzeichnis(se)" enthalten (sollte nur auf die beiden letzten Zeilen zutreffen), aus dem Ergebnis heraus.
ü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
als %%a "DOMÄNE\User" und als %%b "Ein Test-Unterordner". Diese beiden Teile werden schließlich mittels
(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:
[/Edit]
Mitglied: 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:
Grüße
bastla
Mitglied: 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
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
Mitglied: bastla
bastla 02.02.2010 um 09:37:32 Uhr
Goto Top
Hallo urobe73!

Gib bitte folgenden Befehl an der Kommandozeile ein
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:
Voraussetzung ist dabei natürlich, dass das Script mit den erforderlichen Berechtigungen ausgeführt wird.

Grüße
bastla
Mitglied: 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....

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...]
Mitglied: 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...
Mitglied: 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
erhalten - dadurch war die Zerlegung problemlos möglich ...
Ein Server2003 liefert zB
- 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
ü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
Mitglied: Edi.Pfisterer
Edi.Pfisterer 02.02.2010 um 12:41:40 Uhr
Goto Top
hallo bastla!
Das mit Spaltenposition 63 klingt gut!
denn:
entspricht doch in wirklichkeit denZeilen

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?)
hm...
Mitglied: 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:
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
Mitglied: 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:
Damit das wie gewünscht funktionieren kann, müsste allerdings bei Dir die oben besprochene Zeile
so aussehen:
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:
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
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
Mitglied: 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
Mitglied: 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
so aussehen:
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!!!
Mitglied: 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
Mitglied: 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):
Grüße
bastla
Mitglied: 77575
77575 06.02.2010 um 16:33:36 Uhr
Goto Top
Zitat von @bastla:

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:

gruss 010101
Mitglied: 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
Mitglied: 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
Mitglied: 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
Mitglied: 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
Mitglied: 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.


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
Mitglied: bastla
bastla 12.11.2013 um 15:42:14 Uhr
Goto Top
Hallo Snapst und willkommen im Forum!

Versuch es so (ungetestet):
Grüße
bastla
Mitglied: 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


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

Danke sehr...
Mitglied: 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
Mitglied: 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:


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
Mitglied: Snapst
Snapst 18.11.2013 um 08:55:52 Uhr
Goto Top
Ich nehme mir mal heraus selbst einen Vorschlag zu posten ^^



Das erfüllt meine Zwecke wie ich gerade festgestellt habe. Fehlen nur kleine Anpassungen aber ansonsten für mich ausreichend.

Schönen Tag noch ;)
Mitglied: 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
Mitglied: 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 ?