kalle10000
Goto Top

VBScript, das aktuell angemeldete Benutzer und deren Workstations ausliest

Hallo,

ich fange gerade mit VBScripten an und komme irgendwie noch gar nicht zurecht.

Das Script soll alle aktuell angemeldeten Benutzer im Netzwerk + Workstation, an der sie gerade sitzen, anzeigen;

oder alle angemeldeten Workstations + Benutzer wäre auch ok.

Für jeden Hinweis, wo ich nachgucken könnte, wäre ich dankbar.

Thx, im Voraus.

PS: Eine batch-Datei nehm ich zur Not auch.

Content-ID: 64231

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

Ausgedruckt am: 17.11.2024 um 17:11 Uhr

bastla
bastla 19.07.2007 um 22:16:39 Uhr
Goto Top
Hallo kalle10000!

Schematisch könnte das etwa so aussehen: Unter Verwendung des CMD-Befehles "net view" eine Liste der Computer ermitteln und diese dann über WMI nach dem angemeldeten User abzufragen:

Set objShell = CreateObject("WScript.Shell")  
Set objWshScriptExec = objShell.Exec("net view")  
'Zum Abfangen der "net view"Ausgabe stdOut verwenden  
Set objStdOut = objWshScriptExec.StdOut
'gesamte "net view"-Ausgabe in strOutput speichern ...  
strOutput = objStdOut.ReadAll
'... und in einzelne Zeilen zerlegen (am Zeilenende = vbCrLF splitten), die als Array gespeichert werden.  
aLines = Split(strOutput, vbCrLF)
'Variable für die Zusammenfassung initialisieren  
strResult = ""  
'Schleife über alle einzelnen Zeilen  
For i = 0 To UBound(aLines)
	'Wenn die Zeile mit "\\" beginnt, ...  
	If Left(aLines(i), 2) = "\\" Then  
		'... enthält sie ab Position 3 einen Rechnernamen.  
		strCmp = Trim(Mid(aLines(i), 3))
		'Falls beim Abfragen des Computers ein Fehler eintritt, nicht abbrechen ...  
		On Error Resume Next
		'Ab dem zweiten gefundenen Rechner (wenn strResult also schon ein Ergebnis enthält) ...  
		If strResult <> "" Then  
			'... zunächst eine Zeilenschaltung und dann Computernamen und User hinzufügen.  
			strResult = strResult & vbCrLF & strCmp & vbTab & UserName(strCmp)
		Else
			'Beim ersten Eintrag ist die Zeilenschaltung nicht nötig.  
			strResult = strCmp & vbTab & UserName(strCmp)
		End If
		'Ab hier wieder bei einem Fehler abbrechen ...  
		On Error Goto 0
	End If
Next
'Das Ergebnis in einer Form ausgeben, die auch den Aufruf aus einer Batchdatei ermöglicht:  
WScript.Echo strResult
WScript.Quit

Function UserName(strComputer)
'Abfrage des beim Funktionsaufruf übergebenen Computernamens per WMI  
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")   
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_ComputerSystem",,48)   
'Auch wenn nur ein Computer abgefragt wird, ist das Ergebnis eine Aufzählung,  
'deren einzelne Elemente mit "For Each" durchlaufen werden ...  
For Each objItem in colItems
	'Den Usernamen als Eigenschaft auslesen und zwischenspeichern ...  
    strUser = objItem.UserName
Next
'... und falls kein User angemeldet ist, Infotext erzeugen.  
If IsNull(strUser) Then strUser = "No User"  
'Function-Ergebnis festlegen  
UserName = strUser
End Function

Aufrufen könnte man dieses Script zB auch von der Kommandozeile mit
cscript //nologo C:\Scripts\ListLogons.vbs
bzw mit dem Zusatz ">D:\Logons.txt" auch die Ergebnisse in eine Textdatei schreiben.

Voraussetzung ist, das Script unter einem Konto mit ausreichenden Rechten für die einzelnen Rechner (Domänen-Administrator sollte genügen face-wink) auszuführen.

Zu überlegen wäre ev noch, vor der WMI-Abfrage sicher zu stellen, dass der Computer noch online ist sowie die Form der Ausgabe.

Grüße
bastla

[Edit] Fehler (siehe unten) korrigiert ... [/Edit]
Biber
Biber 20.07.2007 um 00:20:54 Uhr
Goto Top
Moin kalle10000,

zu bastlas Lösungsskizzen ist ja erfahrungsgemäß wenig hinzuzufügen.

Nur als Fussnote noch die Hinweise:

  • Falls Du Dich irgendwelchen Illusionen bezüglich der Geschwindigkeit in einer mittelprächtigen Domäne hingeben solltest.... teste das Skriptchen erstmal mit einer Testliste von 3 Rechnern.
  • Ein vielfaches schneller als der CMD-Interpreter und auch als der VBS-Interpreter sind natürlich kostenlose One-Trick-Executables wie z.B. die PsLoggedOn.exe [von www.SysInternals.com... bzw. irgend so ein Multi hat die jetzt gekauft]
  • und es gibt natürlich auch richtig gute Bezahlware... da hast Du solche Features in Professionell und auf Klicki-Bunti. Für 6-8 Monatsgehälter allerdings.

Ich würde jedenfalls das Werkzeug ( Batch/Bordmittel, VBS/WMI, Professionelle Tools...) schon von dem Zweck abhängig machen, den Du verfolgst.

Grüße
Biber
kalle10000
kalle10000 20.07.2007 um 10:05:36 Uhr
Goto Top
Ich bin echt gerührt, dass ich hier so schnell eine Lösung habe. Besten Dank. Ich werde mir das jetzt erst mal in Ruhe ansehen und dann ausprobieren.

Verschiedene Tools habe ich dafür auch schon gefunden. Eins davon war sogar Freeware "NEWTFreeware". Für meine Zwecke war das ausreichend, aber ich muss mal so langsam VBScripting lernen.

Nochmal besten Dank.

Mal sehen. Vielleicht habe ich gleich nochmal eine Frage.
kalle10000
kalle10000 20.07.2007 um 10:31:49 Uhr
Goto Top
Das Script ist ja der Hammmer? Wie lange hast Du dafür gebraucht?
bastla
bastla 20.07.2007, aktualisiert am 18.10.2012 um 18:32:13 Uhr
Goto Top
Hallo kalle10000!

Halb so wild - gibt's ja alles schon zu finden, zB für den "net view"-Teil: http://www.microsoft.com/technet/community/columns/scripts/sg1002.mspx)

und für WMI sehr zu empfehlen: WMI Code Creator v1.0

Mehr Links habe ich hier versteckt.

Grüße
bastla

P.S.: Am längsten gebraucht habe ich für die Kommentare - aber Du hast Dich ja als Anfänger deklariert, da wollte ich etwas weiter ausholen ...
kalle10000
kalle10000 20.07.2007 um 11:19:01 Uhr
Goto Top
Danke für die weiteren Links. Die schaue ich mir mal als nächstes an.

Das Script habe ich gerade ausgeführt. Leider muss irgendwo ein klitzekleiner Fehler drin sein.
Die Ausgabe ist leer. Da steht nix drin face-sad .
bastla
bastla 20.07.2007 um 11:27:50 Uhr
Goto Top
Hallo kalle10000!

Nimm das "On Error Resume Next" raus (Kommentar setzen), dann siehst Du auch die entsprechenden Fehlermeldungen. Ansonsten nochmals der Hinweis auf die Berechtigungen ...

Falls Du nur mit einigen Clients testen willst, einfach nach der "aLines=..."-Zeile
aLines = Array("\\PC1", "\\PC2", "\\PC3")  
als neue Zeile einfügen

Grüße
bastla
kalle10000
kalle10000 20.07.2007 um 11:30:47 Uhr
Goto Top
An den Rechten kann es nicht liegen. Ich bin als Domänen-Admin angemeldet.
bastla
bastla 20.07.2007 um 11:32:55 Uhr
Goto Top
OK, eine Möglichkeit abgehakt.

Ansonsten siehe Ergänzungen oben ...

Grüße
bastla
kalle10000
kalle10000 20.07.2007 um 11:39:04 Uhr
Goto Top
C:\Scripts\ListLogons.vbs(37, 1) Laufzeitfehler in Microsoft VBScript: Der Remoteservercomputer ist existiert nicht oder ist nicht verfügbar: 'GetObject'

steht dort, nachdem ich das "on Error Resume Next" auskommentiert habe.

Das mit dem Array probiere ich jetzt.
kalle10000
kalle10000 20.07.2007 um 11:44:09 Uhr
Goto Top
Bei dem Array kommt genau dieselbe Fehlermeldung.

Ah Stop, ich habe die Zeile nicht zusätzlich eingefügt, sondern ausgetauscht.

Das werde ich jetzt erst mal testen.
bastla
bastla 20.07.2007 um 11:44:49 Uhr
Goto Top
Hallo kalle10000!

Vermutlich liegt es daran, dass hinter dem Computernamen noch Leerstellen enthalten sind - ergänze die Zeile
strCmp = <b>Trim(</b>Mid(aLines(i), 3)<b>)</b>

Ist mir leider auch gerade erst aufgefallen ...

Grüße
bastla
bastla
bastla 20.07.2007 um 11:57:45 Uhr
Goto Top
... und wenn ich schon am Beheben der Fehler bin:
If IsNull(strUser) Then strUs<b>e</b>r = "No User"  

Wie Du siehst, war da Ganze nicht sehr ausführlich getestet (für den "net view"-Teil eine Ausgabe der Variable strOutput, für den Rest passende Computernamen als Array - wie oben beschrieben - übergeben) ...

Grüße
bastla

[Edit] Korrekturen oben eingearbeitet. [/Edit]
kalle10000
kalle10000 20.07.2007 um 12:00:33 Uhr
Goto Top
Hi Bastla,

daran liegt es leider auch nicht. Die Nammenskonventionen sehen wie folgt aus.

ABCW0001, ABCW0002 ... ABCW0025

Da sind keine Leerzeichen dazwischen.
bastla
bastla 20.07.2007 um 12:08:30 Uhr
Goto Top
Hallo kalle10000!

Ich meinte nicht "Leerzeichen dazwischen", sondern dass eine Zeile der "net view"-Ausgabe am Ende noch mit Leerstellen aufgefüllt war, womit der Computername dann nach dem Abschneiden der "\\" als zB
"ABCW0001                                                      "  
ermittelt wurde.

Mit der angegebenen Änderung läuft es jetzt bei mir über alle Rechner durch ...

Grüße
bastla
kalle10000
kalle10000 20.07.2007 um 12:20:10 Uhr
Goto Top
Hallo Bastla,

korrekt, dass es bei Dir läuft. Das gibt Hoffnung.
Bei mir geht es aber noch nicht.
Was bekommst Du denn bei 'net view' alles angezeigt?
Ist bei Dir die 2. Spalte auch ausgefüllt?

Vielleicht könntest mir nochmal bitte das funktionierende Script posten.

Und schon mal einen RIESENDANK für Deine Mühe.
kalle10000
kalle10000 20.07.2007 um 12:55:41 Uhr
Goto Top
Mh, komische effects. Jetzt funktioniert das Script bei 12 PC und 10 weitere werden nicht berücksichtigt.
kalle10000
kalle10000 02.08.2007 um 15:22:45 Uhr
Goto Top
Hier noch mal die endgültige Version:
Firewalls müssen auf den Workstations ausgeschaltet sein.
Besten Dank nochmal für die Hilfe.


Set objShell = CreateObject("WScript.Shell")
Set objWshScriptExec = objShell.Exec("net view")
'Zum Abfangen der "net view"Ausgabe stdOut verwenden
Set objStdOut = objWshScriptExec.StdOut
'gesamte "net view"-Ausgabe in strOutput speichern ...
strOutput = objStdOut.ReadAll
'... und in einzelne Zeilen zerlegen (am Zeilenende = vbCrLF splitten), die als Array gespeichert werden.
aLines = Split(strOutput, vbCrLF)
'Variable für die Zusammenfassung initialisieren
strResult = ""
'Schleife über alle einzelnen Zeilen
For i = 0 To UBound(aLines)
'Wenn die Zeile mit "\\" beginnt, ...
If Left(aLines(i), 2) = "\\" Then
'... enthält sie ab Position 3 einen Rechnernamen.
strCmp = Trim(Mid(aLines(i), 3))
On Error Resume Next
strCompi = Split(strCmp, " ")
strCmp = strCompi(0)
'Falls beim Abfragen des Computers ein Fehler eintritt, nicht abbrechen ...
On Error Resume Next
'Ab dem zweiten gefundenen Rechner (wenn strResult also schon ein Ergebnis enthält) ...
If strResult <> "" Then
'... zunächst eine Zeilenschaltung und dann Computernamen und User hinzufügen.
strResult = strResult & vbCrLF & strCmp & vbTab & UserName(strCmp)
Else
'Beim ersten Eintrag ist die Zeilenschaltung nicht nötig.
strResult = strCmp & vbTab & UserName(strCmp)
End If
'Ab hier wieder bei einem Fehler abbrechen ...
On Error Goto 0
End If


Next

'Das Ergebnis in einer Form ausgeben, die auch den Aufruf aus einer Batchdatei ermöglicht:
WScript.Echo strResult
WScript.Quit

Function UserName(strComputer)
'Abfrage des beim Funktionsaufruf übergebenen Computernamens per WMI
Set objWMIService = GetObject("WinMgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_ComputerSystem",,48)
'Auch wenn nur ein Computer abgefragt wird, ist das Ergebnis eine Aufzählung,
'deren einzelne Elemente mit "For Each" durchlaufen werden ...
For Each objItem in colItems
'Den Usernamen als Eigenschaft auslesen und zwischenspeichern ...
strUser = objItem.UserName
Next
'... und falls kein User angemeldet ist, Infotext erzeugen.
If IsNull(strUser) Then strUser = "No User"
'Function-Ergebnis festlegen
UserName = strUser
End Function

Gruss Kalle