Top-Themen

Aktuelle Themen (A bis Z)

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, 5625 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 ..
Ähnliche Inhalte
Entwicklung
VB Script gesucht um Videodateien auslesen zu können.
gelöst Frage von templierEntwicklung7 Kommentare

Hallo zusammen, ich habe einen Kunden der auf seinem SAN hunderte von Präsentationsvideos angesammelt hat. Diese sollen nun in ...

VB for Applications
VB Script - Besitzer auslesen und E-Mail versenden
gelöst Frage von smackeeVB for Applications2 Kommentare

Hallo Forum Ich möchte gerne mein Ordner und Dateien in einem Verzeichnis auf die Besitzer durchsuchen. Die Besitzer sollten ...

VB for Applications
VB-Script in VB-Script starten und Parameter übergeben
gelöst Frage von denkisVB for Applications7 Kommentare

Hallo liebe Scriptgemeinde, ich muss mehrere Rechner für den Übergang in eine neue Domäne vorbereiten. Dafür sind drei wesentliche ...

Batch & Shell
Probleme bei der Ausführung eines VB-Scriptes
Frage von AuricGoldfingerBatch & Shell1 Kommentar

Hallo zusammen, ich habe folgendes Script geschrieben: Leider bekomme ich bei der Ausführung den Fehler Was mache ich falsch?? ...

Neue Wissensbeiträge
Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 6 StundenBatch & Shell7 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 8 StundenHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 1 TagSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Heiß diskutierte Inhalte
Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server17 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows 10
Windows 10 dunkler Bildschirm nach Umfallen
Frage von AkcentWindows 1015 Kommentare

Hallo, habe hier einen Windows 10 Rechner der von einem User umgefallen wurde (Beine übers Knie, an den PC ...

Windows 10
Bitlocker nach Verschlüsselung nicht mehr aufrufbar!
gelöst Frage von alexlazaWindows 1013 Kommentare

Hallo, ich besitze ein HP ZBook 17 G4 mit einem Windows 10 Pro Betriebssystem. Bei diesem Problem handelt sich, ...

Batch & Shell
Neuste Datei via PowerShell kopieren
gelöst Frage von kaiuwe28Batch & Shell11 Kommentare

Hallo zusammen, ich hatte mir mit Hilfe der Suche im Forum einen kleinen Code von colinardo rausgesucht und versucht ...