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

Ordner und Dateinamen mit dazugehöriger Besitzerinformation auslesen und in csv Datei ausgeben

Frage Entwicklung Batch & Shell

Mitglied: Pretznbaer

Pretznbaer (Level 1) - Jetzt verbinden

22.02.2013 um 12:02 Uhr, 2941 Aufrufe, 4 Kommentare

Hallo,

wie in einem anderen Beitrag von mir Besitzer von Ordnern UND Dateien mit vbs in excel ausgeben schon einmal erwähnt bzw. beschrieben, versuche ich mittels Batch Datei, aus einem Verzeichnis folgende Informationen auszulesen:
  • Ordnernamen
  • Dateinamen
  • dazugehörigen Besitzerinformation

Kurz und Bündig: Lokal funktioniert es einwandfrei aber auf Windows Server 2003 nicht...

Bisher lief die "Anwendung" (--> Siehe Code unten) auf meiner lokalen Maschine (win XP) und ist daher etwas in Vergessenheit geraten. Und da dies jetzt wieder aktuell geworden ist, bin ich auf ein weiteres Problem gestoßen:

Derzeit liest die Anwendung nur lokal ein Gesamtes Verzeichnis mit den zusätzlichen Besitzerinformationen aus und gibt die Informationen in einer .csv Liste aus.
Nun wollte ich dieses auf Windows Server (2003 [Englisch]) ausführen und ein Verzeichnis auf dem Server auslesen, aber es wird, im warsten Sinne des Wortes, irgendwas ausgegeben.

Hier der Code
01.
@echo off & setlocal 
02.
set "Ordner=D:\" 
03.
set "Liste=D:\%date:~-4% %date:~-7,2% %date:~-10,2% liste.csv" 
04.
del "%Liste%" 2>nul  
05.
 
06.
for /r "%Ordner%" %%i in (.) do for /f "tokens=1,2,3,4,*" %%a in ('dir "%%i" /q ^|findstr "^[0-9].*"^|findstr /v ".*DIR.*\."') do echo %%a;%%b;%%c;%%d;%%~fi\%%e;>>"%Liste%"
Ziel ist, dass die selben Informationen auch ausgegeben werden, wenn die "Anwendung" auf Win Server 2003 ausgeführt wird. Ich persönlich glaube, dass es an der Englischen Version liegt, weiß jedoch nicht, wie ich dies lösen könnte.

Ich hoffe, dass ich alles soweit verständlich beschrieben habe?! Solltet ihr weitere Infos benötigen, gebt mir einfach bescheid

Freue mich über jeden Lösungsvorschlag,

mfg
Pretznbaer
Mitglied: Friemler
22.02.2013, aktualisiert 23.02.2013
Hallo Pretznbaer,

in Deinem Schnipsel müsste der Suchstring des zweiten FINDSTR-Befehls statt
".*DIR.*\."
so
".*DIR.*\.$"
lauten, zumindest auf Windows 7.


Es gibt allerdings weiterhin zwei Probleme mit dem Code:

  1. Falls als Besitzer bei einer Datei/einem Verzeichnis z.B. die Benutzergruppe Vordefiniert\Administratoren eingetragen ist, wird dieser Name bei der Darstellung durch den DIR-Befehl wegen Überlänge abgeschnitten und zusätzlich mit dem Dateinamen verschmolzen, da kein Freizeichen dazwischen geschrieben wird. Dadurch entsteht eine fehlerhafte Zeile in der CSV-Datei.
  2. Die Extraktion der einzelnen Bestandteile des Datums zur Erzeugung des Namens der Ausgabedatei wird bei einem englischen bzw. amerikanischen Windows so nicht funktionieren, da in beiden Lokalisierungen ein anderes Datumsformat benutzt wird, d.h. die Position von Tag, Monat und Jahr in einem englischen/amerikanischen Datumsstring stimmen nicht mit den Positionen in einem deutschen Datumsstring überein.

Als Lösung bietet sich VBScript an. Mit einem kleinen Inline-VBScript könnte man die Datumszerlegung so erledigen, dass sie auf allen Sprachversionen von Windows funktioniert und immer das gleiche Ergebnis liefert.

Für die Ermittlung des Besitzers einer Datei/eines Verzeichnisses bei der Erzeugung der CSV-Datei existiert eine sichere aber recht langsame Lösung über WMI.

Wie viele Dateien/Verzeichnisse sind (ungefähr) in dem zu verarbeitenden Verzeichnisbaum?

Gruß
Friemler
Bitte warten ..
Mitglied: Pretznbaer
25.02.2013 um 07:41 Uhr
Hallo Friemler,

vielen Dank für deine Antwort! Konnte diese leider erst jetzt lesen.

zu 1.) sofern ich das richtig verstanden habe, könnte es daran scheitern, dass die Benutzergruppen "zu lang" sind? Meine Frage dazu: was haben die "Benutzergruppen" mit der "Besitzerinformation" zu tun? Oder verstehe ich hier etwas falsch?

zu 2.) Dies hat aber keine direkte Auswirkung auf die ausgelesenen Werte oder?

Sorry, aber bin was Programmierung angeht noch nicht besonders weit "entwickelt" :D

Die Anzahl an Dateien/Ordner im Verzeichnisbaum ist von Tag zu Tag verschieden. Da auf diesen Ordner/Verzeichnis ca. 20 Personen Zugriff haben, möchte ich die "An und Abgänge" von Dateien/Ordnern pro Tag überwachen bzw. dokumentieren. Im Schnitt wären das ca. 15 Ordner mit ungefähr 150 Dateien. (Könnte aber auch manchmal doppelt so viel sein)

Mit VBScript hatte ich es auch schon versucht, bin aber auch an der selben Stelle wie mit dem Batch-file gescheitert...

Lg
Pretznbaer
Bitte warten ..
Mitglied: Friemler
25.02.2013, aktualisiert um 20:23 Uhr
Hallo Pretznbaer,

beim Durchforsten meiner Festplatte mit Deinem Batchschnipsel sind Dateien aufgetaucht, deren Besitzer nicht ein Benutzer sondern z.B. die Benutzergruppe Administratoren ist, deren vollständiger Name auf einem deutschen Windows Vordefiniert\Administratoren lautet. Da DIR /Q die Daten zu einer Datei in einer Tabellenstruktur mit fester Spaltenbreite anzeigt, blieb davon nur Vordefiniert\Administra übrig. Direkt neben der Spalte für den Besitzer wird ja der Dateiname angezeigt, in diesem Fall aber ohne separierendes Leerzeichen. Die FOR-Schleife hat als Besitzer somit Vordefiniert\AdministraXXXXXXXX ermittelt (XXXXX steht für den Teil des Dateinamens bis zum ersten Freizeichen). => Die CSV-Datei enthielt einen falschen Eintrag.

Wenn es nur 150 Dateien sind, spielt die Ausführungsgeschwindigkeit keine große Rolle, da sollte die robuste WMI-Lösung genügen.

Aber erstmal der Code für das Batchfile, von dem aus das VBScript aufgerufen wird, das die eigentliche Arbeit erledigt:
01.
@echo off & setlocal 
02.
 
03.
::Das Verzeichnis, in dem das Script gespeichert ist, zum aktuellen Verzeichnis machen 
04.
pushd "%~dp0" 
05.
 
06.
::Aktuelles Datum bestimmen und in die Variable DateStamp schreiben 
07.
call :GetDate DateStamp 
08.
 
09.
 
10.
::Basisverzeichnis 
11.
set "Ordner=D:\" 
12.
 
13.
::Zieldatei 
14.
set "Liste=D:\%DateStamp% Liste.csv" 
15.
 
16.
::Pfad+Name des VBScripts, das die Datei- und Verzeichnisdaten ermittelt 
17.
set "VBSGetTreeInfo=GetTreeInfo.vbs" 
18.
 
19.
 
20.
::Evtl. bereits existierende Zieldatei löschen 
21.
del "%Liste%" 2>NUL 
22.
 
23.
::VBScript ausführen, dabei das Basisverzeichnis als Parameter übergeben 
24.
::Die Ausgabe des VBScripts in die Zieldatei umleiten 
25.
cscript /nologo "%VBSGetTreeInfo%" "%Ordner%" > "%Liste%" 
26.
 
27.
::Das Verzeichnis, das beim Scriptstart das aktuelle Verzeichnis war, 
28.
::wieder zum aktuellen Verzeichnis machen 
29.
popd 
30.
 
31.
::Script Ende 
32.
exit /b 
33.
 
34.
 
35.
 
36.
::Unterprogramm, das mit Hilfe eines temporären VBScripts 
37.
::das aktuelle Datum bestimmt und im Format DD-MM-YYYY zurückgibt 
38.
:GetDate 
39.
  ::Pfad für temporäres Script 
40.
  set "VBSGetDate=%TEMP%\GetDate.vbs" 
41.
   
42.
  ::Temporäres VBScript schreiben 
43.
  > "%VBSGetDate%" echo dtToday = Date() 
44.
  >>"%VBSGetDate%" echo WScript.Echo Year(dtToday) ^& "-" ^& Right("0" ^& Month(dtToday), 2) ^& "-" ^& Right("0" ^& Day(dtToday), 2) 
45.
   
46.
  ::Temporäres VBScript ausführen und das Ergebnis in der Variablen speichern, 
47.
  ::deren Name als 1. Parameter übergeben wurde 
48.
  for /f "delims=" %%d in ('cscript /nologo "%VBSGetDate%"') do ( 
49.
    set "%~1=%%d" 
50.
51.
   
52.
  ::Temporäres VBScript löschen 
53.
  del "%VBSGetDate%" 
54.
 
55.
::Rücksprung 
56.
exit /b
In Zeile 17 des Scripts wird der Name und Pfad des VBScripts gesetzt, das die Daten der Dateien und Verzeichnisse im zu verarbeitenden Verzeichnisbaum ermittelt. Hier wird der Name GetTreeInfo.vbs verwendet. Das folgende Script muss unter diesem Namen gespeichert werden:
01.
Option Explicit 
02.
 
03.
Const typeFolder = 0 
04.
Const typeFile   = 1 
05.
 
06.
Dim objFSO, objWMIService, intRetVal 
07.
 
08.
Set objFSO        = CreateObject("Scripting.FileSystemObject") 
09.
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\root\cimv2") 
10.
 
11.
If WScript.Arguments.Count > 0 Then 
12.
  If objFSO.FolderExists(WScript.Arguments(0)) Then 
13.
    TraverseFolderTree objFSO.GetFolder(WScript.Arguments(0)) 
14.
    intRetVal = 0 
15.
  Else 
16.
    WScript.StdErr.WriteLine "Fehler: Verzeichnis wurde nicht gefunden." 
17.
    intRetVal = 2 
18.
  End If 
19.
Else 
20.
  WScript.StdErr.WriteLine "Fehler: Bitte geben Sie ein Verzeichnis an." 
21.
  intRetVal = 1 
22.
End If 
23.
 
24.
WScript.Quit intRetVal 
25.
 
26.
 
27.
 
28.
Sub TraverseFolderTree(objFolder) 
29.
  Dim colSubFolders, objSubFolder, colFiles, objFile 
30.
   
31.
  Set colSubFolders = objFolder.SubFolders 
32.
  Set colFiles      = objFolder.Files 
33.
 
34.
  For Each objSubFolder In colSubFolders 
35.
    WScript.StdOut.WriteLine GetItemInfo(typeFolder, objSubFolder) 
36.
  Next 
37.
   
38.
  For Each objFile In colFiles 
39.
    WScript.StdOut.WriteLine GetItemInfo(typeFile, objFile) 
40.
  Next 
41.
   
42.
  For Each objSubFolder In colSubFolders 
43.
    TraverseFolderTree objSubFolder 
44.
  Next 
45.
End Sub 
46.
 
47.
 
48.
Function GetItemInfo(intType, objItem) 
49.
  Dim arrItemInfo(4), dtTimeStamp 
50.
   
51.
  dtTimeStamp = objItem.DateLastModified 
52.
   
53.
  arrItemInfo(0) = Right("0" & Day(dtTimeStamp), 2) & "." & Right("0" & Month(dtTimeStamp), 2) & "." & Year(dtTimeStamp) 
54.
  arrItemInfo(1) = Right("0" & Hour(dtTimeStamp), 2) & ":" & Right("0" & Minute(dtTimeStamp), 2) 
55.
   
56.
  Select Case intType 
57.
    Case typeFolder arrItemInfo(2) = "<DIR>" 
58.
    Case typeFile   arrItemInfo(2) = objItem.Size 
59.
  End Select   
60.
 
61.
  arrItemInfo(3) = GetOwner(objItem.Path) 
62.
  arrItemInfo(4) = objItem.Path 
63.
   
64.
  GetItemInfo = Join(arrItemInfo, ";") 
65.
End Function 
66.
 
67.
 
68.
Function GetOwner(strItemName) 
69.
  Dim objFileSecuritySettings, objSecurityDescriptor 
70.
   
71.
  strItemName = Replace(strItemName, "\", "\\") 
72.
 
73.
  Set objFileSecuritySettings = objWMIService.Get("Win32_LogicalFileSecuritySetting=""" & strItemName & """") 
74.
  objFileSecuritySettings.GetSecurityDescriptor objSecurityDescriptor 
75.
 
76.
  GetOwner = objSecurityDescriptor.Owner.Domain & "\" & objSecurityDescriptor.Owner.Name 
77.
End Function
Um komplett zu sein: Hier noch die etwas unsichere aber viel schnellere Alternative über das Shell COM-Objekt. Diese Version berücksichtigt keine versteckten Dateien. Außerdem muss verhindert werden, dass ZIP- oder andere Archive als Verzeichnisse angesehen werden, deshalb die etwas aufwendigen Abfragen in den Zeilen 33, 39 und 45.
01.
Option Explicit 
02.
 
03.
Const typeFolder = 0 
04.
Const typeFile   = 1 
05.
 
06.
Dim objFSO, objShell, intRetVal 
07.
 
08.
Set objFSO   = CreateObject("Scripting.FileSystemObject") 
09.
Set objShell = CreateObject("Shell.Application") 
10.
 
11.
If WScript.Arguments.Count > 0 Then 
12.
  If objFSO.FolderExists(WScript.Arguments(0)) Then 
13.
    TraverseFolderTree objShell.NameSpace(WScript.Arguments(0)) 
14.
    intRetVal = 0 
15.
  Else 
16.
    WScript.StdErr.WriteLine "Fehler: Verzeichnis wurde nicht gefunden." 
17.
    intRetVal = 2 
18.
  End If 
19.
Else 
20.
  WScript.StdErr.WriteLine "Fehler: Bitte geben Sie ein Verzeichnis an." 
21.
  intRetVal = 1 
22.
End If 
23.
 
24.
WScript.Quit intRetVal 
25.
 
26.
 
27.
 
28.
 
29.
Sub TraverseFolderTree(objFolder) 
30.
  Dim objItem 
31.
 
32.
  For Each objItem In objFolder.Items 
33.
    If objItem.IsFolder And objItem.IsFileSystem And (objItem.Size = 0) Then 
34.
      WScript.StdOut.WriteLine GetItemInfo(typeFolder, objItem) 
35.
    End If 
36.
  Next 
37.
   
38.
  For Each objItem In objFolder.Items 
39.
    If ((Not objItem.IsFolder) And objItem.IsFileSystem) Or (objItem.IsFolder And objItem.IsFileSystem And (objItem.Size <> 0)) Then 
40.
      WScript.StdOut.WriteLine GetItemInfo(typeFile, objItem) 
41.
    End If 
42.
  Next 
43.
   
44.
  For Each objItem In objFolder.Items 
45.
    If objItem.IsFolder And objItem.IsFileSystem And (objItem.Size = 0) Then 
46.
      TraverseFolderTree objItem.GetFolder 
47.
    End If 
48.
  Next 
49.
End Sub 
50.
 
51.
 
52.
Function GetItemInfo(intType, objItem) 
53.
  Dim arrItemInfos(4), dtTimeStamp 
54.
 
55.
  dtTimeStamp = objItem.ModifyDate 
56.
   
57.
  arrItemInfos(0) = Right("0" & Day(dtTimeStamp), 2) & "." & Right("0" & Month(dtTimeStamp), 2) & "." & Year(dtTimeStamp) 
58.
  arrItemInfos(1) = Right("0" & Hour(dtTimeStamp), 2) & ":" & Right("0" & Minute(dtTimeStamp), 2) 
59.
   
60.
  Select Case intType 
61.
    Case typeFolder arrItemInfos(2) = "<DIR>" 
62.
    Case typeFile   arrItemInfos(2) = objItem.Size 
63.
  End Select 
64.
 
65.
  arrItemInfos(3) = objItem.ExtendedProperty("Owner") 
66.
  arrItemInfos(4) = objItem.Path 
67.
   
68.
  GetItemInfo = Join(arrItemInfos, ";") 
69.
End Function
Gruß
Friemler
Bitte warten ..
Mitglied: Pretznbaer
04.03.2013 um 15:49 Uhr
Hallo Friemler,

vielen Dank für deine Hilfe.
Habs mit deiner vorgeschlagenen Lösung ausprobiert und hat auch funktioniert, jedoch hat sich meine Frage so zu sagen von selbst gelöst.

Mein "Schnipsel" funktioniert einwandfrei, egal ob deutsches oder englisches OS.
Problem war nur:

Ich habe vergessen zu erwähnen, dass das Verzeichnis welches ich auslesen möchte, sich in einer anderen Domäne als der "tatsächliche" Rechner (der das Programm ausführt) befindet und somit nicht die BERECHTIGUNGEN für das Auslesen aus dem Active Directory der anderen Domäne vorhanden waren. Das Laufwerk wird zwar auf die andere Domäne gemappt jedoch sind keine Berechtigungen etc. vorhanden.

Lösung daher: ausführen des Programms auf einem Rechner, der sich in der selben Domäne wie das Zielverzeichnis befindet...


Vielen lieben Dank trotzdem für deine Hilfe

Lg
Pretznbaer
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

VB for Applications
Bestimmte Daten aus eine CSV-Datei in eine Excel-Tabelle importieren (2)

Frage von MariaElena zum Thema VB for Applications ...

Batch & Shell
gelöst PS Werte CSV-Datei in AD Attribut (3)

Frage von lupolo zum Thema Batch & Shell ...

Batch & Shell
Mehrere AD Benutzer aus CSV Datei mit PowerShell erstellen (1)

Frage von windelterrorist zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...