2014-01-09 3 views
0

У меня есть одна программа с именем MyCustomUpdater.exe, которая загружает zip-файл службы Windows и извлекает его.Как установить службу Windows из C# (настольное приложение)

папка Extract имеет MyWindowsServices.exe файл

Я хочу, чтобы установить эти MyWindowsServices.exe из MyCustomUpdater.exe

Я использую сильфон код упоминания для него

Process process = new Process(); 
process.StartInfo.FileName = "cmd.exe"; 
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
process.StartInfo.RedirectStandardInput = true; 
process.StartInfo.RedirectStandardError = true; 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.Verb = "runas"; 
process.Start(); 

if (process != null) 
{ 
    process.StandardInput.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.Windows) + "\\Microsoft.NET\\Framework\\v4.0.30319\\installutil.exe /u \"" + "E:\Testing\MV.AutoUpdateWindowsService.exe" + "\""); 
    process.StandardInput.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.Windows) + "\\Microsoft.NET\\Framework\\v4.0.30319\\installutil.exe \"" + "E:\Testing\MV.AutoUpdateWindowsService.exe" + "\""); 
    process.StandardInput.Close(); 
} 
process.Close(); 

Но это не будет устанавливать windows service

Этот код просто открывает одно пустое окно командной строки; без дальнейшего исполнения.

Я также пытаюсь запустить команду установки окна службы в

process.StartInfo.Arguments 

Я использую точечную Net Framework 4.5 с визуальной студии 2013


добавить app.manifest файлы для моего MyCustomUpdater.exe после включения app.manifest я установил его. правой кнопкой мыши на программе> Недвижимость> Application> Ресурс> манифеста [Нажмите на ниспадающего] и выберите app.manifest после этого я случайно код

Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.Windows) + @"\Microsoft.NET\Framework\v4.0.30319\installutil.exe", _FilePath); 

Это работает отлично Но для процесса удаления

Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.Windows) + @"\Microsoft.NET\Framework\v4.0.30319\installutil.exe", "/u " + _FilePath); 

или

Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.Windows) + @"\Microsoft.NET\Framework\v4.0.30319\installutil.exe" + " /u ", _FilePath); 

Не работает

Беллоу код app.manifest файла

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app" /> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
     </requestedPrivileges> 
     <applicationRequestMinimum> 
     <PermissionSet Unrestricted="true" ID="Custom" SameSite="site" /> 
     <defaultAssemblyRequest permissionSetReference="Custom" /> 
     </applicationRequestMinimum> 
    </security> 
    </trustInfo> 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
    </application> 
    </compatibility> 
</asmv1:assembly> 

Помоги мне.

Благодаря

+0

Hi. Есть ли причина, по которой вы хотите передать exe в 'cmd.exe', используя стандартный ввод, а не непосредственно выполнить installutil.exe (т. Е. В' StartInfo.FileName')? – Rob

+0

Я добавил 'process.OutputDataReceived + = (s, e) => _ILog.Fatal (@" OutputDataReceived: "+ e.Data);' также, но не может получить выход –

+0

Как это не удается? Есть ли какие-либо подсказки в файле 'InstallUtil.InstallLog'? – Rob

ответ

0

Это кажется немного необычным, чтобы использовать cmd.exe таким образом, когда вы можете просто выполнить свои исполняемые файлы установки непосредственно. Но если вы действительно хотите использовать cmd.exe и перенаправление STDIN. то вам необходимо использовать режим взаимодействия, передав переключатель «/ K».

См. Это answer для более подробной информации.

+0

Я добавляю ** app.manifest ** для запуска приложения в режиме администратора. После этого 'Process.Start' работает для установки. –

0

Вы должны запустить программу, которая пытается вызвать installutil.exe в качестве администратора, а затем запустить installutil.exe напрямую, без помощи cmd. Кроме того, я нахожу PInvoke более стабильным (см. OpenSCManager, CreateService).

0

Это СДЕЛАНО

С помощью app.manifest программы работает в режиме администратора. [Код выше упоминания]

Bellow - это код для установки служб Windows в режиме «тихий».

Process _Process = new Process(); 
_Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
_Process.StartInfo.FileName = Environment.GetFolderPath(Environment.SpecialFolder.Windows) + @"\Microsoft.NET\Framework\v4.0.30319\installutil.exe"; 
_Process.StartInfo.Arguments = "/u \"" + _FilePath + "\""; 
_Process.Start(); 
System.Threading.Thread.Sleep(8000); 
_Process.Close(); 
_Process = new Process(); 
_Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
_Process.StartInfo.FileName = Environment.GetFolderPath(Environment.SpecialFolder.Windows) + @"\Microsoft.NET\Framework\v4.0.30319\installutil.exe"; 
_Process.StartInfo.Arguments = _FilePath; 
_Process.Start(); 
_Process.Close(); 

Спасибо всем.

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