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


  • Mod

    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


  • Mod

    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?


Anmelden zum Antworten