2016-11-16 132 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