Top-Themen

Aktuelle Themen (A bis Z)

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

VBSkript mit Hilfe eines Dienstes starten (geschrieben in C-Sharp)

Frage Microsoft Windows Server

Mitglied: Mesaou

Mesaou (Level 1) - Jetzt verbinden

16.09.2014 um 15:34 Uhr, 1294 Aufrufe, 6 Kommentare

Hi,

Folgende Situation
Ich habe ein VBSkript, das über einen Dienst gestartet werden soll. Soblad der Dienst gestoppt wird, wird auch das Skript wieder angehalten. Die Endbedingung für das Skript zu generieren funktioniert genauso wie das Zurücksetzen selbiger (ist über einen Eintrag in einer SQL-Tabelle gelöst). Die Zugangsdaten für die SQL-Verbindung sind korrekt angelegt. Die Library Class ist nur zum beschreiben einer Logdatei erstellt und funktioniert auch nach Start des Dienstes (sprich die Logdatei wird erstellt und befüllt).

Das Problem liegt nun darin, dass ich das VBSkript nicht aus dem Dienst heraus gestartet kriege. In Zeile 51 soll das Skript gestartet werden, der Dateipfad stimmt. Wenn ich das Skript manuell starte funktioniert es, genauso wenn ich es über ein kleines VB-Programm mit der selben Mechanik wie hier im Dienst probiere. Ich vermute das mein Aufruf aus C# fehlerhaft ist habe aber im Netz noch nichts gefunden, wie ich den Aufruf berichtigen kann.

Grüße,
Mesaou

Hier noch der Code:

01.
using System; 
02.
using System.Collections.Generic; 
03.
using System.ComponentModel; 
04.
using System.Data; 
05.
using System.Diagnostics; 
06.
using System.Linq; 
07.
using System.ServiceProcess; 
08.
using System.Text; 
09.
using System.Threading.Tasks; 
10.
using System.Timers; 
11.
using System.Data.SqlClient; 
12.
 
13.
namespace ServiceName 
14.
15.
    public partial class Service1 : ServiceBase 
16.
17.
        private Timer timer1 = null; 
18.
 
19.
        public Service1() 
20.
21.
            InitializeComponent(); 
22.
23.
 
24.
        protected override void OnStart(string[] args) 
25.
26.
            timer1 = new Timer(); 
27.
            this.timer1.Interval = 30000; 
28.
            this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Tick); 
29.
            timer1.Enabled = true; 
30.
             
31.
            string connetionString = null; 
32.
            SqlConnection cnn; 
33.
            SqlDataReader reader; 
34.
            connetionString = "Data Source=****;Initial Catalog=****;User ID=****;Password=****"; 
35.
            cnn = new SqlConnection(connetionString); 
36.
            try 
37.
38.
                cnn.Open(); 
39.
                SqlCommand cmd = new SqlCommand(); 
40.
                cmd.CommandText = "Update omopt Set DienstAktiv=1 where ID=1"; 
41.
                cmd.CommandType = CommandType.Text; 
42.
                cmd.Connection = cnn; 
43.
 
44.
                reader = cmd.ExecuteReader(); 
45.
                cnn.Close(); 
46.
47.
            catch (Exception ex) 
48.
49.
                Library.WriteErrorLog(DateTime.Now.ToString() + ": SQLFEHLER " + ex.Source.ToString().Trim() + ": " + ex.Message.ToString().Trim()); 
50.
51.
            Process.Start("C:\\Winchenbach\\KundenAktualisieren.vbs"); 
52.
            Library.WriteErrorLog("ServiceName started"); 
53.
54.
 
55.
        private void timer1_Tick(object sender, ElapsedEventArgs e) 
56.
57.
            Library.WriteErrorLog("Tick and Job done"); 
58.
59.
 
60.
        protected override void OnStop() 
61.
62.
            timer1.Enabled = false; 
63.
            string connetionString = null; 
64.
            SqlConnection cnn; 
65.
            SqlDataReader reader; 
66.
            connetionString = "Data Source=****;Initial Catalog=****;User ID=****;Password=****"; 
67.
            cnn = new SqlConnection(connetionString); 
68.
            try 
69.
70.
                cnn.Open(); 
71.
                SqlCommand cmd = new SqlCommand(); 
72.
                cmd.CommandText = "Update omopt Set DienstAktiv=0 where ID=1"; 
73.
                cmd.CommandType = CommandType.Text; 
74.
                cmd.Connection = cnn; 
75.
 
76.
                reader = cmd.ExecuteReader(); 
77.
                cnn.Close(); 
78.
79.
            catch (Exception ex) 
80.
81.
                Library.WriteErrorLog(DateTime.Now.ToString() + ": SQLFEHLER " + ex.Source.ToString().Trim() + ": " + ex.Message.ToString().Trim()); 
82.
83.
            Library.WriteErrorLog("ServiceName stopped"); 
84.
85.
86.
}
Mitglied: colinardo
LÖSUNG 16.09.2014, aktualisiert 30.09.2014
Hallo Mesaou,
was macht das VB-Script bzw. was nutzt es für Funktionen? Du solltest wissen das das Script natürlich im Userkontext des Dienstes läuft und es keinen Zugriff auf die UI hat, d.h. jeglicher Versuch etwas anzuzeigen, und sei es nur eine MsgBox, werden fehlschlagen, wenn man den Dienst nicht als Interaktiven Dienst konfiguriert, der mit dem Desktop interagieren kann.
Mehr zum Security-Modell von Diensten kannst du hier nachlesen:
http://stackoverflow.com/questions/4516200/how-can-a-windows-service-st ...

Zum starten von VBS-Scripten würde ich zudem cscript.exe benutzen und den Pfad zum Script als Argument übergeben.
01.
Process pr = new Process(); 
02.
pr.StartInfo.FileName = "cscript.exe"; 
03.
pr.StartInfo.Arguments = @"c:\pfad\script.vbs"; 
04.
pr.Start();
Grüße Uwe
Bitte warten ..
Mitglied: Mesaou
17.09.2014 um 10:33 Uhr
Das Skript wird jetzt gestartet, danke schonmal.

Das Skript baut mehrere Datenbankverbindunge auf und prüft in regelmäßigen Abständen ob die Endbedingung eingetreten ist (bestimmter Wert in der Datenbank gesetzt). Sofern der Wert nicht gesetzt ist, werden alle Änderungen die in der dafür erstellten Tabelle eingetragen wurden im Elo durchgeführt.
Genutzt werden

- db.Execute zum Ausführen der SQL-Befehle
- drei selbst geschriebene Subs, die
- einen vorhandenen Eintrag im Elo ändern ("Alter")
- einen neuen Eintrag im Elo anlegen ("Add")
- im Elo einen Ordner anlegt und dessen Werte setzt (wird in den beiden anderen Subs benutuzt)
- verscheinden Elo-Befehle zum Bearbeiten des angelegten Ordners (Das Elo-Objekt ist erstellt und ELo ist gestartet)
(Elo.GetEntryId, Elo.SetObjAttrib, Elo.ObjShort, Elo.PrepareObjEx, Elo.ObjFlags, Elo.ObjIndex, Elo.ObjMemo, Elo.UpdateObject, Elo.Sleep, Elo.Status,
Elo.DoInvisibleSearch, Elo.InsertRef, Elo.LookUpIndex)

Es hat den Anschein als läge das Problem in den Subs "Add" und "Alter", da die Datenbankaktionen korrekt durchgeführt werden (Anpassung an Kunden und KundenOpt sowie das Löschen in der DatenbankuebergriffTest). Ich habe bereits versucht die Wartezeit zu erhöhen, leider ohne Erfolg.

MAIN
01.
Set rs2 = db2.Execute ("Select * from DatenbankuebergriffTest") 
02.
 
03.
	Do Until rs2.EOF 
04.
		ID = rs2(0) 
05.
		KundNr = rs2(1) 
06.
		KundName = rs2(2) 
07.
		KundPLZ = rs2(3) 
08.
		KundOrt = rs2(4) 
09.
		KundEMail = rs2(5) 
10.
		Change=rs2(6) 
11.
 
12.
		if Change = 2 then 
13.
			db1.Execute ("Insert Kunden (*Spaltennamen*) Values (*Werte für Spalten*)") 
14.
			db1.Execute ("Insert KundenOpt (*Spaltennamen*) Values (*Werte für Spalten*)") 
15.
			Add 1, KundNr, KundName 
16.
		elseif Change = 1 then 
17.
			db1.Execute ("Update Kunden Set Spaltename = 'Wert', ...") 
18.
			db1.Execute ("Update KundenOpt Set Spaltename = 'Wert', ...") 
19.
			Alter 1, KundNr, KundName 
20.
		end if 
21.
		db3.Execute ("Delete from DatenbankuebergriffTest Where TbID = "  & ID ) 
22.
		rs2.movenext 
23.
	Loop
Bitte warten ..
Mitglied: colinardo
17.09.2014, aktualisiert um 10:44 Uhr
Frage: Warum setzt du das VB-Script nicht direkt im Dienst mit C# um ?
Bitte warten ..
Mitglied: Mesaou
17.09.2014, aktualisiert um 13:42 Uhr
Ich dachte, dass es einfacher "zu Steuern" sei wenn ich das Script über den Dienst starte, dann in Dauerschleife laufen lasse und bei Beenden des Diesntes wieder beende. Ist allerdings möglicherweise sinnvoller den Code in den Dienst direkt zu übernehmen ... muss mich dann mal etwas mit den Besonderheiten in der Syntax von C# auseinandersetzen.

Edit:
hmm ... Elo lässt sich aus C# nicht direkt ansprechen ... dann muss ich wohl doch beim Skript bleiben.

Edit2:
Was mich wundert ist, dass das Skript die Sub "main" bearbeitet, die darin benutzen Subs ("Add" und "Alter") allerdings nicht. Die danach ausgeführte SQL-Anweisung (Löschen der Änderungseinträge) wird wiederum ausgeführt.

Edit3:
Dieses Verhalten tritt nur auf, wenn das Skript durch den Dienst gestartet wird ...bei manuellem Start funktioniert es einwandfrei. Der Dienst setht standardmäßig auf "Local System" ich habs mal auf Administrator geändert. Leider hat das nichts geändert.
Bitte warten ..
Mitglied: colinardo
17.09.2014, aktualisiert um 14:17 Uhr
Edit: hmm ... Elo lässt sich aus C# nicht direkt ansprechen ... dann muss ich wohl doch beim Skript bleiben.
Was du mit VBS machst kannst lässt sich auch mit C# umsetzen 100%

Edit2:
Edit3
ohne Code ist das hier schwierig zu beurteilen.

lass dir doch mal aus der VBS Logs in eine Datei schreiben dann weißt du an welcher Stelle das Script genau abbricht.
Bitte warten ..
Mitglied: Mesaou
23.09.2014 um 14:49 Uhr
Danke für die Idee. Ich werde es vorläufig über ein kleines Programm lösen, das über ne Aufgabe beim Anmelden vom Administrator, gestartet wird und dann mein Skript in Dauerschleife laufen lässt.
Bitte warten ..
Ähnliche Inhalte
IDE & Editoren
IDE für C-Sharp und C++ auf Windows
gelöst Frage von BugdroidIDE & Editoren8 Kommentare

Hallo, Ich nutze derzeit Visual Studio, aber auf Dauer ist es mir etwas zu Ressourcenfressend und für meine Zwecke ...

C und C++
C-sharp Form buggt
gelöst Frage von YanmaiC und C++2 Kommentare

Hallo ihr Administratoren. Ich habe ein kleines Problem. Unszwar möchte ich eine Ordner von C# zu einem PHP Script ...

C und C++
C Sharp - DLL einbinden
gelöst Frage von EisbrecherinC und C++3 Kommentare

Hallo zusammen! Ich bin gerade etwas am Verzweifeln beim Einbinden von DLLs. Ich habe ein Projekt in C# (erstellt ...

Webentwicklung
Templates für ASP.NET (C Sharp)
gelöst Frage von CortexA8Webentwicklung7 Kommentare

Hallo zusammen, Ich würde gerne für ein in C# programmiertes ASP.NET-Projekt ein allgemeines Template erstellen. Ich habe zwar schon ...

Neue Wissensbeiträge
Erkennung und -Abwehr

Necur-Botnet soll Erpressungstrojaner Scarab massenhaft verbreiten

Information von BassFishFox vor 48 MinutenErkennung und -Abwehr

12,5 Millionen Spam-Mails aus einem Bot-Netz mit 6 Millionen Computern? Eigentlich eine schwache Leistung. Die Erpresser setzen dabei auf ...

Microsoft

Nadeldrucker-Problem unter Windows - Microsoft liefert Updates

Information von BassFishFox vor 1 StundeMicrosoft

Hat ja nicht lange gedauert. Nachdem die November-Updates für Windows 7, 8.1 und 10 zahlreiche Nadeldrucker lahmgelegt hatten, stellt ...

Linux

Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde

Information von Frank vor 8 StundenLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Heiß diskutierte Inhalte
Linux
Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde
Information von FrankLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Router & Routing
Zwei Netzwerke erstellen
Frage von bunteblumeRouter & Routing14 Kommentare

Hallo Zusammen, Ich möchte gerne ein backup von einem bestimmten Folder welcher auf dem Server regelmässig synchronisiert wird auf ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...

Windows 10
Alle Programme mit bestimmtem Namen automatisch (per GPO) deinstallieren
gelöst Frage von lordofremixesWindows 1012 Kommentare

Hallo zusammen, gibt es eine Möglichkeit, alle Programme beginnend mit z.B. "Dell" im Namen per Script und somit per ...