Laden...

Dienste unter fremden Konto steuern

Erstellt von Thielo vor 19 Jahren Letzter Beitrag vor 19 Jahren 4.187 Views
T
Thielo Themenstarter:in
5 Beiträge seit 2005
vor 19 Jahren
Dienste unter fremden Konto steuern

Hallo ....
...im Rahmen meines Berufes wechsel ich von Delphi auf VS.net
und zwar unter der Auflage: "Learning by doing". Nun hoffe ich
hier hin und wieder Antworten zu finden.

Hier nun meine erste Frage:
Wie kann ich (z.B. mit dem ServiceController) auf einem anderen
Rechner die Dienste steuern (Start,Stop,usw.) die unter einem
fremden Benutzerkonto laufen? Gibt es da eine Möglichkeit den
Benutzer und sein Kennwort mit zu übergeben?

Besonders freuen, würde ich mich über eine kleine Beispiel-Source.

Danke 🙂

hmmmm?

N
33 Beiträge seit 2004
vor 19 Jahren

Original von Thielo
...Gibt es da eine Möglichkeit den Benutzer und sein Kennwort mit zu übergeben?...

Das kanst du ganz einfach in der InstallerClass machen.
Einfach den ServiceAccount auf User stellen und schon kommt beim installieren des Services ein fenster wo du User und Passwort eingeben must.

mfg

T
Thielo Themenstarter:in
5 Beiträge seit 2005
vor 19 Jahren

Hier muss ein Missverständnis vorliegen.
Es geht nicht darum einen Dienst auf einem Rechner unter einem
fremden Account zu installieren, sondern darum von dem Rechner
A einen Dienst auf Rechner B zu steuern der unter einem anderen
Konto läuft.

hmmmm?

N
33 Beiträge seit 2004
vor 19 Jahren

Aaaa, mein fehler.

Da könnte dir die ServiceController Klasse helfen.

ServiceController

Siehe es dir mal an. Sollte das sein was du suchst.

mfg

T
Thielo Themenstarter:in
5 Beiträge seit 2005
vor 19 Jahren

Hallo....
...in meiner Eingangsfrage erwähnte ich schon den
ServiceController. Es ist ja auch für mich kein Pro-
blem Dienste mit ihm zu steuern, deren Rechte ich
besitze, aber, wie schon gefragt, wie funktioniert
dieses bei Diensten auf einem fremden Konto? Wie
kann ich z.B. den passenden User und sein Passwort
mit übergeben um die Berechtigung zu erhalten den
Dienst zu starten oder zu beenden.

hmmmm?

Q
992 Beiträge seit 2005
vor 19 Jahren

ich weiß nicht, ob es soetwas in .NET gibt, aber die API-Funktion CreateProcessWithLogonW könnte dich interssieren. Da kannste deine Anwendung mit starten und hast dann die Berechtigungen des anderen Users. Allerdings natürlich nur, wenn gegen eine Domäne angemeldet.

Grüße Christoph

T
Thielo Themenstarter:in
5 Beiträge seit 2005
vor 19 Jahren

Hallo ...
Da meine Anwendung die verschiedensten Dienste auf unzähligen Rechnern
hier im Haus steuern soll, die leider alle auf unterschiedlichen Konten laufen,
müßte die Anwendung permanent neu gestartet werden um sich anders an-
zumelden......oder jede Steuerungssequenz in einen eigenen Thread gekap-
selt werden, falls man diesen unter einem eigenen (also fremden) Konto
erstellen kann (reine Annahme).

Es muss unter VS.net einfach eine einfachere Lösung geben.... X(

hmmmm?

Q
992 Beiträge seit 2005
vor 19 Jahren

Leider ist VS.Net nur ein RAD-Tool, wenn es komplexer wird muss man passen g. War nur nen Scherz. Wühl dich mal durch die MSDN, da wird man oft fündig.

C
980 Beiträge seit 2003
vor 19 Jahren

Was du imo brauchst ist Impersonation. Siehe dazu z.b.: http://blogs.msdn.com/shawnfa/archive/2005/03/24/401905.aspx (bezieht sich auf Whidbey, aber im Netz gibt's sicher auch Infos zum aktuellen Framework - wenn wohl auch v.a. im Zusammenhang mit ASP.NET)

C
1.215 Beiträge seit 2004
vor 19 Jahren

die lösung deiner probleme ist wie so häufig auch hier WMI (Windows Management Instrumentation) oder ActiveDirectory.
ersteres findest du unterm "System.Management"-namespace, zweiteres unter "System.DirectoryServices".

beide ansätze erlauben, operationen auf anderen rechnern unter angabe des benutzerkontexts vorzunehmen - WMI ist umfangreicher in der funktion AD ist etwas komfortabler in der bedienung/programmierung.

so ginge schon mal eine auflistung per WMI...


using System;
using System.Management;
...
...
void Services()
{
	ManagementScope pipe = new ManagementScope(@"\\<host>\root\cimv2");
	ManagementObjectSearcher services = new ManagementObjectSearcher(pipe, new ObjectQuery("SELECT * FROM Win32_Service"));
	
	pipe.Options.Username = "uid";
	pipe.Options.Password = "pwd";
	pipe.Connect();
	
	foreach (ManagementObject service in services.Get())
		Console.WriteLine(service["Name"] + ": " + service["StartName"]);
}

und so gehts per AD...


using System;
using System.DirectoryServices;
...
...
void Services()
{
	DirectoryEntry root = new DirectoryEntry("WinNT://<host>", "uid", "pwd");
	DirectoryEntries services = root.Children;
	
	services.SchemaFilter.Add("service");
	
	foreach (DirectoryEntry service in services)
		Console.WriteLine(service.Name + ": " + service.Properties["ServiceAccountName"].Value);
}

grüsse
cord

T
Thielo Themenstarter:in
5 Beiträge seit 2005
vor 19 Jahren

....erst einmal vielen Dank für die Antwort, aber ich habe damit folgende Probleme:

Der WMI-Ansatz erlaubt mir den Zugriff auf den Zielrechner unter Verwendung
der richtigen Login-Daten (User, Password), aber die Zeile "foreach ...." gibt
den Fehler "Ungültige Klasse zurück".

Der AD-Ansatz gibt mir zwar die gewünschten Service-Daten zurück, aber wie
schlage ich die Brücke zu der Steuerrung dieser Dienste?

MfG, Thielo

hmmmm?

C
1.215 Beiträge seit 2004
vor 19 Jahren

zu WMI)
versuche einmal, im ObjectQuery Select * FROM Win32_BaseService anzugeben.

zu AD)
du musst bei MSDN nach den AD-schema-classes ausschau halten.
in den zugehörigen auflistungen findest du auch die referenzen der class-member.
mit DirectoryEntry.Invoke kannst du dann methoden ausführen.

grüsse
cord