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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 155067
Url: https://administrator.de/forum/vb-script-zum-auslesen-von-server-shares-155067.html
Ausgedruckt am: 13.05.2025 um 06:05 Uhr
8 Kommentare
Neuester Kommentar
Hallo Paxx-- und willkommen im Forum!
Das könnte (spärlich getestet) auf Basis eines hier dargestellten Ansatzes so gehen:
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
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."
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
Hallo Paxx--!
[Edit] Konstante "_" in den Zeilen 29 und 42 durch
Grüße
bastla
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."
DelimACE
ersetzt [/Edit]Grüße
bastla
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
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
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)
Falls Du noch eine konkrete Frage zu einem Einzelteil des Codes hast, werde ich gerne eine Antwort versuchen ...
Grüße
bastla