Laden...

NT Service - starten, stoppen und Beschreibung ermitteln

Erstellt von inflames2k vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.049 Views
inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 13 Jahren
NT Service - starten, stoppen und Beschreibung ermitteln

Hallo,

aktuell sitze ich an einer Anwendung, welche einen NT-Dienst überwachen soll, dass heißt Status, letzte Meldung und weitere Informationen des Dienstes anzeigen. - Die Letzte Meldung etc. erhalte ich über eine Anfrage an den Dienst, jedoch ist mir unklar, wie ich den Dienst übers Netzwerk starten / stoppen kann und desweiteren, wie ich die Beschreibung des Dienstes erhalte.

Ich hoffe mir kann an der Stelle weiter geholfen werde.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

J
1.114 Beiträge seit 2007
vor 13 Jahren

Mehr fällt mir hierzu echt nichts ein X(

klick

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 13 Jahren

Schön wäre ja schon zu wissen, wie man an die Beschreibung kommt. - Das starten / beenden lässt sich sicher irgendwie per Remoting lösen. - Ich werd mal weitersuchen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

schau Dir mal ServiceController.GetServices an, da gibt's eine Überladung bei der man einen machineName als Parameter angibt.
Damit sollte Start/Stop/Beschreibung eigentlich funzen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 13 Jahren

Mittels _serviceController = new ServiceController(Configuration.ServiceName, Configuration.ServiceIP); sollte ich doch schon an den entsprechenden Service kommen. - Allerdings fehlen mir die Berechtigungen, daher werd ich hier wohl mit Remoting o.ä. arbeiten müssen.

Aber vorrang hat ersteinmal die Ermittlung der Dienstbeschreibung. Allerdings ist mir unklar, wie mittels des ServiceController die Beschreibung eines Dienstes abgerufen wird.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

stimmt da kriegst Du ja nur den DisplayName.
Für die Beschreibung musst Du vermutlich die Registry des betroffenen Rechners auslesen, unter
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services<NAME>\Description

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 13 Jahren

Gut, lokal auf der Maschine funktioniert nun ersteinmal lesen der Beschreibung, sowie starten und stoppen. - Da die Maschine aber wohl im Betrieb im Keller stehen wird und die Anwendung an der ich sitze in einem Büro muss ich mir noch was für den Zugriff von extern einfallen lassen. - OpenRemoteBaseKey scheint Gruppenrichtlinien zu benötigen. - Daher muss ich das mal abklären.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

S
6 Beiträge seit 2008
vor 13 Jahren

Hi inflames,

vielleicht hilft Dir der Code und/oder der Link hier weiter?

Link: StartService Method of the Win32_Service Class

Gruß

Sk


using System;
using System.Management;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            // Abzufragende Maschine ( "." = Lokaler Rechner)
            string computerName = ".";
            // Abzufragender Dienst
            string serviceName = "TELNET";
            // Query
            string serviceQuery = String.Format("SELECT * FROM Win32_Service");

            // Dienst suchen
            using (ManagementObjectSearcher mSearcher = new ManagementObjectSearcher(String.Format(@"\\{0}\ROOT\CIMV2", computerName), serviceQuery))
                foreach (ManagementObject mObj in mSearcher.Get())
                    using (mObj)
                    {
                        // Gefundenen Dienst prüfen
                        string objDisplay = mObj.Properties["DisplayName"].Value.ToString();

                        if (objDisplay.ToUpper() != serviceName.ToUpper())
                            continue;

                        // Dienst-Eigenschaften ermitteln
                        string objName = mObj.Properties["Name"].Value.ToString();
                        string objDescription = mObj.Properties["Description"].Value.ToString();
                        string objStatus = mObj.Properties["State"].Value.ToString();

                        // Dienst-Eigenschaften ausgeben
                        Console.WriteLine("Anzeigename:\t{0}", objDisplay);
                        Console.WriteLine("Dienstname:\t{0}", objName);
                        Console.WriteLine("Dienststatus:\t{0}", objStatus);
                        Console.WriteLine("Beschreibung:\t{0}", objDescription);
                        Console.WriteLine();

                        // Dienst starten, wenn gestoppt
                        if (objStatus.ToUpper() == "STOPPED")
                        {
                            int startUp = Convert.ToInt32(mObj.InvokeMethod("StartService", null));

                            if (startUp != 0)
                                Console.WriteLine("Der Dienst konnte nicht gestartet werden.");
                            else
                                Console.WriteLine("Der Dienst wurde erfolgreich gestartet.");
                        }

                        // Abschlussmeldung
                        Console.WriteLine();
                        Console.WriteLine("Bitte beliebige Taste druecken ...");
                        Console.ReadKey();
                    }
        }
    }
}

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 13 Jahren

Wobei das eigentliche Problem des unerlaubten Zugriffs bleibt. 😃

An und für sich reichen fürs starten / stoppen die Methoden des ServiceControllers, und für das auslesen die Registry Klassen. - Aber bei beiden varianten gäbe es das selbe Problem. - Es müssen Zugriffsrechte bestehen.

Ansonsten würden mit Sicherheit beide Varianten funktionieren.

Meine Lösung (die lokal funktioniert) sieht so aus:


/// <summary>
        /// Method to stop the service
        /// </summary>
        /// <returns>true if the service stopped successfull</returns>
        public bool StopService()
        {
            bool success = false;
            try
            {
                _serviceController.Stop();
                _serviceController.WaitForStatus(ServiceControllerStatus.Stopped);
                this.RequestState(this, new EventArgs());
                success = true;
            }
            catch
            {
                success = false;
            }

            return success;
        }

        /// <summary>
        /// Method to start the service
        /// </summary>
        /// <returns>true if the service started successfull</returns>
        public bool StartService()
        {
            bool success = false;
            try
            {
                _serviceController.Start();
                _serviceController.WaitForStatus(ServiceControllerStatus.Running);
                this.RequestState(this, new EventArgs());
                success = true;
            }
            catch
            {
                success = false;
            }
            return success;
        }

private string GetDescription()
        {
            if (this._serviceDescription == null)
            {
                try
                {
                    RegistryKey key;
                    if ((Environment.MachineName == ".") || (Environment.MachineName == Configuration.ServiceComputerName))
                    {
                        key = Registry.LocalMachine.OpenSubKey("System");
                    }
                    else
                    {                        
                        key = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, Configuration.ServiceComputerName).OpenSubKey("System");
                    }
                    RegistryKey key4 = key.OpenSubKey("CurrentControlSet").OpenSubKey("Services").OpenSubKey("Servicename");
                    this._serviceDescription = key4.GetValue("Description") as string;
                    if (this._serviceDescription == null)
                    {
                        this._serviceDescription = string.Empty;
                    }
                }
                catch
                {
                    this._serviceDescription = string.Empty;
                }
            }
            
            return this._serviceDescription;
        }

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 13 Jahren

Problem hat sich erledigt, mittels eines Administrator Accounts funktioniert alles wie es soll.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

1.433 Beiträge seit 2006
vor 13 Jahren

Mit der PowerShell ginge es so... (falls Dein Rechner nicht NT 4.0 mit welchem Du den NT-Dienst überwachen willst.)


get-service

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt