2016-11-16 134 views
2

我有一個按鈕,允許用戶瀏覽一個文件,然後存儲路徑+文件名中的一個變量:從Windows窗體應用程序安裝服務

openFileDialog1.ShowDialog(); 
string filePath = openFileDialog1.FileName; 

瀏覽的.exe文件後,我想安裝服務。

目前我們使用installutil作爲管理員運行bat。它也可以通過管理員命令提示符使用sc create來完成。

從Windows窗體安裝服務的最簡單方法是什麼?

我可以創建這樣一個字符串:

sc create "servicename" binpath="filepath" 

,並從程序運行呢?

我在想的另一個選擇是讓程序創建一個蝙蝠並以管理員身份運行它?

+2

看看[Process.Start()](https://msdn.microsoft.com/en-us/library/h6ak8zt5(v = vs.110).aspx)。 – itsme86

回答

2

您可以使用下面的代碼安裝一個服務:

注意:您將需要添加一個引用System.ServiceProcess

public static void InstallService(string serviceName, Assembly assembly) 
{ 
    if (IsServiceInstalled(serviceName)) 
    { 
     return; 
    } 

    using (AssemblyInstaller installer = GetInstaller(assembly)) 
    { 
     IDictionary state = new Hashtable(); 
     try 
     { 
      installer.Install(state); 
      installer.Commit(state); 
     } 
     catch 
     { 
      try 
      { 
       installer.Rollback(state); 
      } 
      catch { } 
      throw; 
     } 
    } 
} 

public static bool IsServiceInstalled(string serviceName) 
{ 
    using (ServiceController controller = new ServiceController(serviceName)) 
    { 
     try 
     { 
      ServiceControllerStatus status = controller.Status; 
     } 
     catch 
     { 
      return false; 
     } 

     return true; 
    } 
} 

private static AssemblyInstaller GetInstaller(Assembly assembly) 
{ 
    AssemblyInstaller installer = new AssemblyInstaller(assembly, null); 
    installer.UseNewContext = true; 

    return installer; 
} 

你只需要調用它像:

Assembly assembly = Assembly.LoadFrom(filePath); 
InstallService("name", assembly); 
+0

我得到它的工作。出現以下錯誤。 'Configs.exe'中出現'System.InvalidOperationException'類型的未處理異常。 – TiraULTI

+0

@TiraULTI是以admin身份運行的應用程序嗎? – TheLethalCoder

+0

以管理員身份運行你的意思是打開它作爲管理員?如果是這樣,然後是的 – TiraULTI

0

您可以使用Process.Start

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
startInfo.FileName = "cmd.exe"; 
startInfo.Arguments = String.Format(@"sc create \"servicename\" \"{0}\"", filepath); 
startInfo.Verb = "runas"; 
process.StartInfo = startInfo; 
process.Start(); 

startInfo.Verb = "runas";使進程能夠以管理員權限啓動。

+0

您確定此部分? String.Format(@「sc create \」servicename \「\」{0} \「」,filepath); 我不明白tu把名字放在哪裏。 – TiraULTI

+0

@TiraULTI那麼這就是你傳遞的安裝服務的命令,以便在你想要的地方使用任何你想使用的命令,例如在你說'sc create'servicename「binpath =」filepath「的問題中,所以你可以把'startInfo.Arguments ',顯然使用了正確的servicename和文件路徑集。 – TheLethalCoder

+0

'startInfo.Arguments = String.Format(@「sc create'name12'binpath ='」+ filePath +「'」);' 現在編譯它,當我搜索exe並選擇它時,它唯一的作用是打開cmd。 – TiraULTI