如何插入特定U盘触发Windows服务,含sc.exe配置及Topshelf C#实现
实现插入指定U盘触发Windows服务的两种方案
方案1:通过sc.exe配置系统级服务触发事件
USB存储设备插入对应的触发事件需要使用类GUID + 设备硬件ID的方式配置,具体操作如下:
- 第一步:获取目标U盘的硬件ID
插入目标U盘后打开「设备管理器」->「磁盘驱动器」,找到对应的U盘设备,右键选择「属性」->「详细信息」选项卡,属性下拉选择「硬件ID」,复制格式为USB\VID_xxxx&PID_xxxx的字符串即可。 - 第二步:执行sc命令配置触发规则
通用USB存储设备的类GUID为{53f56307-b6bf-11d0-94f2-00a0c91efb8b},替换以下命令中的参数后执行即可:
示例:服务名为sc triggerinfo 你的服务名称 start/deviceinterface/{53f56307-b6bf-11d0-94f2-00a0c91efb8b} /scandid "你复制的U盘硬件ID"MyUSBDriveService,U盘硬件ID为USB\VID_0781&PID_5575,命令为:sc triggerinfo MyUSBDriveService start/deviceinterface/{53f56307-b6bf-11d0-94f2-00a0c91efb8b} /scandid "USB\VID_0781&PID_5575"
方案2:C# + Topshelf代码中实现监控逻辑
该方案灵活度更高,可自定义更多匹配规则和触发逻辑,实现步骤如下:
- 第一步:安装NuGet依赖
项目中安装System.Management包,用于监听WMI设备事件。 - 第二步:编写服务业务代码
using System; using System.Management; using Topshelf; public class USBDriveMonitorService { // 替换为目标U盘对应的VID、PID,也可新增序列号做更精准匹配 private const string TargetVid = "0781"; private const string TargetPid = "5575"; private ManagementEventWatcher _insertWatcher; public void Start() { // 配置WMI查询,监听2秒内的设备创建事件 var insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'"); _insertWatcher = new ManagementEventWatcher(insertQuery); _insertWatcher.EventArrived += OnUSBDeviceInserted; _insertWatcher.Start(); } private void OnUSBDeviceInserted(object sender, EventArrivedEventArgs e) { var device = (ManagementBaseObject)e.NewEvent["TargetInstance"]; var deviceId = device["DeviceID"]?.ToString(); // 匹配目标U盘 if (!string.IsNullOrEmpty(deviceId) && deviceId.Contains($"VID_{TargetVid}") && deviceId.Contains($"PID_{TargetPid}")) { // 此处编写触发后的业务逻辑 Console.WriteLine($"目标U盘插入,设备ID:{deviceId}"); } } public void Stop() { _insertWatcher?.Stop(); _insertWatcher?.Dispose(); } } - 第三步:编写Topshelf服务注册代码
class Program { static void Main(string[] args) { HostFactory.Run(x => { x.Service<USBDriveMonitorService>(s => { s.ConstructUsing(_ => new USBDriveMonitorService()); s.WhenStarted(service => service.Start()); s.WhenStopped(service => service.Stop()); }); x.RunAsLocalSystem(); x.SetServiceName("USBDriveTriggerService"); x.SetDisplayName("指定U盘触发服务"); x.SetDescription("插入指定U盘时自动执行对应业务"); }); } }
内容的提问来源于stack exchange,提问作者Azuro
相关产品推荐
相关产品推荐

