.Net 2.0 ServiceController.GetServices()
Ich habe eine website, auf der die windows-Authentifizierung aktivieren. Von einer Seite in der website, die user haben die Möglichkeit einen Dienst zu starten, hat einige Sachen mit der Datenbank.
Es funktioniert gut für mich, den Dienst zu starten, weil ich einen lokalen admin auf dem server. Aber ich hatte gerade einen user testen, und Sie nicht bekommen kann der Dienst gestartet wurde.
Meine Frage ist:
Kennt jemand eine Möglichkeit, um eine Liste der Dienste auf einem bestimmten computer nach Namen mit einem anderen windows-Konto als der, den Sie aktuell angemeldet sind?
Ich möchte wirklich nicht, um alle Benutzer zu starten, der Dienst in einer windows-Gruppe, und legen Sie Sie alle auf einen lokalen admin auf meinem IIS server.......
Hier einige der code, den ich habe:
public static ServiceControllerStatus FindService()
{
ServiceControllerStatus status = ServiceControllerStatus.Stopped;
try
{
string machineName = ConfigurationManager.AppSettings["ServiceMachineName"];
ServiceController[] services = ServiceController.GetServices(machineName);
string serviceName = ConfigurationManager.AppSettings["ServiceName"].ToLower();
foreach (ServiceController service in services)
{
if (service.ServiceName.ToLower() == serviceName)
{
status = service.Status;
break;
}
}
}
catch(Exception ex)
{
status = ServiceControllerStatus.Stopped;
SaveError(ex, "Utilities - FindService()");
}
return status;
}
Meine Ausnahme kommt aus der zweiten Zeile im try-block. Hier der Fehler:
System.InvalidOperationException:
Kann nicht öffnen Sie Dienststeuerungs-Manager auf
computer 'server.domain.com'. Diese
Betrieb erfordern möglicherweise andere
Privilegien. --->
System.ComponentModel.Win32Exception:
Zugriff verweigert --- Ende der inneren
exception stack trace --- at
System.ServiceProcess.ServiceController.GetDataBaseHandleWithAccess(String
machineName, Int32
serviceControlManaqerAccess)
System.ServiceProcess.ServiceController.GetServicesOfType(String
machineName, Int32 Diensttyp)
TelemarketingWebSite.Utilities.StartService()
Danke für die Hilfe/info
InformationsquelleAutor Miles | 2008-10-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: Diese geht nicht auf das auflisten der Dienste mit einem anderen Benutzerkonto, aber angesichts der weitergehenden Beschreibung von dem, was Sie tun, ich denke, es ist eine gute Antwort.
Ich denke, Sie vereinfachen vieles, und vielleicht vermeiden Sie Teil der Sicherheits-problem, wenn man direkt an den service von Interesse sind. Anstelle von aufrufen GetServices, versuchen Sie dies:
Diese schließt sich direkt an den service von Interesse sind, und umgeht die Aufzählung/Suche Schritt. Daher ist es nicht erforderlich, den Anrufer zu haben, die
SC_MANAGER_ENUMERATE_SERVICE
Recht auf den Service Control Manager (SCM), die remote-Benutzer nicht standardmäßig. Ist es immer noch erforderlichSC_MANAGER_CONNECT
, aber laut MSDN, die gewährt werden sollte, um remote-authentifizierten Benutzern.Sobald Sie gefunden haben, den service von Interesse sind, werden Sie noch brauchen, um in der Lage zu stoppen und starten Sie es, die Ihre remote-Benutzer vermutlich nicht über Rechte zu tun. Jedoch, es ist möglich, ändern die Sicherheitsbeschreibung (DACL) für die einzelnen Dienstleistungen, die lassen würde Sie grant remote-Benutzer Zugriff, um zu stoppen und starten Sie den Dienst, ohne dass Sie zu lokalen admins. Dies geschieht über die SetNamedSecurityInfo - API-Funktion. Die Zugriffsrechte, die Sie brauchen zu gewähren sind
SERVICE_START
undSERVICE_STOP
. Je nach genau, zu welchen Gruppen diese Benutzer angehören, müssen Sie möglicherweise auch zu gewähren, IhnenGENERIC_READ
. Alle diese Rechte sind in der MSDN beschrieben.Hier einige C++ - code zur Ausführung dieses setup, vorausgesetzt, der Nutzer von Interesse sind, in der "Remote Service Controller" - Gruppe (die Sie die schaffen würde) und der service-name ist "my-service-name". Beachten Sie, dass wenn Sie wollten, gewähren von Zugriff auf eine bekannte Gruppe wie die Benutzer (nicht unbedingt eine gute Idee ist), anstatt eine von Ihnen erstellte Gruppe, die Sie ändern müssen
TRUSTEE_IS_GROUP
zuTRUSTEE_IS_WELL_KNOWN_GROUP
.Den code hat keine Fehler-Kontrolle, die Sie hinzufügen möchten. Alle drei Funktionen, die fehlschlagen können (Get/SetNamedSecurityInfo und SetEntriesInAcl) geben 0 zurück, um anzuzeigen, Erfolg.
Noch ein Hinweis: Sie können auch einen service security descriptor mit das SC-tool, die sich unter %WINDIR%\System32, aber nicht um irgendwelche Programmierung.
Diese könnten auch von C# mit P/Invoke, aber das ist ein bisschen mehr Arbeit.
Wenn Sie noch möchte speziell aufgelistet werden können-Dienstleistungen, da sich diese Benutzer, die Sie benötigen, zu gewähren, die
SC_MANAGER_ENUMERATE_SERVICE
rechts auf den SCM. Leider laut MSDN, die SCM-Sicherheit kann nur geändert werden, auf Windows Server 2003 sp1 oder höher.InformationsquelleAutor Charlie
Dank für diese Codezeile Charlie. Hier ist, was ich am Ende machen. Ich habe die Idee von dieser Webseite: http://www.codeproject.com/KB/cs/svcmgr.aspx?display=Print
Hatte ich auch, um das Konto hinzuzufügen, ich bin Zugriff auf diese als auf die Gruppe Hauptbenutzer auf dem server.
Und hier ist meine andere Klasse mit dem ImpersonationUtil.Impersonate():
Nur um klar zu sein, wenn Sie nicht zurückkehren, den Identitätswechsel, der thread wird weiterhin die Identität des angegebenen Kontos auf unbestimmte Zeit. Dies ist bestenfalls eine wahrscheinliche Ursache von bugs, und im schlimmsten Fall eine Sicherheitslücke. Am besten, vorsichtig zu sein.
Dieser arbeitete für mich.
InformationsquelleAutor Miles
Können Sie versuchen, mit ASP.NET Identitätswechsel in Ihrem web.config-Datei und geben Sie ein Benutzerkonto mit den entsprechenden Berechtigungen:
Werfen Sie einen Blick auf dieser Artikel auf MSDN. Ich glaube, es gibt andere Optionen, die nicht benötigen, speichern Sie das Passwort in das web.config-Datei wie stellen Sie es an einem registry-Schlüssel statt.
Dadurch wird die ASP.NET worker-Prozess ausgeführt werden, die im Kontext des angegebenen Benutzers anstelle des angemeldeten Benutzers in der web-Anwendung. Jedoch, stellt dies ein Sicherheitsproblem und würde ich stark überdenken Sie Ihre design. Möchten Sie vielleicht in Erwägung ziehen, mit der ASP.NET web-Seite ihrerseits das Feuer aus eine Anfrage an einen anderen Prozess tatsächlich steuert die Dienste, auch andere windows-service oder schreiben Sie die Anfrage auf eine Datenbank-Tabelle, dass der windows-Dienst fragt in regelmäßigen Abständen.
Sie können weiterhin verwenden Sie Ihr windows-Konto für die Authentifizierung. Ich nehme an, Sie verwenden die integrierte Authentifizierung in IIS und der ASP.NET Authentifizierung-Modell. (<authentication mode="Windows" />). Sie können beide zusammen, und IIS noch verhandeln die Anmeldeinformationen des Benutzers keine weitere Anmeldung.
InformationsquelleAutor Rich