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

4
我们在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如何实现相同的操作?
1个回答

1

我能想到两种方法:

第二种方法有点混乱,但并不难。PInvoke.net 页面描述了调用方法,并给出了一个可工作的示例:

编辑:受 Rob 评论启发,这里提供一些有关清理问题的说明。我将它们放在此现有答案中,因为它们本身并不是一个好的答案。

请注意,无论您采用什么方法(httpcfg.exe或直接使用HTTP-API),一定要确保在卸载过程中注销URL。
原因是,HTTP.SYS(实际上是内核组件)只有那么多(非分页)可用于管理URL预留的内存。如果您超过了这个限制,可能会出现错误,并且无法注册任何新的URL(请参见http://support.microsoft.com/kb/824033)。
虽然可以通过手动使用httpcfg.exe清理您认为是孤立的注册表(或允许更多的内存-小心!)来“解决”此问题,但如果卸载程序按建议工作,则完全没有必要这样做,而且非常麻烦。

1
提醒一下:不要忘记在卸载程序中撤销操作!=) - Rob
关于您提供的 PInvoke(HttpSetServiceConfiguration)链接,还有一点需要注意。该代码存在内存泄漏错误。在 BindCertificate 方法中,handleHash 变量从未释放使用 GCHandle.Alloc() 分配的内存。请确保调用 GCHandle.Free() - Chris Dargis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接