运行 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 8 和 Windows 服务器 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 和对象的其他情况。
我正在尝试使用 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 8 和 Windows 服务器 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 和对象的其他情况。