C# 在安装SC.exe后,无法使用WPF App创建带有SC.exe的windows服务#

C# 在安装SC.exe后,无法使用WPF App创建带有SC.exe的windows服务#,c#,wpf,.net-core,windows-services,.net-core-service-worker,C#,Wpf,.net Core,Windows Services,.net Core Service Worker,我创建了一个WPF桌面应用程序和一个Worker服务(所有.NET 6.0预览版3),使用Microsoft Visual Studio安装程序项目扩展将它们打包到一个.MSI安装文件中,该扩展将WPF应用程序安装在计算机上 虽然应用程序安装和运行正常,但我必须以某种方式实现服务安装,该安装应在安装WPF应用程序之后运行。我为此创建了一个函数,它以管理员身份运行sc.exe,并使用Process.Start()安装服务,如下所示: private static void InstallServi

我创建了一个WPF桌面应用程序和一个Worker服务(所有.NET 6.0预览版3),使用Microsoft Visual Studio安装程序项目扩展将它们打包到一个.MSI安装文件中,该扩展将WPF应用程序安装在计算机上

虽然应用程序安装和运行正常,但我必须以某种方式实现服务安装,该安装应在安装WPF应用程序之后运行。我为此创建了一个函数,它以管理员身份运行sc.exe,并使用
Process.Start()
安装服务,如下所示:

private static void InstallService()
{
      const string ServiceName = "SomeService";
      var path = Path.GetFullPath(@".\SomeService.exe");

      var psi = new ProcessStartInfo
      {
         FileName = @"C:\Windows\system32\sc.exe",
         Arguments = $"create { ServiceName } binPath= { path } start= auto",
         Verb = "runas",
         UseShellExecute = true,
      };

      try
      {
         Process.Start(psi);
      }
      catch (Exception ex)
      {
         MessageBox.Show($"Installation has failed: { ex.Message + ex.StackTrace }");
      }
}
此函数的问题在于,当应用程序在Visual Studio中运行时,以及从Visual Studio创建的'bin\Release'文件夹运行时,它会正确执行。然后安装该服务并可以启动。但是,当使用.MSI包安装程序时,服务不会安装,并且不会显示任何
消息框
,这表明不会引发异常

我尝试过的:

// the path parameter is wrapped in double quotes and will be fully read

Arguments = $"create { ServiceName } binPath= \"{ path }\" start= auto"
  • 执行该功能时,将显示UAC提示,然后 过程开始。我试着以同样的方式运行整个应用程序 管理员,但这并没有解决问题

  • 我还尝试将“bin\Release”目录中的所有文件复制到安装应用程序的目录中,并将每个文件替换为“bin\Release”目录中的文件,这样两个目录应该是相同的,但这也不能解决问题

执行安装功能后,服务应启动另一个启动功能:

private static void RunService()
{
      const string ServiceName = "SomeService";

      var psi = new ProcessStartInfo
      {
           FileName = @"C:\Windows\system32\sc.exe",
           Arguments = $"start { ServiceName }",
           Verb = "runas",
           UseShellExecute = true,
      };

      try
      {
           Process.Start(psi);
      }
      catch (Exception ex)
      {
           MessageBox.Show($"Running was not approved or failed: { ex.Message }");
      }
}
但是,此功能在这两种情况下都能正常运行,尽管显然只有在以前安装了服务时才能正常运行,而这在.MSI安装的应用程序中是无法实现的。至于使用
Process.Start()
而不是
ServiceController
类,应用程序默认情况下不应以管理员身份运行,而且使用
ServiceController
是不可能的,所以我使用了
Process.Start()
动词=“runas”
以管理员身份运行流程,仅在需要时显示UAC提示(仅在服务尚未运行时启动服务)


是否有办法解决此问题并在安装了.MSI的WPF应用程序中安装辅助服务?

当我进一步分析所有可能的因素时,我终于注意到了导致此问题的原因

通常,VisualStudio生成的路径没有任何空格,因此它们可以作为命令参数写入,而不需要双引号。在我的例子中,包含项目文件的路径也没有任何空格,这导致没有双引号的命令正常执行。但是,安装路径中确实包含空格,因为它的设计更加方便用户,这导致这段代码无法按预期执行:

// the path parameter in the command will end when there will be a space somewhere in the path

Arguments = $"create { ServiceName } binPath= { path } start= auto"
path
变量只包含完整的路径,它没有用双引号括起来

为了防止该问题,必须使用双引号,包括
\
符号会通知编译器这些双引号是字符串的一部分:

// the path parameter is wrapped in double quotes and will be fully read

Arguments = $"create { ServiceName } binPath= \"{ path }\" start= auto"

当路径完全写入代码时,很容易注意到缺少的双引号。但是,当使用字符串插值时,可能会导致问题,就像我的情况一样。

在MSI安装后第一次启动应用程序时,您不能安装服务吗?@mm8我不能使用WPF应用程序安装它,这是我正在寻找的-它不会引发任何异常,但是在install函数执行之后,什么也没有发生。但是,当从“bin/release/”在应用程序中调试/时执行该命令时,将安装该服务。我可以在不使用应用程序(带有命令提示符)的情况下安装该服务,尽管这不是我想要的,因为我想在不同的机器上/为不同的人安装该应用程序。