Zum Inhalt wechseln


Foto

VB Script - Hilfe gesucht.


  • Bitte melde dich an um zu Antworten
23 Antworten in diesem Thema

#1 Pikus1234

Pikus1234

    Newbie

  • 18 Beiträge

 

Geschrieben 13. April 2017 - 08:56

Hallo,

 

Ich bin, was Scripting angeht ein echter Anfänger und versuche gerade aber eine Arbeitshilfe zu erstellen. Es soll für den Nutzer des Scriptes möglich sein über ein Dialogfeld den PC und dessen Status zu ermitteln. (online/Offline) und danach entsprechend einen bestimmten lokalen Dienst neu starten, da dieser wiederkehrend Probleme bereitet.

Obwohl der Dienst gestartet ist, kann das Programm nicht ausgeführt werden. Nach einen Neustart des Dienstes geht alles wieder.

 

Ich habe also auf der Suche das eine oder andere VBScript gefunden (Google) welches auch für sich funktioniert. Allerdings bekomme ich diese Scripte nicht zusammen verarbeitet.

 

1.) Script von Dieseyer (IP-Adresse anhand des Namens ermitteln) leider ohne Option Explicit weil es sonst nicht läuft.

 

Script:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Set WSHShell  = WScript.CreateObject("WScript.Shell")
Set FSO       = CreateObject("Scripting.FileSystemObject")
Set WSHNet    = WScript.CreateObject("WScript.Network")

Ziel          = "~tmp~.tmp"
PCname        = "PC Name hier eintragen"
PCname        = InputBox("Von welchen PC soll die IP-Adr. ermittelt werden?", WScript.ScriptName, PCname)

WSHShell.run ("%comspec% /c Ping " & PCname & " -n 1 -w 500 > " & Ziel), 0, True     ' Ping nur einmal ausführen
set WSHShell = nothing

Set FileIn = fso.OpenTextFile(Ziel, 1 )                  ' Datei zum Lesen öffnen
  TextX = FileIn.ReadAll                                      ' alles lesen
          FileIn.Close
Set FileIn = nothing
  if fso.FileExists(Ziel) Then fso.DeleteFile(Ziel), True     ' Datei löschen
 
TextX = Split(TextX, vbCRLF)                                  ' alles gelesene in Zeilen aufteilen

for i1 = 0 to ubound(TextX)                                   ' jede Zeile überprüfen
  If InStr(UCase(TextX(i1)), "TTL=")  Then                    ' ob TTL= enthalten ist, wenn ja (PING war erfolgreich)

' Bei der Ping-Ausgabe befindet sich hinter der IP-Adresse ein ":" - was links  vom ":" steht, ist interessant
  EndIPadr   = Mid(TextX(i1), 1, InStr(UCase(TextX(i1)), ":") -1 ) 

' Bei der Ping-Ausgabe befindet sich   vor  der IP-Adresse ein " " - was rechts vom " " steht, ist die IP-Adr.
  IPadr = Mid(EndIPadr, InStrRev(EndIPadr, " ") +1 )
    End If
  next

if     IPadr = "" then MsgBox "Von   " & PCname & "   konnte die IP-Adr. nicht ermittelt werden! Ursache: Offline oder Abbruch", , WScript.ScriptName

 

- hier sollte sich das ganze Script beenden, da der PC offline ist.

 

if not IPadr = "" then MsgBox PCname & "   hat die IP-Adr.   " & IPadr                               , , WScript.ScriptName

 

- wenn diese Meldung erscheint gehe weiter zu Script 2 sozusagen.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

jetzt möchte ich gern den eingegebenen Namen über die Inputbox weiterverwenden für das kommende folgende Script

 

Bedingung dazu: Ist der PC Offline soll das Script  beendet werden. Ansonsten soll es weitergehen und folgendes tun:

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  ' VBScript Restart Service.vbs
  ' Sample script to Stop or Start a Service
  
  Dim objWMIService, objItem, objService
  Dim colListOfServices, strComputer, strService, intSleep
  strComputer = "." hier weiß ich nicht wie dieses Script den oben benutzten Namen übernimmt. Ich will ja den PC-Namen nur 1. eintragen müssen. :confused: 
   intSleep = 15000
  WScript.Echo " Click OK und warte etwa " & intSleep & " Millisekunden! Eine neue Meldung erscheint"

  'On Error Resume Next
  ' NB strService is case sensitive.
  strService = " 'meinService den ich neu starten will' "
  Set objWMIService = GetObject("winmgmts:" _
  & "{impersonationLevel=impersonate}!\\" _
  & strComputer & "\root\cimv2")
  Set colListOfServices = objWMIService.ExecQuery _
  ("Select * from Win32_Service Where Name ="_
  & strService & " ")
  Wscript.Echo "Der Service wird nun neu gestartet! Click OK und warte bis zur Fertigmeldung"
  For Each objService in colListOfServices
  objService.StopService()
  WSCript.Sleep intSleep
  objService.StartService()
  Next
  WScript.Echo "Der "& strService & " service wurde neu gestartet"
  WScript.Quit
  ' End of Example WMI script to Start / Stop services
        ' =====================================================================

 

 

Ich würde mich freuen  entsprechende Hilfe hier zu finden. Wichtig ist tatsächlich die Inputbox, denn der Anwender sollte nicht das Script selbst bearbeiten müssen, sondern nur die Eingabe des richtigen PC Namen eintragen müssen. Sollte jemand eine bessere Möglichkeit über Powershell oder Batch kennen, wäre ich dafür auch offen. 

 

Hinweis eine ganz einfache Batch mit SC \\ PCnamen stop und start Service habe ich schon. Ist aber eben nicht so anwenderfreundlich :nene:

 

 

Gruß Jan :)



#2 zahni

zahni

    Expert Member

  • 16.379 Beiträge

 

Geschrieben 13. April 2017 - 09:27

Moment: "Der Anwender" soll das Script ausführen?

 

Das wird nicht funktionieren. Dazu braucht  er Admin-Rechte. Die haben die Anwender hoffentlich nicht.

 

Was ist das denn für eine Software, die einen lokalen Service benötigt?


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#3 BOfH_666

BOfH_666

    Junior Member

  • 132 Beiträge

 

Geschrieben 13. April 2017 - 09:47

1. zahni hat Recht. 

2. Wenn die Software diesen Dienst braucht und nur nach einem Neustart des Dienstes korrekt funktioniert, ist es vermutlich der naheliegendste Ansatz das "zu automatisieren". Technologisch betrachtet ist das aber meiner Meinung nach ein ganz falscher Ansatz. Viel besser wäre, den Hersteller zu kontaktieren und ihn zu bitten, die korrekte Funktionalität ohne Dienste-Frickelei herzustellen.

3. Wenn Du wirklich anfangen möchtest zu scripten, solltest Du nicht mehr mit VBScript anfangen. Das wird meines Wissens nach nicht mehr weiterentwickelt. Viel moderner und einfacher und zukunftssicherer ist Powershell. Dafür findest Du bestimmt auch mehr aktuelle Sachen.


live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''

#4 Pikus1234

Pikus1234

    Newbie

  • 18 Beiträge

 

Geschrieben 13. April 2017 - 10:04

Ich weiß. Eure Einwände sind durchaus angebracht. Aber die Software, und da möchte ich jetzt nicht weiter ins Detail gehen, wird in ihrer Funktion nicht verändert. Der Dienst ist leider also Pflicht.

Im Rahmen der Störungsbeseitigung konnte der Neustart das Problem eben beheben. Eigentlich also ein einfacher Schritt zur Lösung.

 

Natürlich soll dieses Script nicht der normale AW ausführen. Der hat tatsächlich keine Rechte. Damit waren mehr MA gemeint, die Beispielsweise einen ServiceDesk  darstellen, und im Rahmen des Erstangriffs solche Probleme bewältigen könnten. Sie haben administrative Rechte, aber keine vollständige Remotesoftware die ihnen die Möglichkeit gibt den Dienst neu zu starten.

 

Und auch kann ich Euch zustimmen, dass Powershell wohl zukunftsträchtiger ist. Sollte also jemand die Möglichkeit über Powershell sehen, bin ich natürlich dafür offen. Habe aber wie erwähnt keine Ahnung.

 

Ich hoffe ich konnte verständlich machen wieso es ein Script mit Eingabemaske sein muss. Ich selbst kann diesen Weg anders beschreiten und den Dienst einfach per Dameware neu starten. Aber das kann leider nicht jeder Admin.  V

 

Vielen Dank für eure Mühen. :thumb1:



#5 BOfH_666

BOfH_666

    Junior Member

  • 132 Beiträge

 

Geschrieben 13. April 2017 - 10:24

Genaugenommen ist das mit Powershell ein "Zweizeiler". 

If(Test-Connection -Count 1 -Quiet -ComputerName "RemoteComputer"){
    Get-Service -Name "Service" -ComputerName "RemoteComputer" | Restart-Service -Force
}

... das ist aber weder fehlertolerant noch benutzerfreundlich  ...  das wäre dann Deine Aufgabe für die nähere Zukunft!    :)  :D  ;)  :cool:  :thumb1:  :p


live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''

#6 Pikus1234

Pikus1234

    Newbie

  • 18 Beiträge

 

Geschrieben 13. April 2017 - 10:28

Das ist sogar genaugenommen brutal wenig Code für dieselbe Aufgabe :schreck:  :D . :thumb1:

 

Ich werde mich dessen mal annehmen um das auf Funktion zu prüfen. Weiter warte ich gern noch ab, ob jemand in VBS noch eine Lösung parat hat.



#7 Sunny61

Sunny61

    Expert Member

  • 22.094 Beiträge

 

Geschrieben 13. April 2017 - 10:46

Erstell dir eine Batchdatei, die im Taskplaner regelmäßig aufgerufen wird:

REM Prüft ob Datei existiert, wenn ja, Dienst starten.
 
IF EXIST \\Server\Freigabe\SchlaueTextDatei.txt  (
   Net stop Dienstname && net Start Dienstname
   DEL  \\Server\Freigabe\SchlaueTextDatei.txt /y
) ELSE (
  GOTO AUS
)
 
:AUS
EXIT

Testen mußt Du selbst. Zusätzlich könnte man ja auch eine Batchdatei erstellen in der die TXT automatisch erstellt wird. Ansonsten lässt du den User die TXT im Verzeichnis manuell erstellen, kann leer sein, den Rest macht der Taskplaner.


Bearbeitet von Sunny61, 13. April 2017 - 10:46.

Gruppenrichtlinien: http://www.gruppenrichtlinien.de/

#8 Pikus1234

Pikus1234

    Newbie

  • 18 Beiträge

 

Geschrieben 13. April 2017 - 10:57

Erstell dir eine Batchdatei, die im Taskplaner regelmäßig aufgerufen wird:

REM Prüft ob Datei existiert, wenn ja, Dienst starten.
 
IF EXIST \\Server\Freigabe\SchlaueTextDatei.txt  (
   Net stop Dienstname && net Start Dienstname
   DEL  \\Server\Freigabe\SchlaueTextDatei.txt /y
) ELSE (
  GOTO AUS
)
 
:AUS
EXIT

Testen mußt Du selbst. Zusätzlich könnte man ja auch eine Batchdatei erstellen in der die TXT automatisch erstellt wird. Ansonsten lässt du den User die TXT im Verzeichnis manuell erstellen, kann leer sein, den Rest macht der Taskplaner.

 

Und diese Batch soll dann entsprechend 1200 Rechner prüfen? Verstehe ich das richtig? Das Problem ist ja leider nicht auf 1 PC oder auf zeitliche Regeln zu reduzieren, Meist ruft ja der AW an und meldet sein Problem. Das Script ist dann die Hilfe zur Hilfe. Eine GPO oder einen Taskplaner zu implementieren wäre nicht der Ansatz den ich verfolge. Ich hoffe ich habe deinen Post korrekt interpretiert.

:)



#9 tesso

tesso

    Board Veteran

  • 2.232 Beiträge

 

Geschrieben 13. April 2017 - 11:15

Der User darf aber hoffentlich keine Dienste auf der Maschine neu starten.

Somit hätte dein Skript ein kleines Problem.



#10 BOfH_666

BOfH_666

    Junior Member

  • 132 Beiträge

 

Geschrieben 13. April 2017 - 11:27

Das hatten wir schon! Nein! Das soll im Zweifelsfall der Helpdesk mit entsprechenden Rechten erledigen!


live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''

#11 zahni

zahni

    Expert Member

  • 16.379 Beiträge

 

Geschrieben 13. April 2017 - 11:32

Hm, Helpdesk mit Admin-Rechten auf 1200 Geräten?


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#12 MurdocX

MurdocX

    Board Veteran

  • 547 Beiträge

 

Geschrieben 13. April 2017 - 11:35

Der Support hat vermutlich auch einen PC. Warum ihn nicht das Skript von "BOfH_666" nicht direkt von deren PC ausführen lassen? Der Aufwand sich in die Powershell einzuarbeiten lohnt sich!

 

Hm, Helpdesk mit Admin-Rechten auf 1200 Geräten?

 

Wo siehst du darin ein Problem?  ;)


Mit freundlicher Unterstützung
Jan


#13 BOfH_666

BOfH_666

    Junior Member

  • 132 Beiträge

 

Geschrieben 13. April 2017 - 11:36

Na wer denn sonst? Soll sich der Domain-Admin oder Enterprise-Admin um die Clients kümmern?  ;)

 

Bei uns heißt die Gruppe "WorkstationAdmins"


Bearbeitet von BOfH_666, 13. April 2017 - 11:37.

live long and prosper!

PS:> (79,108,97,102|%{[char]$_})-join''

#14 zahni

zahni

    Expert Member

  • 16.379 Beiträge

 

Geschrieben 13. April 2017 - 11:37

Ne, der muss unter Mcseboard.de posten... ;)


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#15 Pikus1234

Pikus1234

    Newbie

  • 18 Beiträge

 

Geschrieben 13. April 2017 - 12:12

Vielen Dank für die anregende Diskussion wer was machen soll/darf.

 

Bei uns ist dies etwas anders geregelt. Künftige Ausrichtungen sehen viell. andere Möglichkeiten für den HelpDesk vor. Derzeit sind sie begrenzt. Die Domainadmins kümmern sich um nicht um die Clients.

Dafür ist der Netzwerkaufbau einfach zu groß. Für die Clients sind letztlich wie erwähnt die Workstation-Admins zuständig. Der HelpDesk ist nur 1. Anlaufpunkt zur Erfassung des Problems und Steuerung in den jeweiligen Fachbereich. (mit vereinfachten administrativen Aufgaben). Der WorkstationAdmin hat eben sämtliche Endgerätetechnik zu administrieren. Ich bin also auch nur ein Teil des Ganzen.

 

Bei der Fülle an Problemen in solch einem großen Netzwerk sind die kleinsten Hilfen auf Arbeitsebene immer hilfreicher als einen Incident auszulösen um Fachbereiche mit einem Dienst-Neustart zu belasten.

 

Also helfen kleine Batches und Scripte immer mal die Arbeit zu erleichtern.

 

So kleines Update-----Ich hab die VBS ans Laufen bekommen. Sie tut was Sie soll.

 

Jetzt fehlt mir nur noch das Stoppen des gesamten Scripts, wenn der PC offline ist. Derzeit will das Script immer noch den Dienst neu starten.

 

Danke aber erstmal für die Ansätze von Euch. Powershell wollte ich mir ohnehin mal ansehen.

 

Gruß Jan