paxx--
Goto Top

VB-Script zum Auslesen von Server-Shares

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

Content-Key: 155067

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

Printed on: April 23, 2024 at 15:04 o'clock

Member: bastla
bastla Nov 14, 2010 at 23:41:24 (UTC)
Goto Top
Hallo Paxx-- und willkommen im Forum!

Das könnte (spärlich getestet) auf Basis eines hier dargestellten Ansatzes so gehen:
Const Liste = "D:\Servers\Serverliste.txt"  
Const LogPath = "D:\Servers"  
Const LogType = "csv"  

Const DelimRec = ";"  
Const DelimACE = "_"  

Set fso = CreateObject("Scripting.FileSystemObject")  
For Each strComputer In Split(fso.OpenTextFile(Liste).ReadAll, vbCrLf)
    Set LogFile = fso.CreateTextFile(LogPath & "\" & strComputer & "." & LogType)  
    LogFile.WriteLine "Share-Name" & DelimRec & "Share-Pfad" & DelimRec & "Share-User" & DelimRec & "NTFS-User"  
    
    Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
    Set colItems = objWMI.ExecQuery("Select * From Win32_Share")  
    For Each objShare In colItems
        strPath = objShare.Path
        strName = objShare.Name

        Set colItems = objWMI.ExecQuery("Select * From Win32_LogicalShareSecuritySetting WHERE Name='" & objShare.Name & "'",,48)  
        strAceShare = ""  
        For Each objItem in colItems
            If Not objItem.GetSecurityDescriptor(wmiSecurityDescriptor) Then
                For Each wmiAce in wmiSecurityDescriptor.DACL
                    strAceName = wmiAce.Trustee.Domain & "\" & wmiAce.Trustee.Name  
                    If Left(strAceName, 1) = "\" Then strAceName = Mid(strAceName, 2)  
                    If InStr(strAceShare, "_" & strAceName) = 0 Then  
                        strAceShare = strAceShare & DelimACE & strAceName
                    End If
                Next
            End If
        Next
    
        Set colItems = objWMI.ExecQuery("Select * From Win32_LogicalFileSecuritySetting WHERE Path='" & Replace(strPath,"\","\\") & "'",,48)  
        strAceNTFS = ""  
        For Each objItem in colItems
            If Not objItem.GetSecurityDescriptor(wmiSecurityDescriptor) Then
                For Each wmiAce in wmiSecurityDescriptor.DACL
                    strAceName = wmiAce.Trustee.Domain & "\" & wmiAce.Trustee.Name  
                    If Left(strAceName, 1) = "\" Then strAceName = Mid(strAceName, 2)  
                    If InStr(strAceNTFS, "_" & strAceName) = 0 Then  
                        strAceNTFS = strAceNTFS & DelimACE & strAceName
                    End If
                Next
            End If
        Next
    
        strRecord = strName & DelimRec & strPath  & DelimRec & Mid(strAceShare, 2) & DelimRec & Mid(strAceNTFS, 2)
        LogFile.WriteLine strRecord
    Next
    LogFile.Close
Next
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
Member: Paxx--
Paxx-- Nov 16, 2010 at 09:10:46 (UTC)
Goto Top
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
Member: bastla
bastla Nov 16, 2010 at 09:25:54 (UTC)
Goto Top
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:
Const Liste = "D:\Servers\Serverliste.txt"  
Const LogPath = "D:\Servers"  
Const LogAll = "AlleServer" 'Dateiname "Zusammenfassung für alle Server"  
Const LogType = "csv"  

Const DelimRec = ";"  
Const DelimACE = "_"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set LogFileAll = fso.CreateTextFile(LogPath & "\" & LogAll & "." & LogType)  
For Each strComputer In Split(fso.OpenTextFile(Liste).ReadAll, vbCrLf)
    Set LogFile = fso.CreateTextFile(LogPath & "\" & strComputer & "." & LogType)  
    LogFile.WriteLine "Share-Name" & DelimRec & "Share-Pfad" & DelimRec & "Share-User" & DelimRec & "NTFS-User"  
    LogFileAll.WriteLine "Server" & DelimRec & "Share-Name" & DelimRec & "Share-Pfad" & DelimRec & "Share-User" & DelimRec & "NTFS-User"  
    
    Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
    Set colItems = objWMI.ExecQuery("Select * From Win32_Share")  
    For Each objShare In colItems
        strPath = objShare.Path
        strName = objShare.Name

        Set colItems = objWMI.ExecQuery("Select * From Win32_LogicalShareSecuritySetting WHERE Name='" & objShare.Name & "'",,48)  
        strAceShare = ""  
        For Each objItem in colItems
            If Not objItem.GetSecurityDescriptor(wmiSecurityDescriptor) Then
                For Each wmiAce in wmiSecurityDescriptor.DACL
                    strAceName = wmiAce.Trustee.Domain & "\" & wmiAce.Trustee.Name  
                    If Left(strAceName, 1) = "\" Then strAceName = Mid(strAceName, 2)  
                    If InStr(strAceShare, "_" & strAceName) = 0 Then  
                        strAceShare = strAceShare & DelimACE & strAceName
                    End If
                Next
            End If
        Next
    
        Set colItems = objWMI.ExecQuery("Select * From Win32_LogicalFileSecuritySetting WHERE Path='" & Replace(strPath,"\","\\") & "'",,48)  
        strAceNTFS = ""  
        For Each objItem in colItems
            If Not objItem.GetSecurityDescriptor(wmiSecurityDescriptor) Then
                For Each wmiAce in wmiSecurityDescriptor.DACL
                    strAceName = wmiAce.Trustee.Domain & "\" & wmiAce.Trustee.Name  
                    If Left(strAceName, 1) = "\" Then strAceName = Mid(strAceName, 2)  
                    If InStr(strAceNTFS, "_" & strAceName) = 0 Then  
                        strAceNTFS = strAceNTFS & DelimACE & strAceName
                    End If
                Next
            End If
        Next
    
        strRecord = strName & DelimRec & strPath  & DelimRec & Mid(strAceShare, 2) & DelimRec & Mid(strAceNTFS, 2)
        LogFile.WriteLine strRecord
        LogFileAll.WriteLine strComputer & DelimRec & strRecord
    Next
    LogFile.Close
Next
LogFileAll.Close
WScript.Echo "Fertig."  
[Edit] Konstante "_" in den Zeilen 29 und 42 durch DelimACE ersetzt [/Edit]
Grüße
bastla
Member: Paxx--
Paxx-- Nov 19, 2010 at 12:01:56 (UTC)
Goto Top
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
Member: bastla
bastla Nov 19, 2010 at 15:00:51 (UTC)
Goto Top
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
Member: Paxx--
Paxx-- Nov 23, 2010 at 13:18:55 (UTC)
Goto Top
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
Member: Paxx--
Paxx-- Dec 14, 2010 at 15:19:58 (UTC)
Goto Top
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
Member: bastla
bastla Dec 14, 2010 at 15:28:50 (UTC)
Goto Top
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