我目前正在尝试在 WMI 中注册一个任务,以便在插入 USB 时运行脚本。为了进行测试,我编写了以下 .mof 文件(主要取自这里):
#PRAGMA NAMESPACE ("\\\\.\\root\\subscription")
instance of CommandLineEventConsumer as $Cons
{
Name = "USB_Test";
CommandLineTemplate = "C:\\Windows\\System32\\cmd.exe echo Hello, World! > testfile.txt";
ExecutablePath = "C:\\Windows\\System32\\cmd.exe";
WorkingDirectory = "C:\\Projects\\WMI";
};
instance of __EventFilter as $Filt
{
EventNamespace = "\\root\\cimv2";
Name = "USB_Test";
Query = "SELECT * FROM __InstanceCreationEvent Within 5 "
"Where TargetInstance Isa \"Win32_logicaldisk\" ";
QueryLanguage = "WQL";
};
instance of __FilterToConsumerBinding
{
Filter = $Filt;
Consumer = $Cons;
};
我们将此文件命名为wmi.mof
。当我运行mofcomp.exe .\wmi.mof
控制台输出时,似乎表明该过程已成功。使用 WMI Explorer,我还可以看到 CommandLineEventConsumer、__EventFilter 和 __FilterToConsumerBinding。但是,我还会在 Windows 事件日志中看到以下条目:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="Microsoft-Windows-WMI" Guid="{1edeee53-0afe-4609-b846-d8c0b2075b1f}" />
<EventID>10</EventID>
<Version>2</Version>
<Level>2</Level>
<Task>0</Task>
<Opcode>0</Opcode>
<Keywords>0x8000000000000000</Keywords>
<TimeCreated SystemTime="2022-05-19T07:28:11.5064243Z" />
<EventRecordID>108835</EventRecordID>
<Correlation ActivityID="{1a9c5853-650d-0006-43bb-9c1a0d65d801}" />
<Execution ProcessID="7752" ThreadID="10424" />
<Channel>Application</Channel>
<Computer>DESKTOP-GS3OHBK</Computer>
<Security UserID="S-1-5-18" />
</System>
- <UserData>
- <data_0x8000003F xmlns="http://manifests.microsoft.com/win/2006/windows/WMI">
<Query>//.//root/cimv2</Query>
<Namespace>SELECT * FROM __InstanceCreationEvent Within 5 Where TargetInstance Isa "Win32_logicaldisk"</Namespace>
<Error>0x80041010</Error>
</data_0x8000003F>
</UserData>
</Event>
我立即注意到的一件事是事件中Query
和是如何Namespace
切换的。它们在 .mof 文件中是正确的,当我使用 WMI Explorer 检查 __EventFilter 时也是如此。
尝试通过插入 USB 棒来触发事件不会产生任何结果。既没有创建 textfile.txt,也没有在 Windows 事件日志中看到任何错误。就像任务存在于 WMI 中,但没有执行任何操作一样。
这是我第一次尝试使用 WMI,所以很可能我在某个地方犯了一个初学者错误。到目前为止,我在谷歌上搜索这个问题都没有成功,所以我在这里创建了这个问题。
我想了解导致错误的原因,修复错误并使我的 WMI 任务正常运行。
编辑:为了便于理解,我还尝试通过 powershell 脚本注册 WMI 任务,但出现了同样的错误。因此,我认为这不是我的 .mof 文件的问题,而是 WMI 的问题(?)。