2016-11-16 2 views
2

У меня есть кнопка, которая позволяет пользователю просматривать файл, а затем хранит путь + имя файла в переменную:Установка службы из окна формы приложения

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

После просмотра для EXE-файл, я хочу установить обслуживание.

В настоящее время мы запускаем летучую мышь как администратор, используя installutil. Это можно сделать также с помощью 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

Я получил его для работы. Появляется следующая ошибка. 'Необработанное исключение типа' System.InvalidOperationException 'произошло в Configs.exe' – TiraULTI

+0

@TiraULTI - это приложение, работающее как admin? – TheLethalCoder

+0

, управляя как admin, вы имеете в виду открыть его как администратора? Если да, то да – 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} \ "", путь к файлу); Я не понимаю, где tu положил имя. – TiraULTI

+0

@TiraULTI хорошо, это команда, которую вы передаете для установки службы, поэтому используйте то, что вы там хотите, например, в вопросе, который вы сказали «sc create» servicename «binpath =» filepath », чтобы вы могли передать это как« startInfo.Arguments ', очевидно, с правильным набором servicename и filepath. – TheLethalCoder

+0

'startInfo.Arguments = String.Format (@" sc create 'name12' binpath = '"+ filePath +"' ");' Теперь его компиляция, когда я ищу exe и выбираю его, единственное, что он делает заключается в том, чтобы открыть cmd. – TiraULTI

Смежные вопросы