运行 Win32_ScheduledJob returns 上的 WMI 查询没有结果

Running WMI query on Win32_ScheduledJob returns no results

我正在尝试使用 WMI 查询远程计算机以获取其计划任务(特别是两个),但查询 returns 没有任何结果。我已尝试 运行 将它与我的本地计算机连接,但它仍然 returns 没有结果。但是如果我查询 Win32_LogicalDisk 它 returns 3 个结果。对我来说,WMI 正在本地工作,它只是 returns 与计划作业无关。我觉得这很奇怪,因为当我从命令提示符 运行 schtasks 返回大约 25 个任务(可能更多)时,下面的代码没什么特别的。我已经注释掉了我尝试过的东西,现在它在我的本地机器上设置为 运行。

public Win32_ScheduledJob QueryTask(string systemName, string p2)
{
    var job = new Win32_ScheduledJob();
    var connectionOptions = new ConnectionOptions()
    {
        Impersonation = ImpersonationLevel.Impersonate
    };
    var computer = string.Format(@"\{0}\root\CIMV2", systemName);
    //var scope = new ManagementScope(computer);
    //scope.Connect();
    //var str = "SELECT * FROM Win32_LogicalDisk";
    var str = "SELECT * FROM Win32_ScheduledJob";
    var query = new ManagementObjectSearcher(str);
    var tasks = query.Get();
    //TODO search for Name==p2 and set its elements to job
    var count = tasks.Count;
    tasks.Dispose();
    return job;
}

知道为什么我没有得到结果吗?哦,我忘了说我曾经使用过 query.Get(???ManagementOO???) 并订阅了 4 个事件,它调用完成时状态为 NoError 但从未调用 Progress、ObjectReady 或 ObjectPut。

Win32_ScheduledJob class 在内部使用 AT 协议,该协议 将弃用 Windows 8Windows 服务器 2012。作为第一步,AT 协议默认被禁用。如果协议被禁用,例如在 Win32_ScheduledJob 对象上调用 Create 方法将失败并出现错误 0x8。您可以通过添加以下注册表项重新打开 AT 协议:

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\Configuration 
Name: EnableAt 
Type: REG_DWORD
Value: 1

您可能需要重启机器才能使设置生效。

Resource: Win32_ScheduledJob class

Tried it with no success... Even after restart...

仅供参考:

==>schtasks|find /C "TaskName"
59

将命名空间从 /root/cimv2 更改为 /Root/Microsoft/Windows/TaskScheduler,将其从 SELECT * FROM Win32_ScheduledJob 更改为 SELECT * FROM MSFT_ScheduledTask。 在 object/class MSFT_ScheduledTask 中选择你喜欢的项目 TaskName

vba/vbs中的一个示例:

Dim objItems As Object
Dim objItem As Object

Const wbemFlagReturnImmediately = &H10
Const wbemFlagForwardOnly = &H20

Set objItems = GetObject("winmgmts:{impersonationLevel=impersonate}!\" & strComputer & "\Root\Microsoft\Windows\TaskScheduler").ExecQuery("" & _
"SELECT * FROM MSFT_ScheduledTask", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each objItem In objItems
    Debug.Print objItem.TaskName
Next

提示: 如果您在 Powershell 中执行 Get-ScheduledTasks,您会看到我在上面使用的 CimClass。您可以将此知识转移到您知道 CimClass 和对象的其他情况。