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 |
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 |
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
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 |
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
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 |
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();
}
}
}
}
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 |
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 |
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