# Eclipse: Windows-Dienst auf fremden Host aktivieren



## jojo.14 (26. Okt 2012)

Hallo zusammen,

ich habe folgende Frage. Mein Java-Programm soll auf einem fremden Host einen Windows-Dienst abfragen können. Im besten Fall schauen, in welchem Status der Dienst sich befindet und diesen gegebenenfalls neu starten. 

Bisher scannt das Programm den zugeordneten Port über den der Dienst im Netzwerk kommuniziert. Ich kann also abfragen ist der Port offen. 
Nur beantwortet das ja nicht automatisch die Frage, in welchem Zustand sich der Dienst befindet. 

Hoffe mir kann jemand weiterhelfen.

Gruß Joe


----------



## jojo.14 (13. Nov 2012)

Hallo nochmal,

leider hat mir bislang noch niemand geantwortet. Daher vielleicht die Fragestellung etwas einfacher. 

Ist es möglich mit Eclipse Windows-Dienste auf meinem eigenen Rechner anzusprechen. Das heisst sie zu aktivieren/deaktivieren oder nur eine Liste der laufenden Dienste auszugeben.

Gruß Joe


----------



## D4rkscr43m (13. Nov 2012)

Du könntest z.B. NET START aufrufen, das zeigt zumindest alle gestarteten Dienste auf dem Bildschirm an. Java bietet ja die Möglichkeit die Ausgabe von Prozessen die es gestartet hat abzufragen, so kämst du zumindest an eine Liste der laufenden Dienste.

Sonst könntest du mal die JNI durchforsten, ob da etwas passendes bei ist.


----------



## tröööt (15. Nov 2012)

ich glaube hier spiele auch noch ganz andere dinge wie berechtigungen und domain eine rolle ...

einfach so mal eben remote einen dienst auf einem anderen windows-rechner ausführen dürfte wohl nicht so einfach machbar sein ... wobei ich diese sicherheitslücke M$ ganz erlich zutrauen würde ...

du brauchst mindestens eine Admin-anmeldung auf dem remote-system ... und da "Administrator" in der regel remote blockiert ist muss erstmal ein entsprechender user auf dem ziel-system eingerichtet werden ...
dann müssen noch firewall und domain richtig eingestellt werden ... und zu guter letzt brauchst du auch noch ein "Server" system ... also Windows Server ... der als domain-controller arbeitet und damit die rechte hat ... denn alles was nicht "Server" im namen hat sind sog. client-systeme ... bei denen kann man nicht mal remote "shutdown" callen ...

und bevor das alles nicht geklärt ist brauchst du nicht mal anfangen zu überlegen wie sowas mit java machbar wäre


----------



## jojo.14 (5. Dez 2012)

Hallo,

danke für die Antworten. Werde den beiden Vorschlägen parallel versuchen nachzugehen.

@D4rkscr43m: "NET START" ist ein Befehl den ich mit dem Kommandofenster ausgeführt bekomme.  Den kann ich auch von Eclipse aus aufrufen ? Wenn ja, wie mache ich das ? Gibt es da ein Codebeispiel.  
Mir wurde was von SSH erzählt, dass man damit cmd-Befehle auf fremden Rechnern ausführen kann. Allerdings mit der Problematik auf jedem fremden Rechner einen SSH-Server haben zu müssen.

@tröööt: Hast du vielleicht Literatur, die du mir empfehlen kannst. Von den Dingen in deinem 3. Absatz hab ich leider bislang wenig Wissen. 


Gruß Joel


----------



## AndiE (5. Dez 2012)

"Java ist auch eine Insel" Abschnitt 16.7.- Das könnte es sein.


----------



## trääät (5. Dez 2012)

wieso literatur ? google : "MSDN" ... da steht so n schrott drin ..

ist zwar richtig das man mit "NET ..." auch remote befehle ausführen kann (ähnlich SSH) ... aber es gibt halt die von mir angezählten einschränkungen : du brauchst n admin-login und n entsprechenden domain-controller ... und der client muss daran angemeldet sein ...

da das ganze aber dann doch wieder nur auf "system-calls aus java aufrufen" hinausläuft braucht man dafür kein java ... und auch kein eclipse ...

was du willst : remote einen win-system-dienst callen
was du brauchst : ein admin-login auf dem zielsystem und windows-cli-tools
worauf du verzichten kannst : Java und Eclipse

sehr viel intiligenter wäre es doch wenn du in java deinen eigenen server und client schreibst und dann damit arbeitest ...
in wie weit man den gewünschten win-system-dienst nachprogrammieren kann weis ich nicht ... aber mir stellt sich eh die frage : warum an den diensten von windows rumspielen ?

so lange man kein eigenes programm hat was als service registriert und als solches ausgeführt wird sollte man die finger davon lassen ...


zu SSH

SSH ist eine unter unix etablierte technik die dir die remote-console quasi auf deinen rechner holt ...
auch hierzu ist wieder ein login nötig ... und wenn man solche system-befehle nutzen will ein login mit admin-rechten ...
da man sicher unter unix aber nicht direkt als admin einloggt sondern als normaler user und dann in der session erst den admin-befehl absetzt ist es etwas anders ...

vorraussetzung dazu ist natürlich das ein SSH-server auf dem ziel system läuft ...


wenn man das ganze wirklich auf die spitze treiben will kann man das auch mit windows eigenen mitteln machen ...
dazu geht man in die systemsteuerung und installiert auf beiden systemen sowohl TELNET-SERVER als auch -CLIENT ...
nun startet man den TELNET-server auf dem entfernten system ... und den -client auf dem controller ...
das ganze gleicht jetzt SSH ... mit dem unterschied : es ist plain und nicht verschlüsselt ... weshalb ist im netz keine anwendung mehr findet ... in einem firmen-lan aber durch aus noch genutzt werden könnte ...

ich habs lange nicht mehr gemacht ... würde aber sagen das man sich jetzt beim remote-system anmelden muss ... ohne login gehts glaub ich nich ...
auch ist es anders als unter unix : wenn man admin-befehle absetzen will muss man sich gleich direkt als admin anmelden ... so wie unter unix als normaler user ein admin-command absetzen und dadurch n admin-login triggern geht nicht unter windows ...


aber für all das braucht man wie gesagt kein java ... und für system-dienste schon garnicht da man so von java nicht auf diese zugreifen kann ...


mal so nebenbei gefragt : was soll am ende eigentlich bei raus kommen ? welchen service willst du denn manipulieren ? vielleicht gibt es einen anderen weg


----------



## jojo.14 (5. Dez 2012)

Hallo trääät 

Erstmal danke für deine Antwort.

Ok ich bin sozusagen gerade bei der Abschlussarbeit meines Studiums. Thema: Netzwerk-Monitoring

Meine Aufgabenstellung ist es, wie du schon richtig sagst eine Anwendung, die als Dienst registriert ist abzufragen. Die Aufgabenstellung ist ja noch "offen" gestellt. Im besten Fall kann ich die als Dienst registrierte Anwendung, wenn sie durch irgendeinen Fehler nicht mehr läuft automatisch neu starten lassen. Aber zumindest würde ich mir gerne mit zB "net start" den Zustand des Dienstes ausgeben lassen. 

Bislang scanne ich den festgelegten Port auf 10 verschiedenen Servern über den der Dienst ins Netz kommuniziert und schreibe in eine Datenbank, ob der Scan (Aufbau einer TCP-Verbindung zum Server) erfolgreich war oder nicht. Sozusagen eine Log-Datei. 
Die Anwendung/Der Dienst muss laufen und auch online sein, um remote damit zu arbeiten. Insofern ist der Portscan nicht ganz überflüssig. 

Das habe ich bislang alles mit Java gemacht. Dort habe ich im letzten Semester erste Erfahrungen mit Eclipse und der Android-Programmierung gesammelt.

Gruß Joel


----------



## AndiE (5. Dez 2012)

Wenn man bei MSDN nachschaut, wie Träät geschrieben hat, findet man auch mit Google ein Programm "SC.exe". Dabei steht SC für "ServiceCommander". Die oben beschriebenen Dinge vorausgesetzt, wie Nutzer- und Remotefreigabe usw., kann man damit die angegebenen Aufgaben erfüllen.


----------



## trääät (5. Dez 2012)

ist richtig ... "sc.exe" ist quasi die CLI-version zur graphischen dienste-verwaltung ... und kann auch remote benutzt werden ...

aber wie gesagt : man braucht grundlegend immer einen admin-login auf dem ziel-system


----------



## jojo.14 (7. Dez 2012)

Ok danke. Habe jetzt gesehen, dass man auf der Kommandozeile mit sc [Servername] start Servicename zB einen Dienst starten könnte. 

Ich muss mich also darum kümmern, dass ich auf jedem Server, wo ich den Dienst prüfen/starten will, als Admin Zugriff aufs Betriebssystem habe!?

Jetzt schliesst mich schon das nächste Problem an. Ich möchte von Java aus die Kommandozeile starten und dort die sc.exe-Befehle eingeben? Meine Vorstellung wäre so was wie eine if-else-Struktur in der ich dann sage:

if (Dienst auf Host A inaktiv) 
dann "Starte Kommandozeile mit dem Befehl "sc [Servername] start Servicename"
sonst ...

Finde bei den meisten Suchanfragen nur, wie ich eine Java-Anwendung mit der Kommandozeile ausführe. Will ja im Prinzip das umgekehrte. 


Gruß Joe


----------



## trääät (7. Dez 2012)

acuh wenn es mit java möglich ist terminal-programme laufen zu lassen , deren output auszuwerten und ihnen input zu geben muss ich hier dennoch ein großes STOP-schild aufstellen ...

wenn du von java aus lediglich unzählige system-calls ausführst hat das nichts mehr mit java-programmierung zu tun ... dafür eignen sich dann system-scripte deutlich besser ...

unter windows also BAT-files ... natürlich muss man sich dann in deren handhabung auch erstmal wieder reinfinden ... aber es geht damit deutlich einfacher ...

und JA : du musst dafür sorgen das du auf jedem ziel-system einen admin-login hast ... ansonsten bekommst du schlicht und einfach die rückmeldung : "zugriff verweigert"

in wie fern SC direkte user-anmeldung unterstützt weis ich nich ... aber ich weis das wenn lediglich nach "server" gefragt wird immer die aktuelle lokale anmeldung genutzt wird ...
also müsstest du auf allen systemen einen admin-user mit dem selben namen und selben passwort einrichten ... auch auf deiner machine ... dich dann damit lokal anmelden und dann SC.exe ausführen ...


ich kenne mich mit diesem ganzen WinNET mist nicht aus ... da ich sowas grundlegend anders mache ..

meine umsetzung wäre folgende :

programmierung einer server-client software um die zielsysteme zu steuern
auf dem zielsystem entweder den ziel-dienst soweit anpassen das man diesen direkt steuern kann ... oder falls nicht möglich eigenen system-dienst schreiben der die steuerung übernimmt ...

da als "systemdienst" gestartete programme in der regel mit sehr hohen rechten laufen (auch java wenn es als dienst läuft) hat man in der regel auch die rechte andere system-dienste zu steuern ...
also würde man dann aus seinem eigenen dienst auf der zielmaschine einfach mit "net" weiter arbeiten ... und SC würde komplett rausfallen ...


das ganze ist ziemlich komplex und bedarf sehr viel testen ... aber wenn man die ziel-software nicht direkt steuern kann muss man es immer etwas aufwändiger machen


----------



## AndiE (7. Dez 2012)

Wenn ich mir den letzten Post ansehen, weiß ich nicht, wie ich das vom TO angestrebte System finden soll. Eine der wesentlichen Vorteile einer JVM ist doch, dass sie in der Sandbox läuft. Zum System habe ich genau definierte Schnittstellen. Damit läuft die Anwendung in Java doch vom System getrennt, und beide können sich nicht beeinflussen. Wird nicht durch das Steuern eines Systemdienstes dieses Prinzip durchbrochen?  Ich meine Ja. 
Daher würde ich auch, wie schon geschrieben, eigene Java-Anwendungen auf die Maschinen setzen, die dann miteinander kommunizieren. Übrigens nutzen Anwendungen wie SNMP, oder Schlüsselverwaltungen für Volumenlizenzen auch Agenten. Dadurch würden beide Seiten in Sandboxes laufen.


----------



## jojo.14 (11. Dez 2012)

Hallo zusammen,

habe mit meinem Betreuer noch ein paar Randbedingungen durchgesprochen. Die Java-Applikation würde später im schönsten Fall als Systemdienst integriert werden. Die Zugriffsrechte auf die anderen Rechner beschränken sich nur auf das eigene LAN-Netzwerk. Wenn zB. meine Anwendung als Dienst gestartet wird würden die Zugriffsrechte auf Netzwerk-Administrator gestellt werden. Somit müsste ich die Rechte auf alle internen Rechner erhalten. 

Mein Programm einfach mit BAT-Files zu realisieren würde ja leider nicht ausreichen. Vorgabe ist es ja auch ein Log-File in eine relationale Datenbank zu schreiben. Die Datenbankverbindung habe ich mit Eclipse bereits realisieren können. Java steuert bzw soll die einzelnen Abläufe zusammenfügen. Könnte ja auch die Batch-Dateien mit Java aufrufen. Aber habe das "OK" bekommen von Java aus die cmd-Befehle auszuführen, da in den Batch-Dateien nachher jeder rumfrickeln würde. 

Laut diesem Link:  

Galileo Computing :: Java ist auch eine Insel - 11 Die Klassenbibliothek 

soll es doch möglich sein cmd-Befehle bzw externe Prozesse auszuführen und deren Ausgabe zu analysieren. 


Jetzt geht es eigentlich darum, wie ich mir die Liste der gestarteten Dienste in Java reinhole und gegebenenfalls den nicht vorhandenen starte.


----------



## tröööt (11. Dez 2012)

@Andi
ich stimm dir soweit zu ... eigentlich ist es eine schande java hierfür missbrauchen zu wollen um etwas zu steuern worum sich windows eigentlich bitte schön selbst zu kümmern hat ... und system-calls aus java zu machen entspricht auch irgendwie dem sinn des "in java programmieren" ...

gut ... ich geb zu das ich auch so das eine oder andere in java gebastelte mit nem wraper als System-Dienst laufen lasse ... allerdings mache ich darin keine system-calls sondern ist alles in reinem java implementiert ... der grund ist halt nur das ich 1) die erhöten rechte eines system-dienstes brauche und 2) mich dadurch nicht mit "autostart" rumschlagen muss da der service einfach auf "automatik" steht ...

aber wie du erkannt hast unterscheidet sich das deutlich von dem was TO hier machen will ..

@TO
ok .. ich versuch es mal noch anders zu erklären
du willst also windows-dienste mit java übers netzwerk steuern ... soweit korrekt ?
gut ... dann hier folgende lösung : du schreibst dir 2 teile deiner software ... einen master und einen client ...

der master hat die aufgabe sich zu den einzelnen clienten zu verbinden und diese zu steuern ...

die clienten wiederum sind über wraper laufende system-dienste auf den ziel-systemen und haben damit die rechte andere dienste zu manipulieren ...
ob du nun eine JNI-lib nutzt oder mit "SC" arbeitest ist deine entscheidung (wobei ich persönlich wenn möglich zur jni-lib greifen würde) ...

der ablauf sieht nun so aus : der master verbindet sich über ein eigenes protokoll zum client und fragt bei diesem den status an ...
der client holt sich nun über SC die liste der dienste , arbeitet diese auf und schickt dann die notwendigen infos an den master ...
dieser stellt nun die informationen entsprechend dar und bietet möglichkeiten auf die entsprechenden dienste kontrolle auszuüben ... das kann man z.b. durch einfache buttons machen ...
die listener wären nun so implementiert das diese eine information an den client schicken was dieser tun soll ... im einfachsten fall einfach den service-namen und den neuen status (start, stop, pause, resume) ...
der client verarbeitet diese informationen nun und setzt sie in einem SC-befehl um der dann ausgeführt wird ...
die rückmeldung wird dann wiederum verarbetiet und an den master weitergeleitet ...

das ganze ist für einen erfahrenen entwickler mit den nötigen tools (die es bei google gibt) der sich etwas mit diesem ganzen windows-systemdienst-kram befasst recht einfach und in relativ wenigen zeilen (falls die GUI nicht extrem aufwending werden soll) umsetzbar ...


aber wie gesagt : an sich widerspricht das ganze irgendwie dem sinn von java ... denn windows hat selbst eingebaute mittel mit denen sowas umsetzbar ist ... also sollte man eigentlich auch diese nutze ... (und wenns dann um logging in ne datenbank geht ... naja muss man sich mal n bissl mit der win-api befassen) ...


grundsätzlich ist es mit java möglich ... ja ... aber es ist irgendwie nicht die feine englische art ... und sollte lieber mit windows-eigenen mitteln gemacht werden


----------

