Befehl remote auf mehreren Clients ausführen
Hallo zusammen,
Folgende Ausgangslage:
Ich möchte per Batchdatei (wenn's geht ohne VB) auf 100 Clients überprüfen, ob es einen lokalen user mit dem Namen "Admin" oder "administrator" gibt.
Wenn ja, soll das Resultat in ein "result.txt" geschrieben werden.
Dies soll nicht per login oder Startscript geschehen sondern live... dass heisst wenn ich das Script starte, geht es auf jede Maschine und überprüft dies.
Die Namen der Clients sind in einer Liste "clients.txt".
Wie kann mann dies am besten bewerkstelligen..?
Vielen Dank für Eure Hilfe
Gruss
JOML
Folgende Ausgangslage:
Ich möchte per Batchdatei (wenn's geht ohne VB) auf 100 Clients überprüfen, ob es einen lokalen user mit dem Namen "Admin" oder "administrator" gibt.
Wenn ja, soll das Resultat in ein "result.txt" geschrieben werden.
Dies soll nicht per login oder Startscript geschehen sondern live... dass heisst wenn ich das Script starte, geht es auf jede Maschine und überprüft dies.
Die Namen der Clients sind in einer Liste "clients.txt".
Wie kann mann dies am besten bewerkstelligen..?
Vielen Dank für Eure Hilfe
Gruss
JOML
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 83886
Url: https://administrator.de/contentid/83886
Ausgedruckt am: 25.11.2024 um 07:11 Uhr
18 Kommentare
Neuester Kommentar
Ok, weiß nicht ob das unter den 2000 Clients geht, aber nen Versuch ist es wert.
Zum Ausführen nimmst Du psExec
Kooperiert dank "@Datei" sogar mit Deiner Clients.txt
Dann kopiert Du auf alle Client folgende Batch:
@echo off
net user | findstr "Admin" > M:\%computername%.txt
M: steht jetzt für ein von mir erfundenes Netzlaufwerk. Somit sieht Du welche Clients den User
Admin oder Administrator bei sich auf dem System haben.
Du könntest Dir sogar noch eine Batch erstellen, die die obere Batch (nennen wir sie mal auslesen.bat) auf alle Clients kopiert:
@echo OFF
FOR /F %%a IN (clients.txt) DO (
copy C:\auslesen.bat \\%%a\c$\auslesen.bat
)
Zum Ausführen nimmst Du psExec
Kooperiert dank "@Datei" sogar mit Deiner Clients.txt
Dann kopiert Du auf alle Client folgende Batch:
@echo off
net user | findstr "Admin" > M:\%computername%.txt
M: steht jetzt für ein von mir erfundenes Netzlaufwerk. Somit sieht Du welche Clients den User
Admin oder Administrator bei sich auf dem System haben.
Du könntest Dir sogar noch eine Batch erstellen, die die obere Batch (nennen wir sie mal auslesen.bat) auf alle Clients kopiert:
@echo OFF
FOR /F %%a IN (clients.txt) DO (
copy C:\auslesen.bat \\%%a\c$\auslesen.bat
)
@miniversum
Gute Idee, aber sollte es nen User Admin* geben und der hat sich nie eingeloggt,
so wird dieser leider auch nicht ausgegeben, da der Ordner ja nie erstellt worden ist.
@JOML
Ich glaube das hat was mit der "Umleitung" zu tun.
Gute Idee, aber sollte es nen User Admin* geben und der hat sich nie eingeloggt,
so wird dieser leider auch nicht ausgegeben, da der Ordner ja nie erstellt worden ist.
@JOML
Ich glaube das hat was mit der "Umleitung" zu tun.
Du kanst dir die umleitung mit >results.txt sparen wenn du in der VBS datei direkt in die datei schreibst UND zusätzlich eine ausgabe auf dem Bildschirm machst.
Eine andere Möglichkeit wäre einfach das ganze so von der Eingabeaufforderung aufzurufen:
Eine andere Möglichkeit wäre einfach das ganze so von der Eingabeaufforderung aufzurufen:
FOR /F "delims=" %i in ('cscript /nologo localAccounts.vbs') do (@echo %i & echo %i>>results.txt)
in einer Batch dann die %% durch %% ersetzen.
Hallo JOML!
Versuch es einmal mit dieser Variation Deines Scripts:
Hier wird, wie auch von miniversum vorgeschlagen, durch das Script selbst in die Zieldatei geschrieben, sodass Du es tatsächlich ohne Umleitung der Ausgabe starten kannst.
Erfasst werden nur Computer mit den entsprechenden Konten sowie nicht erreichbare Clients.
Grüße
bastla
Versuch es einmal mit dieser Variation Deines Scripts:
On Error Resume Next
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Set fso = CreateObject("Scripting.FileSystemObject")
Set oCList = fso.OpenTextFile("C:\Scripts\LocalAccounts\clients.txt", 1)
Set oRList = fso.OpenTextFile("C:\Scripts\LocalAccounts\results.txt", 2, True)
Clients = Split(oCList.ReadAll, vbCrLF)
oCList.Close
U = UBound(Clients)
Do While Clients(U) = ""
U = U - 1
Loop
For i = 0 To U
strComputer = Clients(i)
WScript.Echo Right(" " & CStr(i + 1), 3) & "/" & CStr(U + 1) & ": " & strComputer
If Ping(strComputer) Then
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount WHERE Name LIKE 'Admin%'", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
oRList.WriteLine strComputer & vbTab & objItem.Name
Next
Else
oRList.WriteLine strComputer & vbTab & "### nicht erreichbar ###"
End If
Next
oRList.Close
Function Ping(machine)
PingResult = True
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._
ExecQuery("select * from Win32_PingStatus where address = '" & machine & "'")
For Each objStatus in objPing
If IsNull(objStatus.StatusCode) Or objStatus.StatusCode <> 0 Then
PingResult = False
End If
Next
Ping = PingResult
End Function
Erfasst werden nur Computer mit den entsprechenden Konten sowie nicht erreichbare Clients.
Grüße
bastla
Hallo JOML!
Lässt Du das Script auf einem W2000 laufen? Dort ist "Win32_PingStatus" nicht verfügbar, was aber wegen des "On Error Resume Next" zu keinem angezeigten Fehler führt - lass das "On Error" doch einmal weg ...
Um wieder sämtliche User der einzelnen Clients (und nicht nur solche, deren Namen mit "Admin" beginnen) angezeigt zu bekommen, müsstest Du nur wieder das
aus der "Set colItems ..."-Zeile entfernen.
Die Ausgabe wird aber leichter auswertbar (zB über Excel), wenn, wie derzeit vorgesehen, für jeden User eine Zeile
in die Ergebnisdatei geschrieben wird. Um zu Deiner ursprünglichen Ausgabe zurückzukehren, musst Du nur die entsprechenden "WScript.Echo"-Zeilen in die Datei schreiben, also zB
(nach der Zeile "If Ping(strComputer) Then" einfügen) verwenden.
Grüße
bastla
[Edit]
Hatte Deinen Nachtrag zu spät gesehen ...
Nachtrag meinerseits: Auch die zu pingenden Clients müssten mind XP verwenden ...
[/Edit]
Client1 "### nicht erreichbar ###"
sollte eigentlich nur eingetragen werden, wenn kein "ping" möglich war.Lässt Du das Script auf einem W2000 laufen? Dort ist "Win32_PingStatus" nicht verfügbar, was aber wegen des "On Error Resume Next" zu keinem angezeigten Fehler führt - lass das "On Error" doch einmal weg ...
Um wieder sämtliche User der einzelnen Clients (und nicht nur solche, deren Namen mit "Admin" beginnen) angezeigt zu bekommen, müsstest Du nur wieder das
WHERE Name LIKE 'Admin%'
Die Ausgabe wird aber leichter auswertbar (zB über Excel), wenn, wie derzeit vorgesehen, für jeden User eine Zeile
Client<TAB>Username
oRList.WriteLine "=========================================="
Grüße
bastla
[Edit]
Hatte Deinen Nachtrag zu spät gesehen ...
Nachtrag meinerseits: Auch die zu pingenden Clients müssten mind XP verwenden ...
[/Edit]
Hallo JOML!
Um das "Pingen" in den Griff zu bekommen, tausche bitte die entsprechende Function gegen
Dadurch wird auf den CMD-"Ping" zurückgegriffen (siehe die Parameter in der Zeile "Set objExec = ...").
Nachzulesen ist das Ganze hier.
Grüße
bastla
Um das "Pingen" in den Griff zu bekommen, tausche bitte die entsprechende Function gegen
Function Ping(machine)
Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("ping -n 2 -w 1000 " & machine)
strPingResults = LCase(objExec.StdOut.ReadAll)
If InStr(strPingResults, "antwort von") Then
Ping = True
Else
Ping = False
End If
End Function
Nachzulesen ist das Ganze hier.
Grüße
bastla