c# - 将 Windows 服务作为依赖项添加到 .Net 应用程序
问题描述
Windows 服务可以指定它依赖于另一个第二服务。当系统将尝试启动(第一个)服务时,它会看到它依赖于第二个并首先启动它(第二个)。
可以为应用程序做同样的事情吗?我希望系统在我的应用程序启动时启动某个服务(如果它尚未启动)。
我不能只从我的应用程序调用它,因为我的应用程序在没有管理员权限的情况下运行,而服务作为本地系统运行。该服务已安装在计算机上。
(我知道我可以让系统自动启动服务。不幸的是,.net Services存在问题。它们只能通过延迟启动可靠地启动,并且我的应用程序需要立即可用。)
解决方案
当您的应用启动时,只需检查服务是否已启动
表示 Windows 服务,并允许您连接到正在运行或已停止的服务、操作它或获取有关它的信息。
一个完全未经测试的例子
// Check whether the service is started.
ServiceController sc = new ServiceController();
sc.ServiceName = "MyAwesomeService";
Console.WriteLine("The MyAwesomeService status is currently set to {0}",
sc.Status.ToString());
if (sc.Status == ServiceControllerStatus.Stopped)
{
// Start the service if the current status is stopped.
Console.WriteLine("Starting MyAwesomeService...");
try
{
// Start the service, and wait until its status is "Running".
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running);
// Display the current service status.
Console.WriteLine("The MyAwesomeService is now set to {0}.",
sc.Status.ToString());
}
catch (InvalidOperationException)
{
Console.WriteLine("Could not start the MyAwesomeService.");
}
}
更新
ServiceController 将使用当前线程的主体来进行注册表和服务控制管理器调用,如果要操作服务,您必须确保将其设置为管理员用户。
您可以模拟用户,或添加更多细粒度权限以让您的使用启动和停止它,或强制您的应用以管理员权限启动
推荐阅读
- android - 如何删除三个电话号码之间的空格和破折号并转换为列表
- javascript - 将数据分成数组中的集合
- sql - 如果至少只有一条记录,我需要找到与供应商编号 (SNo) 相关的所有记录 (Qty) 的平均值
- java - 执行弹簧批处理小任务步骤时出现空指针异常
- html - 如何使用 css 和 html 在按钮上创建波浪?
- javascript - 尝试按街道地址对对象数组进行排序,但排序又回来了,不知道如何调整我的逻辑以正确排序
- postgresql - 无法在 postgresql pgpool 上连接“无效的后端响应。响应没有用“R”回复
- c++ - MQTT C++ 客户端
- c++ - 是否可以直接将依赖于实例的成员函数(方法)从另一个成员函数传递给 STL 的算法?
- php - 通过 PHP 创建一个 WC_Product_Subscription_Variation 并设置所需的帖子元(周期和周期间隔)