如何从C#(桌面应用程序)安装Windows服务

时间:2014-01-09 13:08:58

标签: c#-4.0 windows-services installation

我有一个名为MyCustomUpdater.exe的程序,它下载Windows服务zip文件并将其解压缩。

Extract文件夹包含MyWindowsServices.exe文件

我想从MyCustomUpdater.exe安装那些MyWindowsServices.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服务

此代码只需打开一个空白的黑色命令提示符窗口;没有进一步的执行。

我也尝试在

中运行Windows服务安装命令
process.StartInfo.Arguments

我在visual studio 2013中使用dot net framework 4.5


我为MyCustomUpdater.exe添加了app.manifest文件 在包括app.manifest之后我设置了它。 右键单击Program>物业>申请>资源>清单[点击下拉列表] 并选择 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);

不工作

Bellow是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>

帮助我。

由于

3 个答案:

答案 0 :(得分:0)

当您可以直接执行安装可执行文件时,以这种方式使用cmd.exe似乎有点不寻常。但是如果你真的想使用cmd.exe和STDIN重定向。那么你需要通过传递“/ K”开关来使用交互模式。

有关详细信息,请参阅此answer

答案 1 :(得分:0)

您应该运行尝试以管理员身份呼叫installutil.exe的程序,然后直接运行installutil.exe,而无需cmd的帮助。此外,我发现PInvoke更稳定(请参阅OpenSCManagerCreateService)。

答案 2 :(得分: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();

谢谢大家。