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

In VB Script enthaltene angeklickte Checkboxen zählen und als Schleifendurchlaufanzahl benutzen

Frage Entwicklung VB for Applications

Mitglied: cbli

cbli (Level 1) - Jetzt verbinden

21.11.2007, aktualisiert 30.11.2007, 5682 Aufrufe, 9 Kommentare

Folgendes Problem:

Ich habe eine HTA Applikation mit VB Script Inhalten erstellt.
Ich benutze sie um Rechner im Netzwerk ,hier von meinem PC aus, herunterfahren zu können.
Dazu muss ich nur die Haken in den entsprechenden Checkboxen machen und die Sub Prozedur aufrufen.
Soweit ist auch all funktionsfähig nur habe ich das Problem,daß wenn ich mehrere Rechner auf einmal herunterfahren will, mein Programm alle geklickten Checkboxen einzeln übergibt und damit meine Listenausgabe nicht funktioniert.
Es müsste also die Anzahl der angeklickten Checkboxen gezählt werden und diese Summe als Anzahl der Schleifendurchläufe genommen werden.
Wie erreiche ich das und wie muss die Schleife dann aussehen ?
Die ersten 6 Zeilen der Sub könnten auch weggelassen werden.
IP Adressen + Benutzernamen Übergabe erfolgt über ein array

01.
 
02.
Dim intZeile 
03.
Dim remuser(6,1) 
04.
 
05.
remuser(0,0) = "Frau Müller" 
06.
remuser(1,0) = "Herr Maier" 
07.
remuser(2,0) = "Herr Kohler" 
08.
remuser(3,0) = "Frau Beck" 
09.
remuser(4,0) = "Frau Rose" 
10.
remuser(5,0) = "Frau Schmidt" 
11.
remuser(6,0) = "Herr Himst" 
12.
remuser(0,1) = "192.168.115.11" 
13.
remuser(1,1) = "192.168.115.12" 
14.
remuser(2,1) = "192.168.115.13" 
15.
remuser(3,1) = "192.168.115.14" 
16.
remuser(4,1) = "192.168.115.15" 
17.
remuser(5,1) = "192.168.115.16" 
18.
remuser(6,1) = "192.168.115.17"  
19.
 
Code für die angeklickten Checkboxen welche an die Sub herunterfahren übergeben werden

01.
 
02.
        If Checkbox1.Checked Then 
03.
' Frau Müller 
04.
remuser(0,0) = "Frau Müller" 
05.
remuser(0,1) = "192.168.115.11" 
06.
intzeile = 0 
07.
herunterfahren 
08.
        End If 
09.
 
Hier mal meine Sub Prozedur

01.
 
02.
sub herunterfahren 
03.
 
04.
user = "administrator" 
05.
password = "xxxxxx" 
06.
 
07.
 
08.
Set obj = GetObject("winmgmts:Win32_PingStatus.address='" & remuser(intZeile,1) & "'") 
09.
If IsNull(obj.StatusCode) Or obj.StatusCode <> 0 Then 
10.
fehlerliste = fehlerliste & "PC des Benutzers:          " & remuser(intZeile,0) & "    läuft nicht" & vbcrlf & vbcrlf 
11.
else 
12.
on error resume next 
13.
set wmi = CreateObject("WBemScripting.SWbemLocator") 
14.
Set cs = wmi.ConnectServer(remuser(intZeile,1),"root/cimv2",user,password) 
15.
set col = cs.InstancesOf("Win32_OperatingSystem") 
16.
for each obj in col 
17.
rc = obj.Shutdown 
18.
next 
19.
If (rc = 0) Then 
20.
MsgBox "Rechner:      " & remuser(intZeile,0) & "       wird heruntergefahren.    Returncode =    " & rc ,64,"Hinweis" 
21.
okliste = okliste & "PC des Benutzers:          " & remuser(intZeile,0) & "    wurde heruntergefahren" & vbcrlf & vbcrlf  
22.
end if 
23.
end if 
24.
msgbox okliste ,,"Heruntergefahrene PC´s" 
25.
msgbox fehlerliste ,,"Nicht betriebsbereite PC´s" 
26.
end sub
Vielen Dank für die Hilfe

Mit freundlichen Grüßen
Claus
Mitglied: bastla
21.11.2007 um 19:05 Uhr
Hallo cbli!

Vielleicht mit einem Status-Array "checked()":
01.
Dim remuser(6,1) 
02.
 
03.
remuser(0,0) = "Frau Müller" 
04.
remuser(1,0) = "Herr Maier" 
05.
remuser(2,0) = "Herr Kohler" 
06.
remuser(3,0) = "Frau Beck" 
07.
remuser(4,0) = "Frau Rose" 
08.
remuser(5,0) = "Frau Schmidt" 
09.
remuser(6,0) = "Herr Himst" 
10.
remuser(0,1) = "192.168.115.11" 
11.
remuser(1,1) = "192.168.115.12" 
12.
remuser(2,1) = "192.168.115.13" 
13.
remuser(3,1) = "192.168.115.14" 
14.
remuser(4,1) = "192.168.115.15" 
15.
remuser(5,1) = "192.168.115.16" 
16.
remuser(6,1) = "192.168.115.17" 
17.
 
18.
Dim checked(6) 
19.
If Checkbox1.Checked Then checked(0) = True 
20.
... 
21.
If Checkbox7.Checked Then checked(6) = True 
22.
 
23.
For i = 0 To 6 
24.
    If checked(i) Then 
25.
		Code = Herunterfahren(remuser(i, 1)) 
26.
		If Code = -1 Then 
27.
			fehlerliste = fehlerliste & "PC des Benutzers:          " & remuser(i, 0) & "    läuft nicht" & vbCrLF & vbCrLF 
28.
		Else 
29.
			MsgBox "Rechner:      " & remuser(i, 0) & "       wird heruntergefahren.    Returncode =    " & Code ,64,"Hinweis" 
30.
			If Code = 0 Then 
31.
				okliste = okliste & "PC des Benutzers:          " & remuser(i, 0) & "    wurde heruntergefahren" & vbCrLF & vbCrLF 
32.
			Else 
33.
				fehlerliste = fehlerliste & "PC des Benutzers:          " & remuser(i, 0) & "    meldete Code " & Code & vbCrLF & vbCrLF 
34.
			End If 
35.
		End If 
36.
	End If 
37.
Next 
38.
MsgBox okliste ,,"Heruntergefahrene PC" 
39.
MsgBox fehlerliste ,,"Nicht betriebsbereite PC" 
40.
 
41.
 
42.
Function Herunterfahren(IP) 
43.
user = "administrator" 
44.
password = "xxxxxx" 
45.
 
46.
Set obj = GetObject("winmgmts:Win32_PingStatus.Address='" & IP & "'") 
47.
If IsNull(obj.StatusCode) Or obj.StatusCode <> 0 Then 
48.
	Herunterfahren = -1 
49.
Else 
50.
	On Error Resume Next 
51.
	Set wmi = CreateObject("WBemScripting.SWBemLocator") 
52.
	Set cs = wmi.ConnectServer(IP,"root/cimv2",user,password) 
53.
	Set col = cs.InstancesOf("Win32_OperatingSystem") 
54.
	For Each obj In col 
55.
		rc = obj.Shutdown 
56.
	Next 
57.
	Herunterfahren = rc 
58.
End If 
59.
End Function
Grüße
bastla

P.S.: Ungetestet, und (erkennbar zB an den fest verdrahteten Array-Größen) nur als Grobentwurf gedacht.
Bitte warten ..
Mitglied: cbli
23.11.2007 um 13:46 Uhr
Hallo cbli!

Vielleicht mit einem Status-Array
"checked()":
01.
Dim remuser(6,1) 
02.
>  
03.
> remuser(0,0) = "Frau Müller" 
04.
> remuser(1,0) = "Herr Maier" 
05.
> remuser(2,0) = "Herr Kohler" 
06.
> remuser(3,0) = "Frau Beck" 
07.
> remuser(4,0) = "Frau Rose" 
08.
> remuser(5,0) = "Frau Schmidt" 
09.
> remuser(6,0) = "Herr Himst" 
10.
> remuser(0,1) = "192.168.115.11" 
11.
> remuser(1,1) = "192.168.115.12" 
12.
> remuser(2,1) = "192.168.115.13" 
13.
> remuser(3,1) = "192.168.115.14" 
14.
> remuser(4,1) = "192.168.115.15" 
15.
> remuser(5,1) = "192.168.115.16" 
16.
> remuser(6,1) = "192.168.115.17" 
17.
>  
18.
> Dim checked(6) 
19.
> If Checkbox1.Checked Then checked(0) = True 
20.
> ... 
21.
> If Checkbox7.Checked Then checked(6) = True 
22.
>  
23.
> For i = 0 To 6 
24.
>     If checked(i) Then 
25.
> 		Code = Herunterfahren(remuser(i, 1)) 
26.
> 		If Code = -1 Then 
27.
> 			fehlerliste = fehlerliste & "PC 
28.
> des Benutzers:          " & 
29.
> remuser(i, 0) & "    läuft 
30.
> nicht" & vbCrLF & vbCrLF 
31.
> 		Else 
32.
> 			MsgBox "Rechner:      " & 
33.
> remuser(i, 0) & "       wird 
34.
> heruntergefahren.    Returncode =    " 
35.
> & Code ,64,"Hinweis" 
36.
> 			If Code = 0 Then 
37.
> 				okliste = okliste & "PC des 
38.
> Benutzers:          " & remuser(i, 
39.
> 0) & "    wurde 
40.
> heruntergefahren" & vbCrLF & 
41.
> vbCrLF 
42.
> 			Else 
43.
> 				fehlerliste = fehlerliste & "PC 
44.
> des Benutzers:          " & 
45.
> remuser(i, 0) & "    meldete Code 
46.
> " & Code & vbCrLF & vbCrLF 
47.
> 			End If 
48.
> 		End If 
49.
> 	End If 
50.
> Next 
51.
> MsgBox okliste ,,"Heruntergefahrene 
52.
> PC" 
53.
> MsgBox fehlerliste ,,"Nicht 
54.
> betriebsbereite PC" 
55.
>  
56.
>  
57.
> Function Herunterfahren(IP) 
58.
> user = "administrator" 
59.
> password = "xxxxxx" 
60.
>  
61.
> Set obj = 
62.
> GetObject("winmgmts:Win32_PingStatus.Address='" 
63.
> & IP & "'") 
64.
> If IsNull(obj.StatusCode) Or obj.StatusCode 
65.
> <> 0 Then 
66.
> 	Herunterfahren = -1 
67.
> Else 
68.
> 	On Error Resume Next 
69.
> 	Set wmi = 
70.
> CreateObject("WBemScripting.SWBemLocator") 
71.
> 	Set cs = 
72.
> wmi.ConnectServer(IP,"root/cimv2",user,password) 
73.
> 	Set col = 
74.
> cs.InstancesOf("Win32_OperatingSystem") 
75.
> 	For Each obj In col 
76.
> 		rc = obj.Shutdown 
77.
> 	Next 
78.
> 	Herunterfahren = rc 
79.
> End If 
80.
> End Function 
81.
> 

Hallo Bastla !

Danke erstmal dafür. Nach ein bißchen anpasssen und probieren läuft es soweit ganz gut , mit einem einzigen Problem.
Wenn ich 2 oder mehr PC´s zum Herunterfahren auswähle,bekomme ich die Listenausgabe entsprechend oft angezeigt.
Genau das will ich aber nicht.
Ich möchte,daß er nur 1 x ganz am Schluß die Listen ausgibt,egal wieviel PC´s ich zum herunterfahren ausgewählt habe.
Wie schaffe ich das ?
Würde es damit gehen,daß nur die PC´s in die Schleife kommen und abgefragt werden, die ich vorher in den Checkboxen angehakt habe ?
Wenn ja,wie bekomme ich das hin ?

Hier der momentane Code

01.
 
02.
sub singledown 
03.
 
04.
Dim checked(6) 
05.
 
06.
 
07.
If Checkbox1.Checked Then checked(0) = True 
08.
If Checkbox2.Checked Then checked(5) = True 
09.
If Checkbox3.Checked Then checked(6) = True 
10.
If Checkbox4.Checked Then checked(1) = True 
11.
If Checkbox5.Checked Then checked(3) = True 
12.
If Checkbox6.Checked Then checked(2) = True 
13.
If Checkbox7.Checked Then checked(4) = True 
14.
 
15.
 
16.
For i = 0 To 6 
17.
    If checked(i) Then 
18.
        Code = Herunterfahren(i) 
19.
        If Code = -1 Then 
20.
            fehlerliste = fehlerliste & "PC des Benutzers:          " & remuser(i,0) & "    läuft nicht" & vbCrLF & vbCrLF 
21.
        Else 
22.
            MsgBox "Rechner:      " & remuser(i,0) & "       wird heruntergefahren.    Returncode =    " & Code ,64,"Hinweis" 
23.
            If Code = 0 Then 
24.
                okliste = okliste & "PC des Benutzers:          " & remuser(i,0) & "    wurde heruntergefahren" & vbCrLF & vbCrLF 
25.
            Else 
26.
                fehlerliste = fehlerliste & "PC des Benutzers:          " & remuser(i,0) & "    meldete Code " & Code & vbCrLF & vbCrLF 
27.
            End If 
28.
        End If 
29.
    End If 
30.
Next 
31.
MsgBox okliste ,,"Heruntergefahrene PC" 
32.
MsgBox fehlerliste ,,"Nicht betriebsbereite PC" 
33.
end sub 
34.
 
35.
 
36.
Function Herunterfahren(i) 
37.
user = "administrator" 
38.
password = "xxxxxx" 
39.
Set obj = GetObject("winmgmts:Win32_PingStatus.Address='" & remuser(i,1) & "'") 
40.
If IsNull(obj.StatusCode) Or obj.StatusCode <> 0 Then 
41.
    Herunterfahren = -1 
42.
Else 
43.
    On Error Resume Next 
44.
    Set wmi = CreateObject("WBemScripting.SWBemLocator") 
45.
    Set cs = wmi.ConnectServer(remuser(i,1),"root/cimv2",user,password) 
46.
    Set col = cs.InstancesOf("Win32_OperatingSystem") 
47.
    For Each obj In col 
48.
        rc = obj.Shutdown 
49.
    Next 
50.
    Herunterfahren = rc 
51.
End If 
52.
End Function
Danke

Gruß
Claus
Bitte warten ..
Mitglied: bastla
23.11.2007 um 14:36 Uhr
Hallo cbli!

Ich weiß ja nicht, wie dieser Code aufgerufen wird, aber eigentlich wäre ich davon ausgegangen, dass dies erst beim Klick auf eine Schaltfläche "Ausführen" oä geschieht. Somit würden auch die Listen nur einmal ausgegeben.

Die "MsgBox" in der Schleife könntest Du, wenn denn die unmittelbare Rückmeldung tatsächlich gewünscht / erforderlich wäre, durch ein 3-Sekunden-"Popup" ersetzen, etwa:
01.
Set WshShell = WScript.CreateObject("WScript.Shell") 
02.
R = WshShell.Popup("Rechner:      " & remuser(i,0) & "       wird heruntergefahren.    Returncode =    " & Code, 3, "Hinweis", vbOK + vbInformation)
Grüße
bastla
Bitte warten ..
Mitglied: cbli
23.11.2007 um 16:51 Uhr
Ich weiß ja nicht, wie dieser Code
aufgerufen wird, aber eigentlich wäre
ich davon ausgegangen, dass dies erst beim
Klick auf eine Schaltfläche
"Ausführen" oä geschieht.
Somit würden auch die Listen nur einmal
ausgegeben.

Genau so ist es, durch klicken auf eine Schaltfläche

01.
 
02.
<input type="checkbox" name="Checkbox1"> Frau Müller 
03.
... 
04.
<input type="checkbox" name="Checkbox7"> Herr Maier 
05.
<input id=runbutton  class="button" type="button" value="PC  herunterfahren" name="button1"  onClick="TestSub"> 
06.
 
Durch Drücken der Schaltfläche wird die Sub Testsub aufgerufen in der die angehakten Checkboxen abgefragt werden.

01.
 
02.
        If Checkbox1.Checked Then 
03.
' Frau Müller 
04.
remuser(0,0) = "Frau Müller" 
05.
remuser(0,1) = "192.168.115.11" 
06.
intzeile = 0 
07.
herunterfahren 
08.
        End If 
09.
 
Könnte hier ein elseif helfen ?
Oder hast du noch eine andere Idee ?

Danke

Gruß
Claus
Bitte warten ..
Mitglied: bastla
23.11.2007 um 17:28 Uhr
Hallo cbli!

Meine Idee dazu steht eigentlich schon oben - "Sub Testsub" sollte sich durch meinen Scriptvorschlag (bzw Deine angepasste Variante + Befüllen des "remuser()"-Arrays am Anfang, auf jeden Fall aber vor der "For"-Schleife) ersetzen lassen.

Grüße
bastla
Bitte warten ..
Mitglied: cbli
23.11.2007 um 18:15 Uhr
Hallo cbli!

Meine Idee dazu steht eigentlich schon oben
- "Sub Testsub" sollte sich durch
meinen Scriptvorschlag (bzw Deine angepasste
Variante + Befüllen des
"remuser()"-Arrays am Anfang, auf
jeden Fall aber vor der
"For"-Schleife) ersetzen lassen.


Habe eben deinen Scriptvorschlag (mit meiner Anpassung) einfach mal mit elseif beim Checkboxen abfragen ergänzt und es funktioniert jetzt genau so wie es sollte !!
Danke nochmals an dich für die Hilfestellung.
Eine Winzigkeit noch:

Lässt sich einfach irgendwie mit VB Script /Java eine Fortschrittsanzeige der ganzen Aktion in die HTA mit einbauen ?
Hake ich nämlich einige Rechner an,kann es ziemlich dauern bis das Script zu Ende ist und meine Listenausgabe kommt.

Danke nochmals

Gruß
Claus
Bitte warten ..
Mitglied: bastla
23.11.2007 um 20:22 Uhr
Hallo cbli!

Du könntest vielleicht doch das oben beschriebene "Popup" (mit einer längeren Anzeigedauer) verwenden, um einen Hinweis darauf zu erhalten, dass das Script noch läuft.

Grüße
bastla

P.S.: Wenn's dann für Dich gut genug ist, magst Du vielleicht Deine gesamte Lösung (mit ev angepasstem Threadtitel) hier reinstellen?
Bitte warten ..
Mitglied: cbli
30.11.2007 um 16:21 Uhr
Hallo cbli!

Du könntest vielleicht doch das oben
beschriebene "Popup" (mit einer
längeren Anzeigedauer) verwenden, um
einen Hinweis darauf zu erhalten, dass das
Script noch läuft.

Grüße
bastla

P.S.: Wenn's dann für Dich gut
genug ist, magst Du vielleicht Deine gesamte
Lösung (mit ev angepasstem Threadtitel)
hier reinstellen?



Hallo Bastla

Sorry,komme erst jetzt dazu zu antworten.
Ich stelle meine Lösung gerne hier rein, aber erst wenn es zu 100% fertig ist.
Momentan gibts noch ein paar kleine Baustellen und mir fehlt etwas die Zeit weiterzumachen.
Vielleicht kannst Du mir helfen:

wshshell.popup scheint unter hta nicht zu funktionieren.

Ich bekomme zwar meinen Text angezeigt ,aber die Timerfunktion scheint ignoriert zu werden,d.h das Fenster
schließt sich nicht automatisch nach der von mir definierten Zeit.
Gibts da ne Lösung ? Hab im Inet gesucht aber nix gefunden.

Ach ja,wenn ich meine Lösung hier reinstelle,dann komplett mit HTA Code oder nur den VB Script Teil ?

Gruß
Claus

PS: Ein schönes Wochenende
Bitte warten ..
Mitglied: bastla
30.11.2007 um 18:53 Uhr
Hallo cbli!

wshshell.popup scheint unter hta nicht zu funktionieren.
Da Du ja eine Art "Statusinfo" ausgeben willst, könntest Du als Ersatz dafür doch eigentlich auch zB eine Textbox
01.
<input type="text" name="StatusTextBox" size="60">
verwenden und dieser bei jedem Schleifendurchlauf die aktuelle Info als "Value" zuweisen:
01.
... 
02.
StatusTextBox.Value = "Rechner:      " & remuser(i,0) & "       wird heruntergefahren.    Returncode =    " & Code 
03.
...
Ach ja,wenn ich meine Lösung hier reinstelle,dann komplett mit HTA Code oder nur den VB Script Teil ?
Da es im Forum ohnehin kaum Beispiele zu HTA gibt (und auch ich selbst mich noch nicht wirklich damit beschäftigt habe), würde ich auf jeden Fall das Gesamtpaket vorziehen - abgesehen davon sollst Du ja Dein HTA nicht unter den Scheffel stellen .

Auch Dir ein schönes Wochenende
bastla
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Outlook & Mail
gelöst Email Anhänge speichern VB Script aber nur bestimmte Dateitypen (Outlook) (4)

Frage von LindeUnimog zum Thema Outlook & Mail ...

VB for Applications
gelöst VB Script rekursiv statt nur ein Ordner (4)

Frage von Saschaaaaa zum Thema VB for Applications ...

VB for Applications
gelöst VB Script nach gefundenem Wort die nächsten 4 Zeichen ersetzten (2)

Frage von deutsch73 zum Thema VB for Applications ...

Linux
gelöst Umlaute zählen - Bash-Script (5)

Frage von plutowitsch zum Thema Linux ...

Heiß diskutierte Inhalte
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 ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...