Script mit Winst auf Client ausführen

Antworten
Alukartfahren
Beiträge: 16
Registriert: 15 Okt 2015, 14:14

Script mit Winst auf Client ausführen

Beitrag von Alukartfahren »

Tach!

Wir möchten WakeonLAN global testen und dazu mal alle Clients nachts aufwecken, ein Produkt ausführen und sie wieder herunterfahren.

Das Produkt soll folgendes tun:
schreibe deinen Hostnamen und einen timestamp, getrennt durch semikolon, in eine datei "%ScriptPath%\inventarisierung\wol_erfolg"
wenn du fertig bist, spring zur nächsten zeile.

Erste Frage: Klappt das, wenn das viele gleichzeitig machen? Oder besser einzelne Dateien pro Host anlegen? Mir gehts drum dieses Ergebnis mit einer Liste von Rechnern zu vergleichen, die das Wol eigentlich können müssten.

Zweite Frage: Kann ich sowas elegant mit dem Winst lösen?
Mit einer windows batchdatei bzw Powershell kriege ich das hin; for schleife, echo %hostname% etc., ich hätte da aber gerne eine schöne Winst-syntax im Setup.opsiscript Da gibt es ja %PCNAME%, marktime, ...
Kann das funktionieren und was muss ich beachten?

Danke!
trabs-ol
Beiträge: 64
Registriert: 07 Dez 2011, 10:46

Re: Script mit Winst auf Client ausführen

Beitrag von trabs-ol »

Hi,

über welche Anzahl Clients reden wir und welches Backend wird verwendet? Wenn Du alle Clients auf einmal einschaltest, könnte es für den opsiconfd eng werden...

Zwei Anmerkungen:
  1. Der Share opsi_depot ist im Default Read-Only, somit kannst Du standardmässig nicht nach %ScriptPath% schreiben
  2. Wir haben das serverseitig gelöst... Also: Der OPSI Server macht per Cron das WakeOnLan und schreibt ein Logfile pro Nacht. Dort steht, welche Clients eingeschaltet wurden. Wir wecken einen Client und versuchen dann maximal 2 Minuten diesen anzupingen. Wenn der nach 2 Minuten nicht antwortet, gilt der Client als nicht geweckt. Sobald der erste Ping beantwortet wird machen wir weiter. Ausserdem setzen wir das Paket "shutdownwanted" auf setup, so dass der Client direkt wieder herunterfährt.
Bei Interesse kann ich Dir unser Shell Script mal zukommen lassen...

VG
Lars
Alukartfahren
Beiträge: 16
Registriert: 15 Okt 2015, 14:14

Re: Script mit Winst auf Client ausführen

Beitrag von Alukartfahren »

Hi,

ca 500 Clients betrifft das dann, momentan ist noch das Standard Backend im Einsatz, SQL soll aber angeschafft werden. Danke für den Hinweis.

Ich möchte das auch per Cron machen, habe auch schon ein script, wir können ja mal vergleichen. Nimmst du dann das Standard opsilogfile zum gucken? Also ich möchte eigentlich nur eine Liste mit Ergebnissen aus dem Aufweckversuch erzeugen können. Das shutdownwanted nutzen wir auch.

im Prinzip ist es egal, wo die datei(en) hingelegt werden, ich wollte nur nicht mit irgendwelchen windowsfreigeaben und domänenbenutzern herumhampeln.



--------------------------------
Bei Interesse kann ich Dir unser Shell Script mal zukommen lassen...
-------------------------------

Gern!
larsg
Beiträge: 283
Registriert: 16 Dez 2014, 18:06

Re: Script mit Winst auf Client ausführen

Beitrag von larsg »

Da die Freigabe ohne Schreibrechte verbunden wird, kannst du nicht dahin zurückschreiben.
Um Daten von Clients zu sammeln empfehle ich die Nutzung einer MySQL-Datenbank, das macht auch die Verabeitung der Daten gleich viel einfacher.

Hab so z.b. ein Paket, welches mir u.a. die IP-Konfiguration ausliest, und da wir eh Mysql als Backend nutzen, diese auch gleich in eine entsprechende Tabelle einbastelt. Insbesondere, ob per DHCP oder statisch vergeben.

Du benötigst das Kommandozeilentool mysql.exe, bin mir nicht mehr sicher in welchem Mysql-Paket die enthalten ist...


Code: Alles auswählen

Encoding=utf8



[Actions]
; Append neccessery sections
Include_Append "common.opsiinc"



; Insert script header
Include_Insert "initialize.opsiinc"



; Set extra variables
; ----------------------------------------------------------------------------------------------------------------------
DefVar $NicConfig$
DefVar $DisableIPv6$
DefVar $PingCount$

DefVar $Domain$
DefVar $Host$
DefVar $Active$
DefVar $Index$
DefVar $Name$
DefVar $Service$
DefVar $IPEnabled$
DefVar $DHCPEnabled$ 
DefVar $Subnets$
DefVar $DNSServers$
DefVar $DNSDomains$
DefVar $WINSServers$

DefVar $IP$
DefVar $MAC$
DefVar $DHCP$

DefVar $IP_Ist$
DefVar $SN_Ist$
DefVar $GW_Ist$
DefVar $DNS_Ist$
DefVar $WINS_Ist$

DefStringList $NW$
DefStringList $GW$
DefStringList $DNS$
DefStringList $WINS$

DefVar $Query$
DefVar $Username$
DefVar $Password$
DefVar $Server$
DefVar $Port$
DefVar $Database$
DefVar $Table$

Set $Username$ = ""
Set $Password$ = ""
Set $Server$ = ""
Set $Port$ = ""
Set $Database$ = "" 
Set $Table$ = "analyze_netconfig"
Set $IP$ = GetMyIPByTarget("%OpsiServer%")
Set $Domain$ = ComposeString(GetSubList(1 : ,SplitString("%HostID%",".")),".")
Set $Host$ = TakeString(0,SplitString("%HostID%","."))
; ----------------------------------------------------------------------------------------------------------------------



; Analyze
; ----------------------------------------------------------------------------------------------------------------------
Message "Analysiere - Netzwerkkonfiguration"

Comment "Remove database entries for client %HostID%"
Set $Query$ = "DELETE FROM `"+$Table$+"` WHERE `Domain`='"+$Domain$+"' AND `Host`='"+$Host$+"'"
DosInAnIcon_mysql_command
Set $ExitCode$ = GetLastExitCode

For %NicConfig% in GetOutStreamFromSection('ExecWith_vbs_get_network CScript //nologo //e:vbs') do Sub_sql_command
; ----------------------------------------------------------------------------------------------------------------------

; Insert script footer
Include_Insert "finalize.opsiinc"



[ExecWith_vbs_get_mac]
On Error Resume Next
Set objWMIService = GetObject("WinMgMts:\\.\root\CIMV2")  
Set colItems = objWMIService.ExecQuery("SELECT IPAddress,MACAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=true",,48)
For Each objItem in colItems  
	For Each objIP in objItem.IPAddress
		If objIP = "$IP$" Then
			Wscript.Echo objItem.MACAddress 
		End If
	Next
Next



[ExecWith_vbs_get_dhcp]
On Error Resume Next
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT DHCPEnabled FROM Win32_NetworkAdapterConfiguration WHERE macaddress = '$MAC$'",,48)
For Each objItem in colItems
    Wscript.Echo objItem.DHCPEnabled & ""
Next



[ExecWith_vbs_get_nicname]
On Error Resume Next
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT Name FROM Win32_NetworkAdapterConfiguration WHERE macaddress = '$MAC$'",,48)
For Each objItem in colItems
    Wscript.Echo objItem.Name & ""
Next



[ExecWith_vbs_get_network]
On Error Resume Next
Set objWMIService = GetObject("WinMgMts:\\.\root\CIMV2")  
Set colItems = objWMIService.ExecQuery("SELECT Index,MACAddress,Description,ServiceName,IPEnabled,DHCPEnabled,IPAddress,IPSubnet,DefaultIPGateway,DNSServerSearchOrder,WINSPrimaryServer,WINSSecondaryServer,DNSDomainSuffixSearchOrder FROM Win32_NetworkAdapterConfiguration WHERE NOT MACAddress = NULL",,48)
For Each objItem in colItems
	strItem = objItem.Index&"|"&objItem.MACAddress&"|"&objItem.Description&"|"&objItem.ServiceName&"|"&objItem.IPEnabled&"|"&objItem.DHCPEnabled&"|"
	strIP = ""
	For i = 0 to objItem.IPAddress.Count()
		strIP = strIP & objItem.IPAddress(i)&","&objItem.IPSubnet(i)&","&objItem.DefaultIPGateway(i)&";"
	Next
	If (Right(strIP,1)=";") Then
		strIP = Left(strIP,Len(strIP)-1)
	End If
	strItem = strItem & strIP & "|"
	strDNSServer = ""
	For each objDNSServer in objItem.DNSServerSearchOrder
		strDNSServer = strDNSServer & objDNSServer & ";"
	Next
	If (Right(strDNSServer,1)=";") Then
		strDNSServer = Left(strDNSServer,Len(strDNSServer)-1)
	End If
	strItem = strItem & strDNSServer & "|"
	strDNSDomain = ""
	For each objDNSDomain in objItem.DNSDomainSuffixSearchOrder
		strDNSDomain = strDNSDomain & objDNSDomain & ";"
	Next
	If (Right(strDNSDomain,1)=";") Then
		strDNSDomain = Left(strDNSDomain,Len(strDNSDomain)-1)
	End If
	strItem = strItem & strDNSDomain & "|"
	strWINSServer = objItem.WINSPrimaryServer(i)&";"&objItem.WINSSecondaryServer(i)
	If (Right(strWINSServer,1)=";") Then
		strWINSServer = Left(strWINSServer,Len(strWINSServer)-1)
	End If
	strItem = strItem & strWINSServer
	WScript.echo strItem
Next 



[ExecWith_vbs_get_ipaddress]
On Error Resume Next
Set objWMIService = GetObject("WinMgMts:\\.\root\CIMV2")  
Set colItems = objWMIService.ExecQuery("SELECT IPAddress,IPSubnet FROM Win32_NetworkAdapterConfiguration WHERE macaddress = '$MAC$'",,48)
For Each objItem in colItems
	For i = 0 to objItem.IPAddress.Count()
		Wscript.Echo objItem.IPAddress(i)&";"&objItem.IPSubnet(i)
	Next
Next 



[ExecWith_vbs_get_gateway]
On Error Resume Next
Set objWMIService = GetObject("WinMgMts:\\.\root\CIMV2")  
Set colItems = objWMIService.ExecQuery("SELECT DefaultIPGateway FROM Win32_NetworkAdapterConfiguration WHERE macaddress = '$MAC$'",,48)
For Each objItem in colItems  
	For Each objGateway in objItem.DefaultIPGateway  
		Wscript.Echo objGateway 
	Next
Next 



[ExecWith_vbs_get_dns]
On Error Resume Next
Set objWMIService = GetObject("WinMgMts:\\.\root\CIMV2")  
Set colItems = objWMIService.ExecQuery("SELECT DNSServerSearchOrder FROM Win32_NetworkAdapterConfiguration WHERE macaddress = '$MAC$'",,48)
For Each objItem in colItems
	For Each objDNSServer in objItem.DNSServerSearchOrder
		Wscript.Echo objDNSServer
	Next
Next



[ExecWith_vbs_get_wins]
On Error Resume Next
Set objWMIService = GetObject("WinMgMts:\\.\root\CIMV2")  
Set colItems = objWMIService.ExecQuery("SELECT WINSPrimaryServer,WINSSecondaryServer FROM Win32_NetworkAdapterConfiguration WHERE macaddress = '$MAC$'",,48)
For Each objItem in colItems  
	Wscript.Echo objItem.WINSPrimaryServer
	Wscript.Echo objItem.WINSSecondaryServer 
Next 



[DosInAnIcon_mysql_command]
@Echo off
Prompt $B$H
CHCP 65001
$ToolsDir$\mysql_$System_Architecture$ --batch --no-beep --host=$Server$ --port=$Port$ --database=$Database$ --user=$Username$ --password=$Password$ -e "$Query$"



[Sub_check_active]
If (TakeString(0,SplitString("%Subnet%",","))=$IP$)
	Set $Active$ = "1"
EndIf



[Sub_sql_command]
Set $Active$ = "0"
Set $NicConfig$ = "%NicConfig%" 

Set $Index$ = TakeString(0,SplitString($NicConfig$,"|"))
Set $MAC$ = TakeString(1,SplitString($NicConfig$,"|"))
Set $MAC$ = StringReplace($MAC$,":","")
Set $MAC$ = StringReplace($MAC$,"A","a")
Set $MAC$ = StringReplace($MAC$,"B","b")
Set $MAC$ = StringReplace($MAC$,"C","c")
Set $MAC$ = StringReplace($MAC$,"D","d")
Set $MAC$ = StringReplace($MAC$,"E","e")
Set $MAC$ = StringReplace($MAC$,"F","f")
Set $Name$ = TakeString(2,SplitString($NicConfig$,"|"))
Set $Service$ = TakeString(3,SplitString($NicConfig$,"|"))
Set $IPEnabled$ = TakeString(4,SplitString($NicConfig$,"|"))
Set $IPEnabled$ = StringReplace($IPEnabled$,"Wahr","1")
Set $IPEnabled$ = StringReplace($IPEnabled$,"Falsch","0")
Set $DHCPEnabled$ = TakeString(5,SplitString($NicConfig$,"|"))
Set $DHCPEnabled$ = StringReplace($DHCPEnabled$,"Wahr","1")
Set $DHCPEnabled$ = StringReplace($DHCPEnabled$,"Falsch","0")
Set $Subnets$ = TakeString(6,SplitString($NicConfig$,"|"))
Set $DNSServers$ = TakeString(7,SplitString($NicConfig$,"|"))
Set $DNSDomains$ = TakeString(8,SplitString($NicConfig$,"|"))
Set $WINSServers$ = TakeString(9,SplitString($NicConfig$,"|"))

For %Subnet% in SplitString($Subnets$,";") do Sub_check_active 

Comment "Add database entry for client %HostID%, nic "+$MAC$
Set $Query$ = "INSERT INTO `"+$Table$+"` (`Domain`, `Host`, `Index`, `MAC`, `Name`, `Service`, `Active`, `IPEnabled`, `DHCPEnabled`, `Subnets`, `DNSServers`, `DNSDomains`, `WINSServers`) values ('"+$Domain$+"','"+$Host$+"','"+$Index$+"','"+$MAC$+"','"+$Name$+"','"+$Service$+"',"+$Active$+","+$IPEnabled$+","+$DHCPEnabled$+",'"+$Subnets$+"','"+$DNSServers$+"','"+$DNSDomains$+"','"+$WINSServers$+"')"
DosInAnIcon_mysql_command
Set $ExitCode$ = GetLastExitCode
Antworten