Programm aus Dienst starten

Cecidi

Mitglied
Hi,

in einem VB Programm (VBnet VS2005 / Win XP Pro) rufe ich ein externes Programm mittels

Code:
Dim prog As System.Diagnostics.Process
prog = New System.Diagnostics.Process
prog.StartInfo.FileName = "notepad.exe"
prog.StartInfo.WindowStyle = ProcessWindowStyle.Normal
prog.Start()

ohne Probleme auf. Wenn ich den gleichen Code innerhalb eines Dienstes ausführen möchte, wird der Process auch gestartet, aber ohne Bedienoberfläche (Window).
Im Taskmanager ist das Programm (notepad) dann unter "Prozesse" zu sehen, aber nicht im "Andwendungen" Reiter?!!

[Edit] Ich hab aber inzwischen einen Ansatz gefunden:

man muss irgendwie die Diensteigenschaft "Interact with desktop" setzen. Wenn ich das von Hand mache, geht plötzlich alles.
Im "VB ServiceInstaller" gibt es diese Eigenschaft aber nicht?!!


mfg Cecidi
 
Ist das nur für dich, oder soll es auch mal unter Vista laufen? Denn unter Vista funktioniert das ohnehin so nicht mehr.

Ich hab's aber aktuell nur in C#, da mein Reflector nicht mag ...
C#:
public class ServiceInstallerEx : System.ServiceProcess.ServiceInstaller
{
    public ServiceInstallerEx()
        : base()
    {
        // Set eventhandler to call UpdateServiceConfig when install commited
        base.Committed += new InstallEventHandler(this.UpdateServiceConfig);
    }

    // Note that enabling "DesktopInteract" will fail if Service account is not LocalSystem !!
    void UpdateServiceConfig(object sender, InstallEventArgs e)
    {
        int ret;
        ManagementBaseObject inParams = null;
        ManagementObject srvc = new ManagementObject("Win32_Service=" + "\"" + this.ServiceName + "\"");
        inParams = srvc.GetMethodParameters("Change");
        inParams["DesktopInteract"] = true; // Enable interactive mode (Interact With Desktop)
        ManagementBaseObject outParams = srvc.InvokeMethod("Change", inParams, null);
        if ((ret = Convert.ToInt32(outParams.Properties["ReturnValue"].Value)) != 0)
            Console.WriteLine("Failed to set option: {0}", ret);
        else
            Console.WriteLine("Option set");
    }
}
 

Neue Beiträge

Zurück