praktikantin
Goto Top

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!!!

Content-Key: 52041

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

Printed on: April 20, 2024 at 01:04 o'clock

Member: Mamut
Mamut Feb 19, 2007 at 09:20:44 (UTC)
Goto Top
Hast du mal ein Paar Zeilen aus dem Dokument welches von cacls.exe erstellt wird?

Dann kann man dir event auch helfen daraus ein Importierbares File zu machen :D
Member: Praktikantin
Praktikantin Feb 19, 2007 at 09:29:57 (UTC)
Goto Top
Hallo und danke für die Schnelle Antwort face-smile

Also die Text Datei die exportiert wird hat diese Form:

Microsoft (R) Windows Script Host, Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. Alle Rechte vorbehalten.

C:\
C:\263b24a6c00389b5ece90e6cd82031 VORDEFINIERT\Administratoren:F
DOMABC\:F
DOMABC\:F


C:\AccessEnum VORDEFINIERT\Administratorenface-sadOI)(CI)F
NT-AUTORITŽT\SYSTEMface-sadOI)(CI)F
DOMABC\:F
ERSTELLER-BESITZERface-sadOI)(CI)(IO)F
VORDEFINIERT\Benutzerface-sadOI)(CI)R
VORDEFINIERT\Benutzerface-sadCI)(Beschr„nkter Zugriffface-smile

FILE_APPEND_DATA

VORDEFINIERT\Benutzerface-sadCI)(Beschr„nkter Zugriffface-smile

FILE_WRITE_DATA


C:\ACMPClient VORDEFINIERT\Administratorenface-sadOI)(CI)F
NT-AUTORITŽT\SYSTEMface-sadOI)(CI)F
VORDEFINIERT\Administratoren:F
ERSTELLER-BESITZERface-sadOI)(CI)(IO)F
VORDEFINIERT\Benutzerface-sadOI)(CI)R
VORDEFINIERT\Benutzerface-sadCI)(Beschr„nkter Zugriffface-smile

FILE_APPEND_DATA

VORDEFINIERT\Benutzerface-sadCI)(Beschr„nkter Zugriffface-smile

FILE_WRITE_DATA

Wie soll ich denn diesses Text Dokument in einer Datenbank einfügen? Es wird einfach alles in einer Zelle impotiert! Ich bin wirklich ratlos...
Member: AndreasHoster
AndreasHoster Feb 19, 2007 at 09:40:44 (UTC)
Goto Top
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):
' **************************************************  
' * 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
Member: Praktikantin
Praktikantin Feb 19, 2007 at 10:04:37 (UTC)
Goto Top
Hallo AndreasHoster und vielen Dank für den Tipp!

Der VBScript ist wirklich sehr hilfreich und alles wird angezeigt. Leider bin ich in VBScript keine Leuchte und es ist wirklich sehr schwer für mich in Diesem Script eine Funktion die die Ordner in einer Textdatei exportiert einzufügen. Es wäre wirklich sehr hilfreich wenn sie das auch in dem Script einfügen würden. Es wäre schon toll wenn nur das Verzeichnis und die Rechte in einer Textdatei expotiert werden und sie sich mit einem komma oder " unterscheiden würden. Ich wäre ihnen wirklich seeeeehr dankbar!!!
Member: Praktikantin
Praktikantin Feb 19, 2007 at 13:08:44 (UTC)
Goto Top
Hallo nochmals!

Kann mir irgendjemmand bitte helfen. Das vorrige Script ist wirklich gut aber ich verstehe nicht was es exportiert:
Microsoft (R) Windows Script Host, Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. Alle Rechte vorbehalten.

11:12:17
C:\
S-1-5-32-544
Administratoren:2032127 - Erlaubnis
0:Lesen
1:Schreiben
2:Anfgen
3:Lesen (Extended)
4:Schreiben (Extended)
5:Ausfhren
6:L”schen
7:Attribute Lesen
8:Attribute Schreiben
16:L”schen (Force)
17:Sicherheit lesen
18:ACL Schreiben
19:Besitz bernehmen
20:Synchronisieren
S-1-5-18
SYSTEM:2032127 - Erlaubnis
0:Lesen
1:Schreiben
2:Anfgen
3:Lesen (Extended)
4:Schreiben (Extended)
5:Ausfhren
6:L”schen
7:Attribute Lesen
8:Attribute Schreiben
16:L”schen (Force)
17:Sicherheit lesen
18:ACL Schreiben
19:Besitz bernehmen
20:Synchronisieren
S-1-3-0
ERSTELLER-BESITZER:268435456 - Erlaubnis
28:28
S-1-5-32-545
Benutzer:1179817 - Erlaubnis
0:Lesen
3:Lesen (Extended)
5:Ausfhren
7:Attribute Lesen
17:Sicherheit lesen
20:Synchronisieren
S-1-5-32-545
Benutzer:4 - Erlaubnis
2:Anfgen
S-1-5-32-545
Benutzer:2 - Erlaubnis
1:Schreiben
S-1-1-0
Jeder:1179817 - Erlaubnis
0:Lesen
3:Lesen (Extended)
5:Ausfhren
7:Attribute Lesen
17:Sicherheit lesen
20:Synchronisieren

Ich verstehe es einfach nicht... Das AccessEnum läuft wirklich gut und ich habe auch beide Optionen versucht. Trotzdem gibt es nicht alle Dateien raus (wegen der 2 Optionen).
Ich habe wirklich keine Ahnung von VBScript. Ich erkenne ein paar Befehle da ich mich mit Java, C, HTML, PHP auskenne aber sonst nichts. Hier muss ich wohl was ändern:

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

Aber wie gesagt der Output ist nicht verständlich... Wenn mir irgendjemmand einen Rat geben konnte oder ein Buch emphelen könnte wäre ich wirklich sehr Dankbar.

MlG

die Praktikantin face-sad
Member: AndreasHoster
AndreasHoster Feb 19, 2007 at 13:25:09 (UTC)
Goto Top
Ich bin nur noch nicht zum Antworten gekommen bezüglich Deinen Änderungswünschen, muß schließlich auch arbeiten face-wink

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:Ausfhren
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.
Member: Praktikantin
Praktikantin Feb 19, 2007 at 13:48:01 (UTC)
Goto Top
Hallo!

Das habe ich gemacht und die Rechte für eine Datei geändert und eine andere nummer bokommen. Ich habe das hier entdeckt:

'access level r, w, f 2032127 '2032127 = "Full"; 1245631 = "Change"; 1179817 = "Read

Ich muss wohl dann anhand dieser Nummern arbeiten. Tut mir wirklich leid dass ich so ungeduldig war... face-smile Mal sehen was sich machen lässt. Ich mach mich ein bisschen schlau (Visual Basic). Vielen Dank für die Große Hilfe. Ich hoffe ich kenne mich bald auch so gut aus wie Sie...

Wenn Sie die kleinen Änderungen für mich machen würden wäre ich ihnen unendlich dankbar!!!
Member: AndreasHoster
AndreasHoster Feb 20, 2007 at 07:50:43 (UTC)
Goto Top
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
' **************************************************  
' *  
' * 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
Member: Praktikantin
Praktikantin Feb 20, 2007 at 13:31:11 (UTC)
Goto Top
Wow! Das ist ja großartig! Genau das wollte ich. Jeder User soll eine Zeile bekommen! Ich probiere es sofort. Heute hatten wir ein Problem mit Arcor und wir konnten ein paar Seiten nicht öffnen! Das ist wirklich super! Vielen Dank! Sie haben mich wirklich gerettet! Danke!!!!!
Member: Praktikantin
Praktikantin Feb 20, 2007 at 13:54:05 (UTC)
Goto Top
Vielen Dank! Ich habe es jetzt laufen lassen und es funktioniert enwandfrei! Ich kann die Daten in dieser Form ganz leicht in eine Datenbank einfügen!!! Danke nochmals sie haben mich gerettet. Es ist eine Schande dass ich VB nicht kann... Schande über mich! Nochmal vielen dank!!!