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)

Mitglied: Mesaou

Mesaou (Level 1) - Jetzt verbinden

16.09.2014 um 15:34 Uhr, 1318 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 XAML Universal
Frage von DippsC und C++3 Kommentare

Hallo ich versuche gerade mit C#2015 ein Projekt Universal XAML zu erstellen um auf einem Raberry PI 2 mit ...

C und C++
C-sharp SearchPattern (Regex)
Frage von YanmaiC und C++6 Kommentare

Hallo ihr Administratoren, ich verwende ein AUtocpmpletemenu Plugin. Dort habe ich Snippets, die dann sozusagen completed werden. Beim erstellen ...

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 ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 1 TagWindows 105 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 1 TagAdministrator.de Feedback18 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 2 TagenHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 3 TagenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Windows Server
Standortvernetzung zu einem Strato VServer (Windows)
Frage von matzefratze81Windows Server10 Kommentare

Moin, ich komme aus einem Enterprise-Umfeld und habe den Fehler gemacht, dass ich mich auf ein kleines Unternehmen eingelassen ...

Grafikkarten & Monitore
4k EIZO Monitor, Fernseher und Splitter
Frage von LerxxeyGrafikkarten & Monitore9 Kommentare

Hallo Zusammen, vielleicht könnt ihr mir bei einem Problem helfen wo ich einfach nicht mehr weiterkomme Und zwar haben ...

TK-Netze & Geräte
Fax im Betrieb
Frage von gansa28TK-Netze & Geräte6 Kommentare

Hallo zusammen, Endlich wurden meine Gebete Erhört und der Rechner meines Bekannten dem ich etwas unter die Arme greife, ...

Humor (lol)
Nerd Zeitschrift gesucht
Frage von 2SeitenHumor (lol)6 Kommentare

Hey Zusammen, Ich suche eine Zeitschrift bei der es ums technische Basteln geht. Pc zusammenschrauben, Arduino Projekte, Server Tipps ...