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
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, 1210 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 ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows 7
Linux über Windows 7 Bootloader starten (4)

Frage von oecke77 zum Thema Windows 7 ...

Windows Installation
PXE Boot-Von CD Starten (2)

Frage von STITDK zum Thema Windows Installation ...

Windows 7
Dataline Office benötigt zum starten Admin-Rechte (3)

Frage von ingoue zum Thema Windows 7 ...

Windows 10
Standard App in Windows 10 starten nicht mehr (7)

Frage von zeroblue2005 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...