ACL Datenbank erstellen
Hallo!
Ich bin seit ein paar Wochen Praktikantin in einer großen Firma und ich habe diese Aufgabe bekommen: Ich muss eine ACL Datenbank erstellen für alle Ordner die es in unserem Netzwek gibt. Ich habe bis jetzt 2 Lösungen gefunden. Erstens habe ich dieses Tool ausprobiert http://www.microsoft.com/technet/sysinternals/Security/AccessEnum.mspx . Zuerst dachte ich es ist nicht so toll weil es auch alle Dateien die es gibt auflistet und man so sehr viel Zeit braucht um die Ordner heraus zu suchen. Dann habe ich aber eine Lösung gefunden. Einfach die Textdatei in Access importieren und dann die abfrage "Nicht wie "*.*"" erstellen. So hatte ich in der neuen Abfrage Tabelle nur die Ordner. Aber leider listet dieses Programm nicht alle Ordner und Dateien auf. Ich weiß wirklich nicht warum. Habe alle Optionen versucht aber von den ca. 500.000 Dokumenten/Ordner habe ich nur 10.000 aufgelistet bekommen.
Dann habe ich ein Vbs gefunden: http://www.codeproject.com/vbscript/VBScript_ACL_Crawl.asp .
Es läuft wunderbar und es exportiert mit hilfe von cacls.exe alle Ordner und die Benutzerrechte. Leider ist die Form die Exportiert wird nicht gerade toll. Ich kann sie in dieser Form nicht in einer Datenbank importieren, weil ich die Zeilen einfach nicht trennen kann. Kann mir irgendjemmand einen Tipp geben? Vielleicht warum AccessEnum nicht alles auflistet oder wie ich calcs.exe manipulieren konnte oder das VBS damit es in einer Tabellen geeigneten Form exportiert wird?
Vielen Dank und jeder eizelne Rat ist wilkommen!!!
Ich bin seit ein paar Wochen Praktikantin in einer großen Firma und ich habe diese Aufgabe bekommen: Ich muss eine ACL Datenbank erstellen für alle Ordner die es in unserem Netzwek gibt. Ich habe bis jetzt 2 Lösungen gefunden. Erstens habe ich dieses Tool ausprobiert http://www.microsoft.com/technet/sysinternals/Security/AccessEnum.mspx . Zuerst dachte ich es ist nicht so toll weil es auch alle Dateien die es gibt auflistet und man so sehr viel Zeit braucht um die Ordner heraus zu suchen. Dann habe ich aber eine Lösung gefunden. Einfach die Textdatei in Access importieren und dann die abfrage "Nicht wie "*.*"" erstellen. So hatte ich in der neuen Abfrage Tabelle nur die Ordner. Aber leider listet dieses Programm nicht alle Ordner und Dateien auf. Ich weiß wirklich nicht warum. Habe alle Optionen versucht aber von den ca. 500.000 Dokumenten/Ordner habe ich nur 10.000 aufgelistet bekommen.
Dann habe ich ein Vbs gefunden: http://www.codeproject.com/vbscript/VBScript_ACL_Crawl.asp .
Es läuft wunderbar und es exportiert mit hilfe von cacls.exe alle Ordner und die Benutzerrechte. Leider ist die Form die Exportiert wird nicht gerade toll. Ich kann sie in dieser Form nicht in einer Datenbank importieren, weil ich die Zeilen einfach nicht trennen kann. Kann mir irgendjemmand einen Tipp geben? Vielleicht warum AccessEnum nicht alles auflistet oder wie ich calcs.exe manipulieren konnte oder das VBS damit es in einer Tabellen geeigneten Form exportiert wird?
Vielen Dank und jeder eizelne Rat ist wilkommen!!!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 52041
Url: https://administrator.de/contentid/52041
Ausgedruckt am: 23.11.2024 um 07:11 Uhr
10 Kommentare
Neuester Kommentar
Wenn Du einfach mal die Optionen (soviele gibts nicht) von AccessEnum durchliest, dann kannst Du erkennen, warum es nicht alle anzeigt:
By Default AccessEnum treats files and Directories differently:
- Directories are displayed if their permissions differ from their parent folder
- Files are displayed if their permissions are more lax than their parent folder
-> Wenn Ordner und Datei exakt die Rechte von oben ererben, werden sie nicht angezeigt.
Nein, zu CACLS kann ich Dir auch nicht helfen, aber man kann direkt die ACLs mit VBS und WMI auslesen, hier ein kurzes Stück VBS Code (muß natürlich noch angepasst werden), welches entweder eine einzelne Datei oder eine ganz Ordner-Struktur durchgeht und die Berechtigungen ausgibt (nicht in Tabellenform, aber das ließe sich ja anpassen):
By Default AccessEnum treats files and Directories differently:
- Directories are displayed if their permissions differ from their parent folder
- Files are displayed if their permissions are more lax than their parent folder
-> Wenn Ordner und Datei exakt die Rechte von oben ererben, werden sie nicht angezeigt.
Nein, zu CACLS kann ich Dir auch nicht helfen, aber man kann direkt die ACLs mit VBS und WMI auslesen, hier ein kurzes Stück VBS Code (muß natürlich noch angepasst werden), welches entweder eine einzelne Datei oder eine ganz Ordner-Struktur durchgeht und die Berechtigungen ausgibt (nicht in Tabellenform, aber das ließe sich ja anpassen):
' **************************************************
' * HINWEISE: Auslesen der Berechtigung von Dateien / Ordnern
' **************************************************
dim sec(32)
dim art(4)
' Array um Rechte Bits in Lesbare Form umzusetzen
sec(0)="Lesen"
sec(1)="Schreiben"
sec(2)="Anfügen"
sec(3)="Lesen (Extended)"
sec(4)="Schreiben (Extended)"
sec(5)="Ausführen"
sec(6)="Löschen"
sec(7)="Attribute Lesen"
sec(8)="Attribute Schreiben"
sec(9)="9"
sec(10)="10"
sec(11)="11"
sec(12)="12"
sec(13)="13"
sec(14)="14"
sec(15)="15"
sec(16)="Löschen (Force)"
sec(17)="Sicherheit lesen"
sec(18)="ACL Schreiben"
sec(19)="Besitz übernehmen"
sec(20)="Synchronisieren"
sec(21)="21"
sec(22)="22"
sec(23)="23"
sec(24)="24"
sec(25)="25"
sec(26)="26"
sec(27)="27"
sec(28)="28"
sec(29)="29"
sec(30)="30"
sec(31)="31"
art(0)="Erlaubnis"
art(1)="Verbot"
art(2)="Audit"
' Benötigte Objekte erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
Set wshnet = CreateObject("WScript.Network")
sDatei = InputBox("Name der Datei oder Verzeichnis?","Dateiauswahl","D:\temp8")
wscript.echo Time()
If fso.FolderExists(sDatei) then
Rechte sDatei
VerzDurchgang(fso.getfolder(sDatei))
else
wscript.echo Rechte(sDatei)
End If
wscript.echo Time()
' ***********************************
' ***** Funktionen & Prozeduren *****
' ***********************************
Function Rechte(sDatei)
' Verbindung zur Windows Managment Instrumentation herstellen und ACL Objekt erhalten
sConnect = "winmgmts:Win32_LogicalFileSecuritySetting='" & sDatei & "'"
Set oDatei = GetObject(sConnect)
status = oDatei.getsecurityDescriptor(oDescriptor)
oACL = oDescriptor.Properties_.Item("dacl").Value
list = sDatei & vbcrlf
' Alle Einträge durchgehen und Ausgabe zusammenbasteln
For each entry in oACL
list = list & entry.Trustee.SIDString & vbcrlf & entry.Trustee.Name & ":" & entry.AccessMask & " - " & art(entry.ACEType) & vbCrLf & secText(entry.AccessMask)
Next
Wscript.echo list
Wscript.echo "--------------------------------"
End Function
Function SecText(binary)
For x = 0 to 30
If (binary And 2^x)<>0 then
sTemp = sTemp & CStr(x) & ":" & CStr(sec(x)) & vbCrLf
End If
Next
SecText = sTemp
End Function
Sub VerzDurchgang(Verzeichnis)
' ***** Fehlerhandling abschalten, wegen Zugriffsverletzungen
On Error Resume Next
FilesDurchgang Verzeichnis
For each folder in Verzeichnis.Subfolders
'***** Was jetzt tun? -> Rechte auslesen
call Rechte(folder.Path)
VerzDurchgang folder
Next
End Sub
Sub FilesDurchgang(Verzeichnis)
' ***** Fehlerhandling abschalten, wegen Zugriffsverletzungen
On Error Resume Next
For each file in Verzeichnis.files
' ***** Was jetzt tun? Rechte auslesen
Call Rechte(file.Path)
Next
End Sub
Ich bin nur noch nicht zum Antworten gekommen bezüglich Deinen Änderungswünschen, muß schließlich auch arbeiten
Beispiel Erklärung:
S-1-1-0 = Die Gruppe Jeder hat diese SID
Jeder:1179817 - Erlaubnis = Die ACL als Zahl ist 1179817 und ist eine Erlaubnisliste, keine Verbotsliste
Jetzt kommen einzeln Rechte, die Jeder hat:
0:Lesen
3:Lesen (Extended)
5:Ausfhren
7:Attribute Lesen
17:Sicherheit lesen
20:Synchronisieren
Die Zahl davor ist welches Bit bei 1179817 gesetzt ist, daraus ergibt sich welche Berechtigung man hat (z.B. bedeutet gesetztes Bit 0 (wird halt so nummeriert, da Arrays bei 0 anfangen) das man Lesen-Rechte hat, wenn es eine Erlaubt Liste ist).
Am einfachsten bekommt man die Idee, was was bedeutet, wenn man eine Datei nimmt, die Rechte ändert und dann jeweils schaut, was als Ergebniss zurückkommt.
Beispiel Erklärung:
S-1-1-0 = Die Gruppe Jeder hat diese SID
Jeder:1179817 - Erlaubnis = Die ACL als Zahl ist 1179817 und ist eine Erlaubnisliste, keine Verbotsliste
Jetzt kommen einzeln Rechte, die Jeder hat:
0:Lesen
3:Lesen (Extended)
5:Ausfhren
7:Attribute Lesen
17:Sicherheit lesen
20:Synchronisieren
Die Zahl davor ist welches Bit bei 1179817 gesetzt ist, daraus ergibt sich welche Berechtigung man hat (z.B. bedeutet gesetztes Bit 0 (wird halt so nummeriert, da Arrays bei 0 anfangen) das man Lesen-Rechte hat, wenn es eine Erlaubt Liste ist).
Am einfachsten bekommt man die Idee, was was bedeutet, wenn man eine Datei nimmt, die Rechte ändert und dann jeweils schaut, was als Ergebniss zurückkommt.
Die Nummern setzen sich aus den Einzelrechten zusammen und da zum normalen Lesen auch sowas gehört wie Sicherheit Lesen und Attribute Lesen etc, ergeben sich dann so Kombinationen wie 1179817 als Wert zur normalen Leseberechtigung.
Allerdings kommt man mit WMI halt eine Stufe tiefer an die Rechte und liest die Einzelrechte aus. Das ist genau das, was man auch sieht wenn man auf Sicherheit -> Erweitert und dann auf Bearbeiten geht. Dort sieht man auch die einzelnen Einträge.
Jetzt bleibt noch die Frage, ob Du für jeden Eintrag in der ACL eine neue Zeile haben willst (hat den Vorteil, daß die Zeile immer 5 Einträge hat, nämlich Ordner-Pfad, Name des Users, SID des Users, Art des Eintrags, Berechtigungsstufe (OK, man könnte SID z.B. weglassen)) oder ob alle User in einer Zeile kommen sollen, dann weiß man halt nicht, wieviele Einträge kommen (macht die automatische Verarbeitung nicht so einfach).
Wenn es in eine relationale DB kommen soll, ist pro Eintrag eine Zeile besser, und ich mache das im Beispielskript auch so.
Außerdem habe ich es so umgebaut, daß der Startordner per Kommandozeile übergeben wird. Trennung per ;
Starten mit cscript.exe skriptname.vbs Pfad_des_Startordners > Ausgabedatei
Allerdings kommt man mit WMI halt eine Stufe tiefer an die Rechte und liest die Einzelrechte aus. Das ist genau das, was man auch sieht wenn man auf Sicherheit -> Erweitert und dann auf Bearbeiten geht. Dort sieht man auch die einzelnen Einträge.
Jetzt bleibt noch die Frage, ob Du für jeden Eintrag in der ACL eine neue Zeile haben willst (hat den Vorteil, daß die Zeile immer 5 Einträge hat, nämlich Ordner-Pfad, Name des Users, SID des Users, Art des Eintrags, Berechtigungsstufe (OK, man könnte SID z.B. weglassen)) oder ob alle User in einer Zeile kommen sollen, dann weiß man halt nicht, wieviele Einträge kommen (macht die automatische Verarbeitung nicht so einfach).
Wenn es in eine relationale DB kommen soll, ist pro Eintrag eine Zeile besser, und ich mache das im Beispielskript auch so.
Außerdem habe ich es so umgebaut, daß der Startordner per Kommandozeile übergeben wird. Trennung per ;
Starten mit cscript.exe skriptname.vbs Pfad_des_Startordners > Ausgabedatei
' **************************************************
' *
' * VBScript Quelldatei -- erstellt mit Scripting Spy 3.0
' *
' *
' *
' * HINWEISE: Auslesen der Berechtigung von Dateien / Ordnern
' *
' **************************************************
' Kommandozeilenparamter
Set args = Wscript.Arguments
'***** Test ob richtige Anzahl an Kommandozeilenparametern angegeben wurde
If args.Count <> 1 Then
Wscript.echo "Bitte den Startpunkt (Datei oder Ordner) angeben!"
Wscript.Quit
End If
sDatei = args(0)
' Array, um die Art des Eintrags zu ermitteln
dim art(4)
art(0)="Erlaubnis"
art(1)="Verbot"
art(2)="Audit"
' Dictionary, um die Zahlen in Texte zu übersetzen
' Es können beliebige weitere eingetragen werden
Set dict = CreateObject("Scripting.Dictionary")
call dict.add(2032127,"Full")
call dict.add(1245631,"Change")
call dict.add(1179817,"Read")
' Sonstige benötigte Objekte erzeugen
Set fso = CreateObject("Scripting.FileSystemObject")
Set wshnet = CreateObject("WScript.Network")
' Bei Eingabe einer Einzel-Datei werden nur die Rechte der Einzeldatei ausgegeben
' Bei Angabe eines Verzeichnisses alle Unterverzeichnisse (inklusive des Startverzeichnisses
If fso.FolderExists(sDatei) then
Rechte sDatei
VerzDurchgang(fso.getfolder(sDatei))
else
wscript.echo Rechte(sDatei)
End If
' ***********************************
' ***** Funktionen & Prozeduren *****
' ***********************************
Function Rechte(sDatei)
sConnect = "winmgmts:Win32_LogicalFileSecuritySetting='" & sDatei & "'"
Set oDatei = GetObject(sConnect)
status = oDatei.getsecurityDescriptor(oDescriptor)
oACL = oDescriptor.Properties_.Item("dacl").Value
For each entry in oACL
list = sDatei & ";" & entry.Trustee.Name & ";" & entry.Trustee.SIDString & ";" & art(entry.ACEType) & ";"
' Jetzt noch die Übersetzung der Accessmask, dabei Abfrage, falls unbekannte Zahlen auftauchen
If dict.Exists(entry.Accessmask) then
list = list & dict.item(entry.Accessmask)
Else
list = list & "Spezielle Berechtigung: " & entry.Accessmask
End If
Wscript.echo list
Next
End Function
Sub VerzDurchgang(Verzeichnis)
' ***** Fehlerhandling abschalten, wegen Zugriffsverletzungen
On Error Resume Next
' Da wir keine Einzeldateien wollen, den Datei-Durchgang auskommentiert, daher werden nur Ordner gemacht
' FilesDurchgang Verzeichnis
For each folder in Verzeichnis.Subfolders
'***** Was jetzt tun?
call Rechte(folder.Path)
VerzDurchgang folder
Next
End Sub
Sub FilesDurchgang(Verzeichnis)
' ***** Fehlerhandling abschalten, wegen Zugriffsverletzungen
On Error Resume Next
For each file in Verzeichnis.files
' ***** Was jetzt tun?
call Rechte(file.Path)
Next
End Sub