Service Installieren ok; ist in Computerverwaltung niht gelistet, aber im Taskmanager
-
Hey all,
ich hatte mal einen Service, und brauche jetzt wieder einen, also habe ich auf den alten Code zurückgegriffen und ihn umgeschrieben.
Jetzt steht im Taskmanager mein Eintrag von wegen Dienst und er "läuft" uach, aber in der computerverwaltung ist er nicht gelistet...#include <stdio.h> #include <windows.h> #include <Winsvc.h> #include <stdbool.h> #include <winreg.h> #include "resource.h" #define VERSION "0.00.04" #define svcName "SyDWatch" #define svcDesc "This service looks for the S.M.A.R.T. parameters of your hard disk drive." /*Install the service, * *return -1 = Servicename does allready exist * *return -2 = Access denied * *return -3 = A critical service dependency was detected * *return -4 = Invalid service name * *return -5 = Service allready exist * *return -6 = unknown failure * *return -7 = OpenSCManager has got a failure */ int installMyService( char *head ); int deInstSvc( char *head ); int main( void ) /* Autor: Oliver Lippert Begin: 2007-11-29 2007-11-30 : 2007-12-01 : 2008-04-04 End: ============== Description: This program installs the Service for watching SMART parameters */ { int ret = 0; char *head, eing; writeStringToLog( "Svc-Version\t\t\t", VERSION ); head = malloc( sizeof(char)*100 ); if( NULL == head ) { writeStringToLog( "Cant get memory\t", "for saveing the head." ); ret = -1; } else sprintf( head, "The %s service has detected a Failure:", svcName ); ret = installMyService( head ); if( -1 == ret ) writeStringToLog( "installMyService failed\t", "servicename allready exist" ); else if( -2 == ret ) writeStringToLog( "installMyService failed\t", "access denied" ); else if( -3 == ret ) writeStringToLog( "installMyService failed\t", "critical service dependency" ); else if( -4 == ret ) writeStringToLog( "installMyService failed\t", "invalid servicename" ); else if( -5 == ret ) { writeStringToLog( "installMyService failed\t", "service allready exist" ); fflush( stdin ); printf( "\nWould you like to deinstall the service?<j/n>" ); eing = getch(); while( 'j' != eing && 'n' != eing ) eing = getch(); if( 'j' == eing ) deInstSvc( head ); } else if( -6 == ret ) writeStringToLog( "installMyService failed\t", "unknown Failure" ); writeToLog( "Serviceinstall end with(0=OK)\t" , GetLastError() , 1 ); return ret; } int installMyService( char *head ) //Service wird installiert { char strDir[1024]; int retValue = 0; SC_HANDLE myService, svcManager; LPCTSTR binPath = strDir; svcManager = OpenSCManager( NULL, //Computername to install the Service (NULL ?or ""? = local) NULL, //Database of services (NULL = default) SC_MANAGER_CREATE_SERVICE //access rights ); if(svcManager == NULL) //OpenSCManager fehlgeschlagen { writeToLog( "OpenSCManager got a failure\t", GetLastError(), 0 ); retValue = -7; } else //OpenSCManager erfolgreich, service wird installiert { myService = CreateService( svcManager, //Der Servicemanager (durch OpenSCManager) svcName, //Service-Name svcDesc, //Service-Beschreibung SERVICE_ALL_ACCESS, //Der Service hat Adminrechte SERVICE_WIN32_OWN_PROCESS, //Der Service ist ein Systemprozess SERVICE_DEMAND_START, //Manueller Start SERVICE_ERROR_NORMAL, //Normale Fehlerausgabe "\"C:\\Windows\\System32\\SyD\\SyD_Watch.exe\"", //Binäre Pfadangabe NULL, //Gruppenmitglied von gruppe (zu finden in HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ServiceGroupOrder) NULL, //TagID NULL, //Services die gestartet werden müssen, bevor dieser läuft NULL, //User NULL //Passwort ); if( NULL == myService ) //CreateService ist fehlgeschlagen, fehler werden eventuell speziell behandelt { if( ERROR_DUPLICATE_SERVICE_NAME == GetLastError() ) retValue = -1; //doppelter Servicename else if ( ERROR_ACCESS_DENIED == GetLastError() ) retValue = -2; //zugriff verweigert else if ( ERROR_CIRCULAR_DEPENDENCY == GetLastError() ) retValue = -3; //anzeigename schon vorhanden oder derselbe anzeigename wie ein service-name else if ( ERROR_INVALID_NAME == GetLastError() ) retValue = -4; //fehlerhafter servicename else if ( ERROR_SERVICE_EXISTS == GetLastError() ) retValue = -5; //service schon vorhanden else retValue = -6; writeToLog( "Service installation fail\t", GetLastError(), 0 ); CloseServiceHandle( svcManager ); } else //CreateService war erfolgreich, service wird gesartet { writeStringToLog( "Service installation\t\t", "successfull"); StartService( myService, //Servicehandle 0, //Number of services arguments NULL //Services arguments ); CloseServiceHandle( myService ); CloseServiceHandle( svcManager ); } } return retValue; } int deInstSvc( char *head ) //Service wird deinstalliert { char path[100], name[100], *tmp; int retValue = 0; HKEY key, haupt = HKEY_LOCAL_MACHINE; strcpy( name, svcName ); for( tmp = name; *tmp != '\0'; ++tmp ) *tmp = toupper( *tmp ); SC_HANDLE myService, svcManager; svcManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE ); if(svcManager == NULL) //OpenSCManager fehlgeschlagen { writeToLog( "OpenSCManager has got a failure\t", GetLastError(), 0 ); retValue = -1; } else //OpenSCManager erfolgreich, service wird geöffnet und deinstalliert { myService = OpenService( svcManager, svcName, GENERIC_ALL ); if( NULL != myService ) { if( !DeleteService( myService ) ) //DeleteService erfolgreich { writeStringToLog( "DeleteService\t\t\t", "erfolgreich" ); retValue = 0; } else //DeleteService fehlgeschlagen { writeToLog( "DeleteService\t\t\t", GetLastError(), 0 ); retValue = -3; } } else { writeToLog( "OpenService has got a failure\t", GetLastError(), 0 ); retValue = -2; } } return retValue; }bin ich einfach nur zu dumm um den Fehler zu finden?
Währ cool wenn mal wer rüberschaut(das der Code nicht genial ist, ist mir bekannt

Danke schonmal
Konstruktive Kritik gern gesehen
-
Das ist kein Service! Das Ding erzeugt einen Service. Wenn Dein Programm aber kein Service ist sondern einen normale EXE, dann wird darin das Problem liegen.
-
Sry falsch ausgedrückt, dies ist das "Setup" in der EXE ist eine ServiceMain,
die läuft auch als richtiger Service mit den Funktionen...
Das Problem ist ich habe die EXE des alten Services nicht mehr als C datei, also kann ich keine unterschiede mehr überprüfen
Hat wer einen kleinen Service für ein Bsp? Habe schon im Forum gesucht und anhand der Treffer meinen gebastelt, aber wies aussieht ist da ja irgendwas falsch...
-
guck mal auf www.codeproject.com da sind einige bsp zu diesem thema.
schirrmie
-
lippoliv schrieb:
Hat wer einen kleinen Service für ein Bsp? Habe schon im Forum gesucht und anhand der Treffer meinen gebastelt, aber wies aussieht ist da ja irgendwas falsch...
Du hast im Leben nicht gesucht... dann wärst Du auch auf die unten stehenden Links gestossen! Google mal nach "windows service c++"!
Und wen Du in Codeproject einfach nur nach "Service" suchst springen Dir sofort auf der ersten Seite alle wichtigen Samples ins auge:
http://www.codeproject.com/KB/system/cntservice.aspx
http://www.codeproject.com/KB/system/serviceskeleton.aspx^
http://www.codeproject.com/KB/system/nt_service.aspx
-
Das ist das Problem... C++...
Ich suche ja für C, oder ist diesmal kein unterschied da?
Das ist ja bei codeporjekt das kleine Prob, in C++ gibt es viele Sachen die einem die Arbeit aus C erstparen...[edit]
lippoliv schrieb:
Habe schon im Forum gesucht und anhand der Treffer meinen gebastelt, aber wies aussieht ist da ja irgendwas falsch...
Ich hätte nichts, wenn ich hier nicht was gefunden hätte... Vlt war das auch falsch, ich such nochmal den Post.
-
Windows Ereignisanzeige schrieb:
Vom Windows-Defender-Echtzeitschutz-Agent wurden Änderungen erkannt. Microsoft empfiehlt, die Software, die diese Änderungen vorgenommen hat, zu analysieren, um potenzielle Risiken festzustellen. Sie können anhand der Informationen über die Funktionsweise dieser Programme entscheiden, ob die Software ausgeführt werden kann oder vom Computer entfernt werden soll. Lassen Sie nur Änderungen zu, wenn das Programm oder der Softwareherausgeber vertrauenswürdig ist. Windows-Defender kann Änderungen, die Sie zugelassen haben, nicht mehr rückgängig machen.
Weitere Informationen finden Sie im Folgenden:
Nicht zutreffend
Scan-ID: {901E38D9-350C-4DCE-91CD-EB767F31056E}
Benutzer: ***
Name: Unknown
ID:
Schweregrad-ID:
Kategorie-ID:
Gefundener Pfad: service:SyDWatch;file:C:\Windows\System32\SyD\SyD_Watch.exe
Warnungsart: Nicht klassifizierte Software
Feststellungstyp:So das kommt, wenn ich meinen Service installiere...
3004 == "An AddJob call was not issued."
Liegt das Prob an Vista???
[edit]
int installMyService( char *head ) { char strDir[1024]; int lastErr = 0, retValue; SC_HANDLE myService, svcManager; LPCTSTR binPath = strDir; svcManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE ); if(svcManager != NULL) { myService = CreateService( svcManager, svcName, svcDesc, SERVICE_ALL_ACCESS, //Der Service hat Adminrechte SERVICE_WIN32_OWN_PROCESS, //Der Service ist ein Systemprozess SERVICE_DEMAND_START, //Manueller Start SERVICE_ERROR_NORMAL, //Normale Fehlerausgabe "C:\\Windows\\System32\\SyD\\SyD_Watch.exe", //Binäre Pfadangabe NULL, //Gruppenmitglied von gruppe (zu finden in HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ServiceGroupOrder) NULL, //TagID NULL, //Services die gestartet werden müssen, bevor dieser läuft NULL, //User NULL ); //Passwort if( NULL == myService ) { lastErr = GetLastError(); if( ERROR_DUPLICATE_SERVICE_NAME == lastErr ) retValue = -1; //doppelter Servicename else if ( ERROR_ACCESS_DENIED == lastErr ) retValue = -2; //zugriff verweigert else if ( ERROR_CIRCULAR_DEPENDENCY == lastErr ) retValue = -3; //anzeigename schon vorhanden oder derselbe anzeigename wie ein service-name else if ( ERROR_INVALID_NAME == lastErr ) retValue = -4; //fehlerhafter servicename else if ( ERROR_SERVICE_EXISTS == lastErr ) retValue = -5; //service schon vorhanden else retValue = -6; CloseServiceHandle( svcManager ); } else { MessageBox( NULL, "Installation of the service was successful.\nStart service", "Installation complete", 0); StartService( myService, 0, NULL ); CloseServiceHandle( myService ); CloseServiceHandle( svcManager ); } } else { retValue = -1; MessageBox( NULL, "OpenSCManager has got a failure.", head, 0); } return retValue; }und
int installMyService( char *head ) //Service wird installiert { char strDir[1024]; int retValue = 0; SC_HANDLE myService, svcManager; LPCTSTR binPath = strDir; int lastErr = 0; svcManager = OpenSCManager( NULL, //Computername to install the Service (NULL ?or ""? = local) NULL, //Database of services (NULL = default) SC_MANAGER_CREATE_SERVICE //access rights ); if(svcManager == NULL) //OpenSCManager fehlgeschlagen { writeToLog( "OpenSCManager got a failure\t", GetLastError(), 0 ); retValue = -7; } else //OpenSCManager erfolgreich, service wird installiert { myService = CreateService( svcManager, //Der Servicemanager (durch OpenSCManager) svcName, //Service-Name svcDesc, //Service-Beschreibung SERVICE_ALL_ACCESS, //Der Service hat Adminrechte SERVICE_WIN32_OWN_PROCESS, //Der Service ist ein Systemprozess SERVICE_DEMAND_START, //Manueller Start SERVICE_ERROR_NORMAL, //Normale Fehlerausgabe "C:\\Windows\\System32\\SyD\\SyD_Watch.exe", //Binäre Pfadangabe NULL, //Gruppenmitglied von gruppe (zu finden in HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ServiceGroupOrder) NULL, //TagID NULL, //Services die gestartet werden müssen, bevor dieser läuft NULL, //User NULL //Passwort ); if( NULL == myService ) //CreateService ist fehlgeschlagen, fehler werden eventuell speziell behandelt { lastErr = GetLastError(); if( ERROR_DUPLICATE_SERVICE_NAME == lastErr ) retValue = -1; //doppelter Servicename else if ( ERROR_ACCESS_DENIED == lastErr ) retValue = -2; //zugriff verweigert else if ( ERROR_CIRCULAR_DEPENDENCY == lastErr ) retValue = -3; //anzeigename schon vorhanden oder derselbe anzeigename wie ein service-name else if ( ERROR_INVALID_NAME == lastErr ) retValue = -4; //fehlerhafter servicename else if ( ERROR_SERVICE_EXISTS == lastErr ) retValue = -5; //service schon vorhanden else retValue = -6; writeToLog( "Service installation fail\t", GetLastError(), 0 ); CloseServiceHandle( svcManager ); } else //CreateService war erfolgreich, service wird gesartet { writeStringToLog( "Service installation\t\t", "successfull"); /*StartService( myService, //Servicehandle 0, //Number of services arguments NULL //Services arguments );*/ CloseServiceHandle( myService ); CloseServiceHandle( svcManager ); } } return retValue; }Ersteres ist eine minimalumschreibung des Original-SVC-Setups.
Sie Funktioniert und überall ist der SErvice eingetragen. Windows erkennt, das es eine Installation von irgendwas ist, und die Datei wird automatisch im Adminmodus (nach aufgefordertem login) ausgeführt,
zweiteres ist eine große umschreibung des Original-SVC-Setups.
Hier wird der Service nur im Taskmanager gelistet...Wo ist da bitte der unterschied??? Das eine heist svcSetup2.exe das andere SyD_Service.exe.... sollte nmich am Namen liegen oder?