2012-03-03 2 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

OpenSCManagerSC_MANAGER_CREATE_SERVICEフラグを付けると、管理者アクセスが必要です。 MSDNから

のみ管理者権限を持つプロセスは、CreateServiceと LockServiceDatabase機能で使用することができますSCMへのハンドル を開くことができます。

これについて考えると、新しいサービスをインストールするには管理者権限が必要です。

+0

停止と起動には管理者も必要ですか? – Feor

+0

@Feor no、そのための管理者権限は必要ありません – Cocowalla

+0

ありがとうございました!あなたは網羅的な答えを出しました! – Feor

0

アプリケーションのインストール方法がわかりません。標準的な方法は、その時点でMSIファイルを使用してサービスをインストールすることです。このCodeProject articleには、MSIサービスのインストールについては説明していません。

+0

お返事ありがとうございます!そして、私は簡単にサービスを停止して開始することができますか? MSI経由でインストールする場合私のプログラムは定期的にサービスのオン/オフを切り替えます。 – Feor

関連する問題