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

VB-Script zum Auslesen von Server-Shares

Frage Entwicklung

Mitglied: Paxx--

Paxx-- (Level 1) - Jetzt verbinden

14.11.2010, aktualisiert 16.11.2010, 5404 Aufrufe, 8 Kommentare

Hallo zusammen

unzählige Foren habe ich jetzt schon durchsucht, jedoch erfolglos.
Darum frage ich hier auch mal nach.

Bei uns werden den Usern Server zugeteilt, auf welchen Sie dann temporäre Adminrechte bekommen.
Doch bis jetzt wurden beim wieder Zurückgeben der Server die angelegten Shares nicht überprüft und gelöscht, was nun unbefugten Zugriff auf die Systeme möglich macht.

Gibt es eine Möglichkeit ein VB-Script zum Auslesen von Shares auf Servern, und den darauf berechtigten Usern zu basteln?

Ich möchte gern in eine Liste alle Servernamen eintragen, zB Text-File was etwa so aussehen sollte:

server01
server02
server03
usw.

auf welchen dann über das Script die Shares und die darauf berechtigten User ausgelesen werden
Der Share-Namen, -Pfad und die User sollen dann in eine Log-Datei geschrieben werden (am Besten Excel-Liste, wenn dies überhaupt möglich ist..)
Das Löschen der Shares würde dann manuell erfolgen.

Für eine Lösung wäre ich Euch sehr sehr dankbar, da ich überhaupt nicht vertraut mit Scripting bin.

Beste Grüsse
Paxx
Mitglied: bastla
15.11.2010 um 00:41 Uhr
Hallo Paxx-- und willkommen im Forum!

Das könnte (spärlich getestet) auf Basis eines hier dargestellten Ansatzes so gehen:
01.
Const Liste = "D:\Servers\Serverliste.txt" 
02.
Const LogPath = "D:\Servers" 
03.
Const LogType = "csv" 
04.
 
05.
Const DelimRec = ";" 
06.
Const DelimACE = "_" 
07.
 
08.
Set fso = CreateObject("Scripting.FileSystemObject") 
09.
For Each strComputer In Split(fso.OpenTextFile(Liste).ReadAll, vbCrLf) 
10.
    Set LogFile = fso.CreateTextFile(LogPath & "\" & strComputer & "." & LogType) 
11.
    LogFile.WriteLine "Share-Name" & DelimRec & "Share-Pfad" & DelimRec & "Share-User" & DelimRec & "NTFS-User" 
12.
     
13.
    Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
14.
    Set colItems = objWMI.ExecQuery("Select * From Win32_Share") 
15.
    For Each objShare In colItems 
16.
        strPath = objShare.Path 
17.
        strName = objShare.Name 
18.
 
19.
        Set colItems = objWMI.ExecQuery("Select * From Win32_LogicalShareSecuritySetting WHERE Name='" & objShare.Name & "'",,48) 
20.
        strAceShare = "" 
21.
        For Each objItem in colItems 
22.
            If Not objItem.GetSecurityDescriptor(wmiSecurityDescriptor) Then 
23.
                For Each wmiAce in wmiSecurityDescriptor.DACL 
24.
                    strAceName = wmiAce.Trustee.Domain & "\" & wmiAce.Trustee.Name 
25.
                    If Left(strAceName, 1) = "\" Then strAceName = Mid(strAceName, 2) 
26.
                    If InStr(strAceShare, "_" & strAceName) = 0 Then 
27.
                        strAceShare = strAceShare & DelimACE & strAceName 
28.
                    End If 
29.
                Next 
30.
            End If 
31.
        Next 
32.
     
33.
        Set colItems = objWMI.ExecQuery("Select * From Win32_LogicalFileSecuritySetting WHERE Path='" & Replace(strPath,"\","\\") & "'",,48) 
34.
        strAceNTFS = "" 
35.
        For Each objItem in colItems 
36.
            If Not objItem.GetSecurityDescriptor(wmiSecurityDescriptor) Then 
37.
                For Each wmiAce in wmiSecurityDescriptor.DACL 
38.
                    strAceName = wmiAce.Trustee.Domain & "\" & wmiAce.Trustee.Name 
39.
                    If Left(strAceName, 1) = "\" Then strAceName = Mid(strAceName, 2) 
40.
                    If InStr(strAceNTFS, "_" & strAceName) = 0 Then 
41.
                        strAceNTFS = strAceNTFS & DelimACE & strAceName 
42.
                    End If 
43.
                Next 
44.
            End If 
45.
        Next 
46.
     
47.
        strRecord = strName & DelimRec & strPath  & DelimRec & Mid(strAceShare, 2) & DelimRec & Mid(strAceNTFS, 2) 
48.
        LogFile.WriteLine strRecord 
49.
    Next 
50.
    LogFile.Close 
51.
Next 
52.
WScript.Echo "Fertig."
Für jeden Server wird auf Basis der Liste in "D:\Servers\Serverliste.txt" eine Datei "D:\Servers\Servername.csv" (Anpassungen kannst Du in den Zeilen 1 bis 3 vornehmen) erzeugt. Diese sollte sich per Doppelkllick in Excel öffnen lassen und (da als Trennzeichen - siehe Zeile 5 - ein Semikolon verwendet wird) auf 4 Spalten verzeilt dargestellt werden.

Die User, für welche Freigabe- bzw NTFS-Berechtigungen gesetzt sind, werden durch "_" getrennt dargestellt; das Trennzeichen kannst Du in Zeile 6 ändern.

Vorauszusetzen ist noch, dass Du auf allen abzufragenden Servern Adminrechte hast.

Grüße
bastla
Bitte warten ..
Mitglied: Paxx--
16.11.2010 um 10:10 Uhr
Guten Tag bastla

danke Dir vielmals für dieses geniale Script. Alle meine Anforderungen werden damit erfüllt.

Gibt es eine Möglichkeit alle Server, auf welchen die Shares ausgelesen werden in ein einziges *.csv-File zu schreiben, untereinander?
Bisher wurde für jeden Server ein File erstellt.
Perfekt wäre natürlich wenn das Script für jeden Server ein File erstellt und am Schluss alles nochmals in einem File zusammenfasst.

Ich kann nicht einschätzen wie viel Aufwand das ist, doch die Bereinigung der Shares auf den Servern wäre dadurch noch einfacher!

Nochmals, vielen vielen Dank!

Freundliche Grüsse
Paxx
Bitte warten ..
Mitglied: bastla
16.11.2010 um 10:25 Uhr
Hallo Paxx--!
Gibt es eine Möglichkeit alle Server, auf welchen die Shares ausgelesen werden in ein einziges *.csv-File zu schreiben, untereinander?
Dazu müsste eigentlich nur der Datensatz um ein Feld "Server" erweitert werden - ungetestet etwa so:
01.
Const Liste = "D:\Servers\Serverliste.txt" 
02.
Const LogPath = "D:\Servers" 
03.
Const LogAll = "AlleServer" 'Dateiname "Zusammenfassung für alle Server" 
04.
Const LogType = "csv" 
05.
 
06.
Const DelimRec = ";" 
07.
Const DelimACE = "_" 
08.
 
09.
Set fso = CreateObject("Scripting.FileSystemObject") 
10.
Set LogFileAll = fso.CreateTextFile(LogPath & "\" & LogAll & "." & LogType) 
11.
For Each strComputer In Split(fso.OpenTextFile(Liste).ReadAll, vbCrLf) 
12.
    Set LogFile = fso.CreateTextFile(LogPath & "\" & strComputer & "." & LogType) 
13.
    LogFile.WriteLine "Share-Name" & DelimRec & "Share-Pfad" & DelimRec & "Share-User" & DelimRec & "NTFS-User" 
14.
    LogFileAll.WriteLine "Server" & DelimRec & "Share-Name" & DelimRec & "Share-Pfad" & DelimRec & "Share-User" & DelimRec & "NTFS-User" 
15.
     
16.
    Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
17.
    Set colItems = objWMI.ExecQuery("Select * From Win32_Share") 
18.
    For Each objShare In colItems 
19.
        strPath = objShare.Path 
20.
        strName = objShare.Name 
21.
 
22.
        Set colItems = objWMI.ExecQuery("Select * From Win32_LogicalShareSecuritySetting WHERE Name='" & objShare.Name & "'",,48) 
23.
        strAceShare = "" 
24.
        For Each objItem in colItems 
25.
            If Not objItem.GetSecurityDescriptor(wmiSecurityDescriptor) Then 
26.
                For Each wmiAce in wmiSecurityDescriptor.DACL 
27.
                    strAceName = wmiAce.Trustee.Domain & "\" & wmiAce.Trustee.Name 
28.
                    If Left(strAceName, 1) = "\" Then strAceName = Mid(strAceName, 2) 
29.
                    If InStr(strAceShare, "_" & strAceName) = 0 Then 
30.
                        strAceShare = strAceShare & DelimACE & strAceName 
31.
                    End If 
32.
                Next 
33.
            End If 
34.
        Next 
35.
     
36.
        Set colItems = objWMI.ExecQuery("Select * From Win32_LogicalFileSecuritySetting WHERE Path='" & Replace(strPath,"\","\\") & "'",,48) 
37.
        strAceNTFS = "" 
38.
        For Each objItem in colItems 
39.
            If Not objItem.GetSecurityDescriptor(wmiSecurityDescriptor) Then 
40.
                For Each wmiAce in wmiSecurityDescriptor.DACL 
41.
                    strAceName = wmiAce.Trustee.Domain & "\" & wmiAce.Trustee.Name 
42.
                    If Left(strAceName, 1) = "\" Then strAceName = Mid(strAceName, 2) 
43.
                    If InStr(strAceNTFS, "_" & strAceName) = 0 Then 
44.
                        strAceNTFS = strAceNTFS & DelimACE & strAceName 
45.
                    End If 
46.
                Next 
47.
            End If 
48.
        Next 
49.
     
50.
        strRecord = strName & DelimRec & strPath  & DelimRec & Mid(strAceShare, 2) & DelimRec & Mid(strAceNTFS, 2) 
51.
        LogFile.WriteLine strRecord 
52.
        LogFileAll.WriteLine strComputer & DelimRec & strRecord 
53.
    Next 
54.
    LogFile.Close 
55.
Next 
56.
LogFileAll.Close 
57.
WScript.Echo "Fertig."
[Edit] Konstante "_" in den Zeilen 29 und 42 durch DelimACE ersetzt [/Edit]
Grüße
bastla
Bitte warten ..
Mitglied: Paxx--
19.11.2010 um 13:01 Uhr
Hi Bastla

Perfekt! Alles funktioniert wie gewünscht. Danke Dir! Habe noch schnell ein paar Änderungen am Namen der Log-Files gemacht.
Kannst Du mir erklären (so à la Kommentare im Script) was das Script genau macht, ab 'Set colItems ='?
Dort wo die Log-Files geschrieben werden, ist's wieder klar.


Vielen Dank
Gruss
Paxx
Bitte warten ..
Mitglied: bastla
19.11.2010 um 16:00 Uhr
Hallo Paxx--!

Eigentlich sind das ziemlich standardmäßige WMI-Abfragen - nachdem die Freigaben des jeweiiligen Servers (als "Collection" / "Auflistung") gefunden wurden, werden für jede einzelne zusätzlich (wieder per WMI) die zugeordneten Berechtigungen bzw Berechtigten ausgelesen und zusammengefügt - um Wiederholungen zu vermeiden, wird im "Sammelstring" nach dem neuen Berechtigten gesucht (Zeilen 29 und 43 - dort war übrigens noch jeweils "_" durch die Variable "DelimACE" für das Trennzeichen zwischen den einzelnen "Trustees" zu ersetzen) und nur neue User dem String "strAceShare" (bzw "strAceNTFS" für die Sicherheitseinstellungen) hinzugefügt.

Bei der Ausgabe in die Datei müssen diese beiden Strings dann jeweils um das erste Zeichen (="_") gekürzt werden - genauer wäre es hier übrigens
Mid(strAceShare, Len(DelimACE) + 1)
zu verwenden - nur für den Fall, dass als Trennung zwischen den einzelnen Benutzernamen mehr als ein Zeichen verwendet würde.

Falls Du noch eine konkrete Frage zu einem Einzelteil des Codes hast, werde ich gerne eine Antwort versuchen ...

Grüße
bastla
Bitte warten ..
Mitglied: Paxx--
23.11.2010 um 14:18 Uhr
Hi bastla

Vielen Dank für Deine Ausführung!
habe das Script über Nacht laufen lassen.. Es braucht bei manchen Servern über 8 Stunden. Wiso das? kann man ein 'Wenn Server nach 10 sekunden keine Antwort gibt, dann mache beim Nächsten weiter' einbauen?

Habe mir etwas anderes überlegt: ShareScript wird auf Server 1 ausgeführt.
Es soll für jeden Server in der Liste ein vb-script auf Server 1 erstellt werden (benannt nach dem jeweiligen Server in der Serverliste), welche dann je auf einen Server zugreifen und die Shares usw. auslesen. Die erstellten vbs Scripts sollen am schluss vom ShareScript wieder gelöscht werden.
Alles miteinander, anstatt nacheinander. Weist Du wie ich dies meine?

Danke für Deine Hilfe
lg
Paxx
Bitte warten ..
Mitglied: Paxx--
14.12.2010 um 16:19 Uhr
Hi bastla

können die zusammengefügten NTFS-User nicht untereinander stehen und nicht nebeneinander durch _ getrennt? Nur die NTFS-User, die Share-User können nebeneinander stehen.

Für jeden NTFS User soll der ShareName, SharePfad, und die kombinierten ShareUser vorhanden sein, wenn auch doppelt (gewollt).

Vielen Dank

Gruss
Paxx
Bitte warten ..
Mitglied: bastla
14.12.2010 um 16:28 Uhr
Hallo Paxx-!

Die Zeilen 44 und 50 sind für die entsprechenden Ausgaben "zuständig" - schau Dir die einfach einmal etwas genauer an und ersetze bei Bedarf "DelimACE" (="_") durch "vbCrLf" (= Zeilenschaltung) ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Outlook & Mail
gelöst Email Anhänge speichern VB Script aber nur bestimmte Dateitypen (Outlook) (4)

Frage von LindeUnimog zum Thema Outlook & Mail ...

VB for Applications
gelöst VB Script rekursiv statt nur ein Ordner (4)

Frage von Saschaaaaa zum Thema VB for Applications ...

VB for Applications
gelöst VB Script nach gefundenem Wort die nächsten 4 Zeichen ersetzten (2)

Frage von deutsch73 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (12)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (8)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...