Windows-Dienst: Listening on socket während als LocalSystem ausgeführt
Ich Schreibe einen kleinen server-Programm wie in C für Windows (unter Verwendung von MinGW/GCC, Tests auf Windows 7), schließlich soll das ausführen als Dienst mit dem lokalen Systemkonto. Ich bin erstellen einen socket, und mithilfe von Windows-Sockets bind()
, listen()
und accept()
auf eingehende verbindungen zu warten. Wenn ich die Anwendung von der Kommandozeile aus (also nicht als Dienst, sondern als normaler Benutzer), habe ich keine Probleme mit der Verbindung zu externen IP-Adressen. Allerdings, wenn ich das Programm als Dienst mit dem lokalen Systemkonto, ich kann nur eine Verbindung zu dem Dienst von meinem eigenen PC, entweder mit 127.0.0.1
oder meine lokale Adresse, 192.168.1.80
(ich bin hinter einem router in einem kleinen lokalen Netzwerk). Weder externe IPs noch andere PCs im gleichen lokalen Netzwerk, mit dem local-Adresse, können jetzt eine Verbindung herstellen, obwohl es keine Probleme gab, ohne als Dienst ausgeführt wird.
Nun, ich habe gehört, dass die Vernetzung wird anders behandelt oder gar nicht zugänglich sind (?) bei Ausführung als lokales System oder lokaler Dienst oder Dienste nicht auf beide dem desktop und das Netz (Anmerkung: mein Dienst ist nicht interaktiv) in der gleichen Zeit aufgrund von überlegungen zur Sicherheit. Grundsätzlich, ich brauche, um herauszufinden, was falsch läuft/wie zu hören für verbindungen, die in einem service. Ausgeführt wird, erhält das gleiche wie als LocalSystem ausgeführt werden, aber mit Netzwerk-Zugriff? Sicher muss es-Server ausgeführt werden können als hintergrund-Dienste, so wie tun Sie es?
UPDATE: Es scheint, dass Sie die Vorschläge deaktivieren Sie die firewall auf dem richtigen Weg waren – ich kann eine Verbindung nach dem hinzufügen einer Ausnahme in der Windows Firewall. Ich denke, ich dachte nicht an der firewall, da, wenn Sie eine Anwendung ausführen, die mithilfe von sockets in der Regel, Sie bekommen eine Eingabeaufforderung Sie gefragt, um das hinzufügen von Ausnahmen, die nicht geschehen, wenn ein service ausgeführt wird, für die erste Zeit. Gibt es eine bessere Art das zu handhaben, als das hinzufügen die Regel für die firewall manuell? Tut LocalSystem-Berechtigungen zum hinzufügen einer Regel für die firewall selbst oder hätte ich dazu bei der installation irgendwie?
- ich denke die firewall ist mehr wahrscheinlich Schuldigen, versucht, Sie auszuschalten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
LocalSystem-und LocalService-Konten haben eingeschränkte Netzwerk-logon-Rechte, aber soweit ich weiß sollte es nicht auf socket-verbindungen.
Jedoch die Windows firewall aktiv sein, und wenn Sie verschoben Sie die ausführbare Datei in ein neues Verzeichnis für die installation als service, es könnte nicht mehr auf die Regel zutreffen, die Sie für Tests.
Verwendeten Benutzerkonto Dienstes wirkt sich nicht auf TCP/UDP bind/listen Bedienung.
Stellen Sie sicher, dass Sie deaktiviert firewall-Dienst und/oder ein Antivirenprogramm und versuchen Sie es erneut.
Lesen Sie mehr details auf der MSDN-Website und gebaut-in-service Konten:
Service-Konten
Dienst läuft im Kontext des LocalSystem Konto erbt den Sicherheitskontext des SCM.LocalSystem ist ein sehr hoch-privilegierten built-in-Konto. Es besitzt umfassende Berechtigungen auf dem lokalen system und fungiert als computer auf dem Netzwerk. Der tatsächliche name des Kontos lautet "NT-AUTORITÄT\SYSTEM".
LocalService besitzt minimale Berechtigungen auf dem lokalen computer und präsentiert im Netzwerk anonyme Anmeldeinformationen an.Das Lokale Dienstkonto ist ein integriertes Konto, das die gleichen Zugriffsrechte auf Ressourcen und Objekte wie Mitglieder der Gruppe Benutzer. Dieser eingeschränkte Zugriff trägt zum Schutz des Systems, wenn einzelne Dienste oder Prozesse gefährdet sind. Dienste laufen unter dem Lokalen Dienstkonto Zugriff auf Netzwerkressourcen als null-Sitzung ohne Anmeldeinformationen. Beachten Sie, dass das Lokale Dienstkonto nicht unterstützt, wenn der SQL Server-oder SQL Server-Agent-Dienste. Der tatsächliche name des Kontos lautet "NT-AUTORITÄT\LOKALER DIENST".
Dienst läuft im Kontext des Netzwerkdienst Konto stellt die Anmeldeinformationen des Computers auf remote-Server.Das Netzwerkdienstkonto ist ein integriertes Konto, das mehr Zugriff auf Ressourcen und Objekte als Mitglieder der Gruppe Benutzer. Dienste, die laufen, wie der Network Service account Zugriff auf Netzwerkressourcen unter Verwendung der Anmeldeinformationen des Computerkontos. Der tatsächliche name des Kontos lautet "NT AUTHORITY\NETWORK SERVICE"
Ich bin mir ziemlich sicher, dass Sie bind/listen auf port, wenn Sie führen service als LocalSystem.
Zum Beispiel Apache 2.2 hat es:
Etwas zu Lesen:
Das Verständnis der Lokalen Service-und Netzwerk-Service-Konten
Als die anderen Antworten (von rkosegi und Ben Voigt) vorgeschlagen, die Windows-Firewall blockiert den port, da zog ich die ausführbare Datei an einen anderen Speicherort für die installation und weil Leistungen nicht bewirken, dass die Meldung, dass eine Verbindung blockiert wurde (zusammen mit einem button die Sperrung der Anwendung) angezeigt. Ich landete mit
netsh advfirewall firewall add rule name="%name%" dir=in action=allow program="%path%" enable=yes
in einem .bat-Datei ganz einfach eine Ausnahme für die firewall.