yannosch
Goto Top

VBS: lokale Dienste verwalten mittels VBS

Guten Tag liebe Community! face-smile

Ist einer von euch hier Anwesenden im Wissen wie man folgendes mittels VBS realisieren könnte? ...

~Alle laufenden Dienste des Systems anzeigen.
~Alle nichtlaufenden Dienste des Systems anzeigen.
~Einen nichtlaufenden Dienst starten.
~Einen laufenden Dienst anhalten.

Leichte Denkanstöße würden mir schon weiterhelfen face-smile
Sind die Dienste mittels WMI abrufbar, oder irre ich mich da ? ...

Liebe Grüße von
Y@nnosch!face-smile

Content-Key: 218644

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

Printed on: April 19, 2024 at 21:04 o'clock

Member: Bitboy
Bitboy Oct 07, 2013 at 08:51:03 (UTC)
Goto Top
Hi,

einfaches googlen bringt folgenden Treffer zutage: http://msdn.microsoft.com/en-us/library/aa394602(v=vs.85).aspx
Member: Yannosch
Yannosch Oct 07, 2013 at 11:03:02 (UTC)
Goto Top
Danke für die schnelle Antwort ! ,

habe jetzt etwas entwickelt , was aber noch Fehler produziert ! Ich will in einer MsgBox alle laufenden Dienste und in einer anderen MsgBox alle nichtlaufenden Dienst angezeigt bekommen...

Ein Beispiel für die Liste der laufenden Dienste :


Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where State = Running")
For Each objItem in colListOfServices
If objServices.Name <> "" Then
allServices = allServices & objServices.Name & vbNewLine
End If


Next

MsgBox "Dies sind alle laufenden Dienste: " & vbnewline & allServices

In diesem Script soll sich wohl laut WSH in Zeile drei der Fehler verstecken ...
Member: colinardo
colinardo Oct 07, 2013 at 11:22:07 (UTC)
Goto Top
da waren ja auch ein paar Fehler drin:
so gehts ...
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")  
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where State = 'Running'")  
For Each objItem in colListOfServices
	If objItem.Name <> "" Then  
		allServices = allServices & objItem.Name & vbNewLine
	End If
Next
MsgBox "Dies sind alle laufenden Dienste: " & vbnewline & allServices  
Grüße Uwe
Member: Yannosch
Yannosch Oct 07, 2013 at 12:04:11 (UTC)
Goto Top
Perfekt, genau das was ich wollte :D .... aber kann man in die MsgBox so ne art "Scrollbar" einbauen ... Die MsgBox ist so lange das ich sie nicht mal mehr auf einen Bildschirm bekomme :D

Liebe Grüße und 1000 Dank an alle beteiligten von
Y@annosch !
Member: Yannosch
Yannosch Oct 07, 2013 at 12:36:04 (UTC)
Goto Top
Oder vielleicht einfach die Liste anders darstellen [mittels Array]

Dienst 1 Dienst 2 Dienst 3
Dienst 4 Dienst 5 Dienst 6
Dienst 7 Dienst 8 Dienst 9


-> Dann würde alles Dargestellt werden können ...
Member: colinardo
colinardo Oct 07, 2013 at 16:24:46 (UTC)
Goto Top
dann machs halt einfach mit einem Trennzeichen:
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")  
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where State = 'Running'")  
For Each objItem in colListOfServices
	If objItem.Name <> "" Then  
		allServices = allServices & objItem.Name & " # "  
	End If
Next
MsgBox "Dies sind alle laufenden Dienste: " & vbnewline & allServices  
ansonsten hast du via Powershell wesentlich mehr Möglichkeiten mit Windows Forms:
function GenerateForm($sText) {

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
#endregion

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$textBox1 = New-Object System.Windows.Forms.TextBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 276
$System_Drawing_Size.Width = 362
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.MaximizeBox = $False
$form1.MinimizeBox = $False
$form1.Name = "form1"  
$form1.Text = "Running Processes"  

$textBox1.Anchor = 15
$textBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 12
$textBox1.Location = $System_Drawing_Point
$textBox1.Multiline = $True
$textBox1.Name = "textBox1"  
$textBox1.ReadOnly = $True
$textBox1.ScrollBars = 2
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 252
$System_Drawing_Size.Width = 338
$textBox1.Size = $System_Drawing_Size
$textBox1.TabIndex = 0
$textBox1.text = $sText

$form1.Controls.Add($textBox1)

#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function

$runningServices = Get-Service | ?{$_.Status -eq "Running"} | %{"$($_.Name)`r`n"}  
GenerateForm $runningServices

Grüße Uwe
Member: Yannosch
Yannosch Oct 08, 2013 updated at 05:11:21 (UTC)
Goto Top
Hey Uwe face-smile , vielen lieben Dank für die fixe und auch so umfangreiche Antwort ... klappt alles prima, bis auf die Sache mit der Textbox ... irgendwie zeigt sie mir trotz des Trennzeichens " | " nicht alles an ... es scheint so alsob die MsgBox "vollgelaufen" wäre ... also es wird beispielsweise nur bis zu den Diensten mit "s" vorne gegangen... wenn ich dann das Trennzeichen weglasse dann siehts zwar bisschen komisch aus , ABER es werden die Dienste beispielsweise auch bis "w" angezeigt .... Kann die MsgBox nur begrenzt Inhalt haben ? .... Haber darüber nichts gefunden ...

Liebe Grüße von
Y@nnosch! face-smile

[UPDATE]: Ich habe doch herrausgefunden, dass die MsgBox auf 1200 Zeichen begrenzt ist ... jetzt schreibe ich es einfach in eine .txt Datei mit Document.writeline ... ABER wie bekomme ich das hin, das das Editorfenster geöffnet wird UND in den Vordergrund gestellt wird ? ... Sodass derjenige der das Script ausführt den EditorPad auch sieht ...


Liebe Grüße von
Y@nnosch! face-smile
Member: colinardo
colinardo Oct 08, 2013 updated at 07:15:15 (UTC)
Goto Top
Set objShell = CreateObject("WScript.Shell")  
objShell.Run "notepad " & "c:\textdatei.txt", 1, true  
Wenn du willst das das Script wartet bis das Notepad geschlossen wird, setzt du den letzten Parameter auf True , wenn es nicht warten soll auf False.

Grüße Uwe
Member: Yannosch
Yannosch Oct 08, 2013 at 06:50:56 (UTC)
Goto Top
Set meineDatei = fso.CreateTextFile("c:\textdatei.txt")
meineDatei.writeline (allServices)
Set objShell = CreateObject("WScript.Shell")
objShell.Run("notepad " & "c:\textdatei.txt", 1, true)

Fehlermeldung [Letzte Zeile] : Unterroutinen (Sub) dürfen keine Klammern enthalten.
Datei soll auch nach dem anschauen, sobald sie wegge "X" t wird gelöscht werden ... aber einfach datei.delet , das bekomm ich ja noch hin....
Member: colinardo
colinardo Oct 08, 2013 at 07:16:02 (UTC)
Goto Top
waren die Klammern zu viel,ist oben korrigiert
Member: Yannosch
Yannosch Oct 08, 2013 at 07:30:30 (UTC)
Goto Top
Perfekt, vielen Dank... Und wie bekomme ich die MsgBox die nach dem Notepad folgt wieder in den Vordergrund ?