2012-03-03 27 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 2012-03-03 16:42:40

回答

2

調用OpenSCManagerSC_MANAGER_CREATE_SERVICE標誌需要管理員訪問權限。

MSDN

具有管理員權限僅處理能夠打開的句柄 到可以通過到createService和 LockServiceDatabase功能使用的單片機。

如果你仔細想想,你需要管理員權限才能安裝新的服務。

+0

停止並啓動還需要管理員? – Feor 2012-03-03 17:02:25

+0

@Feor不,你不需要管理員權限 – Cocowalla 2012-03-03 17:03:40

+0

非常感謝!你給了一個詳盡的答案! – Feor 2012-03-03 17:04:45

0

我不知道你是如何安裝你的應用程序。標準的方法是當時使用MSI文件並安裝服務。您也可以查看這個CodeProject article,其中討論了沒有MSI服務安裝。

+0

謝謝您的回覆!並告訴我,我可以輕鬆停止並啓動服務?如果我通過MSI安裝?我的計劃是定期打開和關閉服務。 – Feor 2012-03-03 17:03:53