You need to enable JavaScript to run this app. 如何插入特定U盘触发Windows服务,含sc.exe配置及Topshelf C#实现
优惠活动
大模型
产品
解决方案
定价
更多

如何插入特定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 04:57:03