在使用c#安装服务后传递命令行参数

本文关键字:命令行 参数 服务 安装 | 更新日期: 2023-09-27 17:58:48

我们在Windows 2003的服务上托管WCF时遇到问题。我们找到了一个命令行工具(httpcfg),它帮助我们暂时解决了这个问题。

以下命令行参数需要在服务安装后运行:

httpcfg set urlacl -u http://+:8080/ -a "D:(A;;GX;;;S-1-5-21-490459244-4280451753-3120260354-1829)"

我们需要使用C#通过安装程序传递这个参数

这是通过安装程序事件后的服务控制器。在C#中,使用ServiceController,我该如何做同样的操作?

在使用c#安装服务后传递命令行参数

我可以想到两种方法:

  • 只需使用System.Diagnostics.Process运行httpcfg.exe
  • 使用PInvoke访问底层Win32 API HttpSetServiceConfiguration

第二种方法有点混乱,但没有那么难。PInvoke.net页面描述了这个调用,甚至给出了一个工作示例:

  • PInvoke.net:httpsetserviceconfiguration(httpapi)

编辑:一些受Rob评论启发的关于清理问题的注释。我把它们放在这个现有的答案中,因为它们本身并不是一个好的答案

请注意,无论您采取何种方法(httpcfg.exe或直接使用HTTP-API),请确保在卸载过程中注销URL。

原因是HTTP.SYS(实际上是一个内核组件)只有这么多(非分页)内存可用于管理URL保留。如果超过这个范围,则必须进行许多(可能是过时的/遗留的)注册,这样就会出现错误,并且无法注册任何新的URL(请参阅http://support.microsoft.com/kb/824033)。

虽然手动使用httpcfg.exe来清除您认为(!)是孤立的注册(或允许更多内存-小心!)是"可以解决的",但如果卸载程序按照建议工作,这是一种巨大的痛苦,完全没有必要。