【问题标题】:Passing commandline argument after service installation using c#使用c#在服务安装后传递命令行参数
【发布时间】:2011-06-09 05:34:10
【问题描述】:

在 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# windows service installation


    【解决方案1】:

    我可以想到两种方法:

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

    编辑:一些关于清理问题的注释,灵感来自 Rob 的评论。我把它们放在这个现有的答案中,因为他们自己做的不好。

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

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

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

    【讨论】:

    • 请注意 - 不要忘记在卸载程序中撤消该操作! =)
    • 另一个注意 WRT 您为 PInvoke (HttpSetServiceConfiguration) 提供的链接。该代码中存在内存泄漏错误。 BindCertificate 方法中的handleHash 变量永远不会解除分配与GCHandle.Alloc() 一起分配的内存。请务必致电GCHandle.Free()
    猜你喜欢
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2016-03-25
    相关资源
    最近更新 更多