c# – 以编程方式启用Windows服务
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 以编程方式启用Windows服务,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3846字,纯文字阅读大概需要6分钟。
内容图文
![c# – 以编程方式启用Windows服务](/upload/InfoBanner/zyjiaocheng/963/0805d6798cba48a49ea8f637a5ca2ead.jpg)
我试图通过修改注册表中的值以编程方式启用Windows服务,如下所示.价值确实在变化.但是,之后我无法启动该服务,因为Windows仍然将其视为已禁用.
public void EnabledTheService(string serviceName)
{
try
{
RegistryKey key = Registry.LocalMachine
.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\"
+ serviceName, true);
key.SetValue("Start", 2);
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
}
public void StartService(string serviceName)
{
ServiceController service = new ServiceController(serviceName);
try
{
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running,
new TimeSpan(0, 0, 0, 20));
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
}
解决方法:
有几种方法可以更改Windows服务的启动类型(请参阅this question).如果我没记错,WMI方法在我测试时工作但不完全可靠,所以我使用了Windows API函数ChangeServiceConfig.我从未尝试过注册表方法.我认为这将是三个选项中最不稳定的.
请注意,如果您想要“自动(延迟启动)”模式,则需要拨打ChangeServiceConfig2.
public void ChangeServiceStartType(string serviceName, ServiceStartupType startType)
{
//Obtain a handle to the service control manager database
IntPtr scmHandle = OpenSCManager(null, null, SC_MANAGER_CONNECT);
if (scmHandle == IntPtr.Zero)
{
throw new Exception("Failed to obtain a handle to the service control manager database.");
}
//Obtain a handle to the specified windows service
IntPtr serviceHandle = OpenService(scmHandle, serviceName, SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG);
if (serviceHandle == IntPtr.Zero)
{
throw new Exception($"Failed to obtain a handle to service '{serviceName}'.");
}
//Change the start mode
bool changeServiceSuccess = ChangeServiceConfig(serviceHandle, SERVICE_NO_CHANGE, (uint)startType, SERVICE_NO_CHANGE, null, null, IntPtr.Zero, null, null, null, null);
if (!changeServiceSuccess)
{
string msg = $"Failed to update service configuration for service '{serviceName}'. ChangeServiceConfig returned error {Marshal.GetLastWin32Error()}.";
throw new Exception(msg);
}
//Clean up
if (scmHandle != IntPtr.Zero)
CloseServiceHandle(scmHandle);
if (serviceHandle != IntPtr.Zero)
CloseServiceHandle(serviceHandle);
}
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, uint dwDesiredAccess);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool ChangeServiceConfig(
IntPtr hService,
uint nServiceType,
uint nStartType,
uint nErrorControl,
string lpBinaryPathName,
string lpLoadOrderGroup,
IntPtr lpdwTagId,
[In] char[] lpDependencies,
string lpServiceStartName,
string lpPassword,
string lpDisplayName);
[DllImport("advapi32.dll", EntryPoint = "CloseServiceHandle")]
private static extern int CloseServiceHandle(IntPtr hSCObject);
private const uint SC_MANAGER_CONNECT = 0x0001;
private const uint SERVICE_QUERY_CONFIG = 0x00000001;
private const uint SERVICE_CHANGE_CONFIG = 0x00000002;
private const uint SERVICE_NO_CHANGE = 0xFFFFFFFF;
public enum ServiceStartupType : uint
{
/// <summary>
/// A device driver started by the system loader. This value is valid only for driver services.
/// </summary>
BootStart = 0,
/// <summary>
/// A device driver started by the IoInitSystem function. This value is valid only for driver services.
/// </summary>
SystemStart = 1,
/// <summary>
/// A service started automatically by the service control manager during system startup.
/// </summary>
Automatic = 2,
/// <summary>
/// A service started by the service control manager when a process calls the StartService function.
/// </summary>
Manual = 3,
/// <summary>
/// A service that cannot be started. Attempts to start the service result in the error code ERROR_SERVICE_DISABLED.
/// </summary>
Disabled = 4
}
内容总结
以上是互联网集市为您收集整理的c# – 以编程方式启用Windows服务全部内容,希望文章能够帮你解决c# – 以编程方式启用Windows服务所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。