2012-03-03 3 views
-1

문제가 있습니다. 컴퓨터에 서비스를 설치해야합니다. 그리고 그것을 실행하십시오. 이 코드는 작동하지만 관리자가 프로그램을 실행할 때 작동합니다. 다음은 내 소스 코드입니다.일반 사용자로 Windows 서비스 설치

namespace SvcInstaller 
{ 
    public class ServiceInstaller 
    { 
     #region Private Variables 
     /* bla bla bla */ 
     #endregion DLLImport 

    #region Main method + testing code 
    [STAThread] 
    public static void Setup() 
    { 
     // TODO: Add code to start application here 
     #region Testing 
     // Testing -------------- 
     string svcPath; 
     string svcName; 
     string svcDispName; 
     //path to the service that you want to install 
     svcPath = "\"" + AppDomain.CurrentDomain.BaseDirectory + "data\\ma.exe\"" + " -service"; 
     svcDispName = "Main Service"; 
     svcName = "srv"; 
     ServiceInstaller c = new ServiceInstaller(); 

     c.InstallService(svcPath, svcName, svcDispName); 

     #endregion Testing 
    } 
    #endregion Main method + testing code - Commented 

    public bool InstallService(string svcPath, string svcName, string svcDispName) 
    { 
     #region Constants declaration. 
     int SC_MANAGER_CREATE_SERVICE = 0x0002; 
     int SERVICE_WIN32_OWN_PROCESS = 0x00000010; 
     //int SERVICE_DEMAND_START = 0x00000003; 
     int SERVICE_ERROR_NORMAL = 0x00000001; 
     int STANDARD_RIGHTS_REQUIRED = 0xF0000; 
     int SERVICE_QUERY_CONFIG = 0x0001; 
     int SERVICE_CHANGE_CONFIG = 0x0002; 
     int SERVICE_QUERY_STATUS = 0x0004; 
     int SERVICE_ENUMERATE_DEPENDENTS = 0x0008; 
     int SERVICE_START = 0x0010; 
     int SERVICE_STOP = 0x0020; 
     int SERVICE_PAUSE_CONTINUE = 0x0040; 
     int SERVICE_INTERROGATE = 0x0080; 
     int SERVICE_USER_DEFINED_CONTROL = 0x0100; 
     int SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | 
     SERVICE_QUERY_CONFIG | 
     SERVICE_CHANGE_CONFIG | 
     SERVICE_QUERY_STATUS | 
     SERVICE_ENUMERATE_DEPENDENTS | 
     SERVICE_START | 
     SERVICE_STOP | 
     SERVICE_PAUSE_CONTINUE | 
     SERVICE_INTERROGATE | 
     SERVICE_USER_DEFINED_CONTROL); 
     // int SERVICE_AUTO_START = 0x00000002; 

     int SERVICE_DEMAND_START = 0x00000003;// с ручной запуск 
     #endregion Constants declaration. 
     try 
     { 
      IntPtr sc_handle = OpenSCManager(null, null, SC_MANAGER_CREATE_SERVICE); 

      if (sc_handle.ToInt32() != 0) 
      { 
       //IntPtr sv_handle = CreateService(sc_handle, svcName, svcDispName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, svcPath, null, 0, null, null, null); 
       string lpDependencies = "Tcpip";// зависимости 
       IntPtr sv_handle = CreateService(sc_handle, svcName, svcDispName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, svcPath, null, 0, lpDependencies, null, null); 

       if (sv_handle.ToInt32() == 0) 
       { 
        CloseServiceHandle(sc_handle); 
        return false; 
       } 
       else 
       { 
        //now trying to start the service 
        int i = StartService(sv_handle, 0, null); 
        // If the value i is zero, then there was an error starting the service. 
        // note: error may arise if the service is already running or some other problem. 
        if (i == 0) 
        { 
         //Console.WriteLine("Couldnt start service"); 
         return false; 
        } 

        CloseServiceHandle(sc_handle); 
        return true; 
       } 
      } 
      else 
       //Console.WriteLine("SCM not opened successfully"); 
       return false; 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
    } 

리턴 코드는 함수에서 0입니다. 문제는 누가 프로그램을 시작했는지 상관없는 서비스를 확립하는 것입니다.

+1

음 ... 무슨 질문입니까? 또한, 코드 품질은 의심 스럽습니다. – Robert

답변

2

SC_MANAGER_CREATE_SERVICE 플래그가있는 OpenSCManager을 호출하려면 관리자 액세스 권한이 필요합니다. MSDN에서

:

만 관리자 권한으로 처리가 CreateService에와 LockServiceDatabase 기능을 사용할 수있는 SCM에 핸들 을 열 수 있습니다.

생각해 보면 새 서비스를 설치하려면 관리자 권한이 필요합니다.

+0

중지 및 시작하려면 관리자가 필요합니까? – Feor

+0

@Feor no, 관리자 권한이 필요 없습니다. – Cocowalla

+0

대단히 감사합니다! 당신은 철저한 대답을했습니다! – Feor

0

응용 프로그램 설치 방법을 잘 모르겠습니다. 표준 방법은 MSI 파일을 사용하고 그 시간에 서비스를 설치하는 것입니다. 또한 CodeProject article에서 MSI 서비스 설치에 대해 다루지 않습니다.

+0

답장을 보내 주셔서 감사합니다! 그리고 나서 서비스를 쉽게 중단하고 시작할 수 있다고 말해주십시오. MSI를 통해 설치한다면? 내 프로그램은 주기적으로 서비스를 켜고 끕니다. – Feor

관련 문제