VBSkript mit Hilfe eines Dienstes starten (geschrieben in C-Sharp)
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:
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:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Data.SqlClient;
namespace ServiceName
{
public partial class Service1 : ServiceBase
{
private Timer timer1 = null;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string args)
{
timer1 = new Timer();
this.timer1.Interval = 30000;
this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Tick);
timer1.Enabled = true;
string connetionString = null;
SqlConnection cnn;
SqlDataReader reader;
connetionString = "Data Source=****;Initial Catalog=****;User ID=****;Password=****";
cnn = new SqlConnection(connetionString);
try
{
cnn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Update omopt Set DienstAktiv=1 where ID=1";
cmd.CommandType = CommandType.Text;
cmd.Connection = cnn;
reader = cmd.ExecuteReader();
cnn.Close();
}
catch (Exception ex)
{
Library.WriteErrorLog(DateTime.Now.ToString() + ": SQLFEHLER " + ex.Source.ToString().Trim() + ": " + ex.Message.ToString().Trim());
}
Process.Start("C:\\Winchenbach\\KundenAktualisieren.vbs");
Library.WriteErrorLog("ServiceName started");
}
private void timer1_Tick(object sender, ElapsedEventArgs e)
{
Library.WriteErrorLog("Tick and Job done");
}
protected override void OnStop()
{
timer1.Enabled = false;
string connetionString = null;
SqlConnection cnn;
SqlDataReader reader;
connetionString = "Data Source=****;Initial Catalog=****;User ID=****;Password=****";
cnn = new SqlConnection(connetionString);
try
{
cnn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Update omopt Set DienstAktiv=0 where ID=1";
cmd.CommandType = CommandType.Text;
cmd.Connection = cnn;
reader = cmd.ExecuteReader();
cnn.Close();
}
catch (Exception ex)
{
Library.WriteErrorLog(DateTime.Now.ToString() + ": SQLFEHLER " + ex.Source.ToString().Trim() + ": " + ex.Message.ToString().Trim());
}
Library.WriteErrorLog("ServiceName stopped");
}
}
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 249336
Url: https://administrator.de/contentid/249336
Ausgedruckt am: 24.11.2024 um 08:11 Uhr
6 Kommentare
Neuester Kommentar
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.
Grüße Uwe
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.
Process pr = new Process();
pr.StartInfo.FileName = "cscript.exe";
pr.StartInfo.Arguments = @"c:\pfad\script.vbs";
pr.Start();
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.Edit3
lass dir doch mal aus der VBS Logs in eine Datei schreiben dann weißt du an welcher Stelle das Script genau abbricht.