【问题标题】:WMI query in powershell script returns no object when run in a scheduled task在计划任务中运行时,powershell 脚本中的 WMI 查询不返回任何对象
【发布时间】:2015-02-26 20:04:25
【问题描述】:

我有一个成功运行的 powershell 脚本。我已经把它测试死了。将其作为计划任务运行时会出现问题。 WMI 查询不返回任何对象。我已经使用在用于运行计划任务的帐户的上下文下运行的 powershell 控制台进行了测试,并且它也在这些条件下成功运行。仅当作为计划任务运行时,WMI 查询才会失败。

...

Function getMSMQMessageCount($queueName) {
    Add-content $LogFile "Querying $queueName"

    $query = "SELECT MessagesinQueue FROM Win32_PerfRawData_MSMQ_MSMQQueue WHERE Name = '$queueName'"
    try{
        $wmiObject = Get-WmiObject -Query $query
        $wmiObject.MessagesinQueue
    }catch{
        Add-content $LogFile "MSMQ Enumeration error $($_.Exception)" 
    }
}

$messaging = getMSMQMessageCount 'server\\private$\\messaging.application'

用于发出查询的函数中捕获的异常:

System.Management.Automation.RuntimeException: Property 'MessagesinQueue' cannot be found on this object. Make sure that it exists.
   at System.Management.Automation.PropertyReferenceNode.GetValue(PSObject obj, Object property, ExecutionContext context)
   at System.Management.Automation.PropertyReferenceNode.Execute(Array input, Pipe outputPipe, ExecutionContext context)
   at System.Management.Automation.ParseTreeNode.Execute(Array input, Pipe outputPipe, ArrayList& resultList, ExecutionContext context)
   at System.Management.Automation.StatementListNode.ExecuteStatement(ParseTreeNode statement, Array input, Pipe outputPipe, ArrayList& resultList, ExecutionContext context)

【问题讨论】:

  • 样本应该简短而简单。据我所知,你能删除 90% 的不必要的代码吗?这将使我们更容易看到真正的问题,更多的人会尝试帮助您。如果问题出在getMSMQMessageCount 函数内部,那么我们只需要那个函数,调用它的函数和与它一起使用的参数。和例外。就像你提供的那样。 :-)
  • 缩短了代码示例......人们通常要求一切......无法获胜
  • 看起来不错,谢谢。澄清一下:你应该提供所有重要的东西,但尽可能少。这就是规则,stackoverflow.com/help/mcve。 :-) 前任。函数本身是不够的,因为您要传入队列名称值,所以我们也需要它。如果该值是使用不同的函数检索/生成的,我们也需要它。但是,如果在这些步骤之前很久就失败了,我们就不需要所有的导出逻辑、日志记录等。
  • 我应该注意,如果在 SYSTEM 帐户下运行任务,这将毫无问题。

标签: powershell scheduled-tasks wmi


【解决方案1】:

我没有测试您的代码,但听起来它需要管理员权限才能检索数据。

要使用您帐户的管理员权限,您需要选中计划任务常规页面上的Run with highest privileges-复选框。这类似于手动运行时在 UAC 对话框中回答“是”。

【讨论】:

  • 我做到了。我最初是从一个域管理员帐户开始的。本地系统帐户是唯一有效的帐户。我可以尝试将我现在使用的帐户设为本地管理员,但我们正在尝试对运行任务的帐户使用最少的权限。
  • 那么当您尝试使用域管理员帐户时,它有效吗?您是否尝试过“最高权限”复选框?首先获得一个具有本地管理员权限的帐户才能工作(授予本地管理员权限并选中以最高权限运行)。当你有这个工作时,你可以尝试剥夺用户的权利。无论您授予什么权限,如果课程需要提升的访问权限,那么您仍然需要使用复选框绕过 UAC/使用您的提升权限。 SYSTEM 帐户在没有它的情况下也可以工作,因为它不是标准用户帐户,因此不受 UAC 的限制。
猜你喜欢
  • 1970-01-01
  • 2019-05-02
  • 2016-06-19
  • 2013-08-18
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 2015-07-22
  • 2020-08-07
相关资源
最近更新 更多