如何以编程方式启用 Net.Tcp 端口共享服务?
我希望在 C# 中以编程方式启用和启动 Net.Tcp 端口共享服务。我可以使用 ServiceController 类轻松启动服务。但是,如何启用默认情况下禁用的服务呢?
我在网上找到了一个建议,将以下注册表项设置为 2,如下所示,这应该将服务启动类型设置为自动:
string path = "SYSTEM\\CurrentControlSet\\Services\\" + serviceName;
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(path, true)) {
key.SetValue("Start", 2);
}
我尝试了此操作,虽然它似乎确实将启动类型更改为自动,但一定还有更多内容,如该服务现在无法启动(以编程方式或手动方式)。我必须通过 services.msc 手动重置启动类型以重置内容,以便可以启用并再次启动该服务。
有人解决这个问题了吗?
I would lke to programmatically enable and start the Net.Tcp Port Sharing Service in C#. I can easily start the service using the ServiceController class. However, how do I enable the service, which is disabled by default?
I found one recommendation online to set the following registry key to 2 as follows, which supposedly sets the service startup type to Automatic:
string path = "SYSTEM\\CurrentControlSet\\Services\\" + serviceName;
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(path, true)) {
key.SetValue("Start", 2);
}
I tried this and while it did appear to change the startup type to Automatic, there must be more to it, as the service would not now start up (programmatically or manually). I had to reset the startup type manually through the services.msc to reset things, so that the service could be enabled and started up again.
Has anyone solved this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
有不止一种方法可以做到这一点,具体取决于您想要的解决方案的“纯粹”程度。这里有一些选项。 请注意,所有这些解决方案都需要管理权限,并且必须在提升的进程中运行。
通过 C# 使用命令提示符
这将涉及到
sc.exe
并更改启动通过命令行参数指定服务类型。这与您上面提到的解决方案类似,只是不需要进行注册表黑客攻击。使用 WMI
这需要 System.Management.dll 的程序集引用。在这里,我们将使用 WMI 功能来
ChangeStartMode
服务。使用 P/Invoke 到 Win32 API
对于某些人来说,这是最“纯粹”的方法,尽管正确执行起来比较困难。基本上,您需要从 .网。但是,这要求您首先调用 OpenService指定的服务并且需要调用事先打开 OpenSCManager (并且不要忘记 CloseServiceHandle 完成后!)。
注意:此代码仅用于演示目的。它不包含任何错误处理,可能会泄漏资源。正确的实现应使用
SafeHandle
类型来确保正确的清理,并应添加适当的错误检查。There is more than one way to do this, depending on how "pure" of a solution you want. Here are some options. Note that all of these solutions require administrative rights and must run in an elevated process.
Use the command prompt via C#
This will involve shelling out to
sc.exe
and changing the startup type of the service via command line arguments. This is similar to the solution you mention above except there is no registry hacking required.Use WMI
This requires an assembly reference for
System.Management.dll
. Here we will use WMI functionality toChangeStartMode
for the service.Use P/Invoke to Win32 APIs
To some people, this is the most "pure" method, although it's more tricky to get right. Basically you'll want to call ChangeServiceConfig from .NET. However, this requires that you first call OpenService for the specified service and that requires calling OpenSCManager beforehand (and don't forget to CloseServiceHandle when you're done!).
Note: This code is for demonstration purposes only. It does not contain any error handling and may leak resources. A proper implementation should use
SafeHandle
types to ensure proper cleanup and should add appropriate error checking.使用 ServiceController 有一个简单的答案
There is a straightforward answer using ServiceController