Kontrollieren, ob Dienst aktiviert ist



  • allo,

    ich möchte von meinem Programm aus kontrollieren, ob der Dienst "Smartcard" (scardsvr.exe) gestartet ist. Wenn nicht, soll nur eine Meldung kommen.

    Ich hab die Beispiele aus der MSDN genommen. Bei OpenService() kommt aber immer der Fehler 1060 ERROR_SERVICE_DOES_NOT_EXIST.
    Ich hab als Service Name jeweils den Namen "Smartcard" und "scardsvr.exe" probiert.

    Was hab ich denn falsch gemacht? (Dienst ist gestartet)

    Hier der Code..

    //TCHAR szSvcName[]=_T("scardsvr.exe");
    	TCHAR szSvcName[]=_T("Smardcard");
    	char error[100];
    	SC_HANDLE schSCManager;
    	SC_HANDLE schService;
    	bool ret=false;
    	 SERVICE_STATUS_PROCESS ssp;
        DWORD dwStartTime = GetTickCount();
        DWORD dwBytesNeeded;
        DWORD dwTimeout = 30000; // 30-second time-out
    
        // Get a handle to the SCM database. 
    
        schSCManager = OpenSCManager( 
            NULL,                    // local computer
            NULL,                    // ServicesActive database 
            SC_MANAGER_ALL_ACCESS);  // full access rights 
    
        if (NULL == schSCManager) 
        {
            printf("OpenSCManager failed (%d)\n", GetLastError());
            ret = false;
        }
    
        // Get a handle to the service.
    
        schService = OpenService( 
            schSCManager,         // SCM database 
            szSvcName,            // name of service 
            /*SERVICE_STOP | 
            SERVICE_QUERY_STATUS | 
            SERVICE_ENUMERATE_DEPENDENTS*/
    		SC_MANAGER_ENUMERATE_SERVICE);  
    
        if (schService == NULL)
        {		//1060: ERROR_SERVICE_DOES_NOT_EXIST
            sprintf(error, "OpenService failed (%d)\n", GetLastError()); 
            CloseServiceHandle(schSCManager);
            ret = false;
        }    
    
    	 if ( !QueryServiceStatusEx( 
                schService, 
                SC_STATUS_PROCESS_INFO,
                (LPBYTE)&ssp, 
                sizeof(SERVICE_STATUS_PROCESS),
                &dwBytesNeeded ) )
        {
            printf("QueryServiceStatusEx failed (%d)\n", GetLastError()); 
            goto stop_cleanup;
        }
    
        if ( ssp.dwCurrentState == SERVICE_RUNNING )
        {
            printf("Service is running.\n");
            ret= true;
        }
    	stop_cleanup:
    
    	CloseServiceHandle(schService); 
    	CloseServiceHandle(schSCManager);
    	return ret;
    }
    

    Micha


  • Mod

    Dann stimmt wohl der Servivename nicht.
    Es gehtum den internen Namen, nicht den benutzerfreundlichen Namen.

    Schau mal unter
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services
    nach ob der dort wirlich drin ist.



  • Martin, vielen dank.
    der Name ist "SCardSvr". jetzt funktioniert es

    Micha


Anmelden zum Antworten