Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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
GELÖST

Befehl remote auf mehreren Clients ausführen

Frage Entwicklung Batch & Shell

Mitglied: JOML

JOML (Level 1) - Jetzt verbinden

25.03.2008, aktualisiert 31.03.2008, 8896 Aufrufe, 18 Kommentare

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
Mitglied: funkmasta2k
25.03.2008 um 15:10 Uhr
Sind das denn alles XP Clients in Deinem Netzwerk?
Bitte warten ..
Mitglied: JOML
25.03.2008 um 16:01 Uhr
Ouupps... sorry.
Na ja sagen wir mal zu 95%.. JA.. der Rest ist 2000.
Bitte warten ..
Mitglied: funkmasta2k
25.03.2008 um 16:13 Uhr
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
)
Bitte warten ..
Mitglied: JOML
25.03.2008 um 16:33 Uhr
Hallo funkmasta2k,

Vielen Dank

Geht das auch irgendwie OHNE dass das Batch File auf den Client kopiert wird..?

Ziel ist es das ganze remote zu machen, ohne das irgend ein Tool etc lokal auf die Clients kopiert wird...


Gruss
JOML
Bitte warten ..
Mitglied: funkmasta2k
25.03.2008 um 16:49 Uhr
Wenn es irgendwie möglich ist, würde ich es gerne wissen
Also ich wüsste da leider nichts!
Bitte warten ..
Mitglied: miniversum
25.03.2008 um 18:06 Uhr
Andere Möglichkeit (ungetestet)... Nötige Berechtigungen natürlich vorausgesetzt:
@echo off
FOR /F "delims=" %%i in (clients.txt) do(
echo Prüfe %%i
net use X: %%i /persistent:NO
dir "X:\Dokumente und Einstellungen\Admin*" && echo %%i Hat ein Adminkonto>>Gefundene.txt
net use X: /delete
)
Bitte warten ..
Mitglied: JOML
25.03.2008 um 19:20 Uhr
Mhmm.. ich versuche gerade was in der Art von:

psexec.exe @clients.txt net user | findstr "Admin" >> result.txt

Da bekomme ich aber immer Fehlermeldungen wie:
net exited on clientX with error code 1.

Wenn ich noch user und Passwort dazu gebe kommt error code 0.
Kommt immer ein Error Code..??

Gruss
JOML
Bitte warten ..
Mitglied: funkmasta2k
25.03.2008 um 20:03 Uhr
@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.
Bitte warten ..
Mitglied: JOML
29.03.2008 um 19:19 Uhr
Danke für die Tipp's..
Aber irgendwie komm ich da leider nicht weiter.

Der Einwand von "funkmasts2k" ist berechtigt. Wenn sich ncoh niemand mit diesem Konto eingeloggt hatte... gibt's auch diesen Ordner nicht. Ich muss aber sicherstellen, dass wirklich ausgegeben wird, wenn sich ein Konto mit dem Namen "Admin*" auf dem Rechner befindet.

Habe noch grössere Probleme mit der Ausgabe im txt File.
Aussehen sollte es in etwa so:

Computer1
Admin

Computer2
Administrator

Computer3
Administrator
Admin_Z

usw.

Ist auf diesem Computer kein solches Konto zu finden, gibts einfach keinen Eintrag.

Und jedes mal erscheint diese error Meldung "net exited on clientX with error code 1 (oder 0)"


Vielen Dank für Eure Hilfe.
JOML
Bitte warten ..
Mitglied: JOML
30.03.2008 um 13:47 Uhr
So.. ich habe mir mal ein (das erste ) WMI Script zusammengebastelt. Hab mir z.T die einzelnen Befehle hier aus dem Forum herausgesucht. Ich hoffe das Script ist einigermassen OK.. funktionieren tut's jedenfalls nicht schlecht

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)
Do While Not oCList.AtEndOfStream
strComputer = oCList.ReadLine
WScript.Echo
WScript.Echo "
"
WScript.Echo strComputer
WScript.Echo "
"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each objItem In colItems
WScript.Echo objItem.Name
WScript.Echo
Next

Loop
oCList.Close


Leider habe ich da aber noch ein paar Fragen:

1. Braucht es die beiden Linien "Const wbem..." ?

2. Wie/Wo kann ich da ein "Ping" Befehl einbauen (Wenn 2xPing keine Antwort =go to next client)?

3. Zum Ausführen gebe ich folgendes ein:
cscript /nologo localAccounts.vbs > result.txt

Das funktioniert auch bestens... nur sehe ich leider keinen Status im CMD Fenster. Erst wenn alle durch sind springt das Script wieder auf C:\.
Kann mann da irgendwie einen Status ausgeben lassen wie z.B "36 from 266 Clients done".. oder so..?

Vielen Dank

Gruss
JOML
Bitte warten ..
Mitglied: miniversum
30.03.2008 um 17:29 Uhr
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:
FOR /F "delims=" %i in ('cscript /nologo localAccounts.vbs') do (@echo %i & echo %i>>results.txt)
in einer Batch dann die %% durch %% ersetzen.
Bitte warten ..
Mitglied: JOML
30.03.2008 um 17:55 Uhr
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.

Das ist ja was ich im Punkt 3 Angefragt hatte... wie..?
Vor allem das ich im CMD Fenster einen Status habe (wie oben geschrieben; "36 from 266 Clients done").


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)

Das bringt mir leider auch nicht den oben Angefragten Effekt betreffend Ausgabe
Da erscheint die Ausgabe völlig durcheinander am Bildschirm

in einer Batch dann die %% durch %%
ersetzen.

Ähhm... %% durch %% ersetzten..??
Bitte warten ..
Mitglied: bastla
30.03.2008 um 18:24 Uhr
Hallo JOML!

Versuch es einmal mit dieser Variation Deines Scripts:
01.
On Error Resume Next 
02.
 
03.
Const wbemFlagReturnImmediately = &h10 
04.
Const wbemFlagForwardOnly = &h20 
05.
 
06.
Set fso = CreateObject("Scripting.FileSystemObject") 
07.
Set oCList = fso.OpenTextFile("C:\Scripts\LocalAccounts\clients.txt", 1) 
08.
Set oRList = fso.OpenTextFile("C:\Scripts\LocalAccounts\results.txt", 2, True) 
09.
 
10.
Clients = Split(oCList.ReadAll, vbCrLF) 
11.
oCList.Close 
12.
 
13.
U = UBound(Clients) 
14.
Do While Clients(U) = "" 
15.
	U = U - 1 
16.
Loop 
17.
 
18.
For i = 0 To U 
19.
	strComputer = Clients(i) 
20.
	WScript.Echo Right("   " & CStr(i + 1), 3) & "/" & CStr(U + 1) & ": " & strComputer 
21.
 
22.
	If Ping(strComputer) Then 
23.
		Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
24.
		Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount WHERE Name LIKE 'Admin%'", "WQL", _ 
25.
		wbemFlagReturnImmediately + wbemFlagForwardOnly) 
26.
 
27.
		For Each objItem In colItems 
28.
			oRList.WriteLine strComputer & vbTab & objItem.Name 
29.
		Next 
30.
	Else 
31.
		oRList.WriteLine strComputer & vbTab & "### nicht erreichbar ###" 
32.
	End If 
33.
Next 
34.
oRList.Close 
35.
 
36.
Function Ping(machine) 
37.
PingResult = True 
38.
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._ 
39.
	ExecQuery("select * from Win32_PingStatus where address = '" & machine & "'") 
40.
For Each objStatus in objPing 
41.
	If IsNull(objStatus.StatusCode) Or objStatus.StatusCode <> 0 Then  
42.
		PingResult = False 
43.
	End If 
44.
Next 
45.
Ping = PingResult 
46.
End Function
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
Bitte warten ..
Mitglied: JOML
30.03.2008 um 18:49 Uhr
Hallo bastla,

Die Ausgabe im CMD Fenster ist genial
Genau was ich gesucht hatte. Vielen, vielen Dank !

Jetzt habe ich nur das Problem, dass bei allen Clients, die voher funktionert hatten, nur der folgende Eintrag im "result.txt" steht:
Client1 "### nicht erreichbar ###"
Client2 "### nicht erreichbar ###"
Client3 "### nicht erreichbar ###"

Voher (das obenstehende Script):
Client1
User1

User2

User3

Client2
User1

User2

User3

Client3
User1

User2

User3


Wenn man das jetzt irgendwie verbinden könnte...PERFEKT.

NACHTRAG:
Ich hab jetzt das Script nochmals angeschaut... GENIAL.. da ist ja auch schon die Abfrage für Admin* drin. Es ist PERFEKT.
Kann man den Ping intervall verlängern...? Ich vermute, das darum "### nicht erreichbar ###" erschien.


Gruss
JOML
Bitte warten ..
Mitglied: bastla
30.03.2008 um 19:06 Uhr
Hallo JOML!

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
01.
WHERE Name LIKE 'Admin%'
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
01.
Client<TAB>Username
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
01.
oRList.WriteLine "=========================================="
(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]
Bitte warten ..
Mitglied: JOML
30.03.2008 um 19:19 Uhr
Hallo Bastla,

Auf den 9 Testclients, auf denen ich jetzt getestet hatte + der Client von wo das Script läuft, ist XP Pro installiert..
Leider haben wir auch (noch) ein paar 2000er Clients.

gruss
JOML
Bitte warten ..
Mitglied: bastla
30.03.2008 um 19:19 Uhr
Hallo JOML!

Um das "Pingen" in den Griff zu bekommen, tausche bitte die entsprechende Function gegen
01.
Function Ping(machine) 
02.
Set objShell = CreateObject("WScript.Shell") 
03.
Set objExec = objShell.Exec("ping -n 2 -w 1000 " & machine) 
04.
strPingResults = LCase(objExec.StdOut.ReadAll) 
05.
If InStr(strPingResults, "antwort von") Then 
06.
	Ping = True 
07.
Else 
08.
	Ping = False 
09.
End If 
10.
End Function
Dadurch wird auf den CMD-"Ping" zurückgegriffen (siehe die Parameter in der Zeile "Set objExec = ...").

Nachzulesen ist das Ganze hier.

Grüße
bastla
Bitte warten ..
Mitglied: JOML
31.03.2008 um 01:12 Uhr
Hallo zusammen,

Vielen, vielen Dank an alle (vor allem an bastla) die mir bei diesem Problem geholfen haben.
Jetzt funktionierts perfekt

Gruss
JOML

PS:
Vieleicht kann mir jemand da einen guten Tipp geben..
Script Tools VB-WMI für Anfänger
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...