代码之家  ›  专栏  ›  技术社区  ›  lashing

Get WmiObject在foreach循环中运行不正常

  •  -2
  • lashing  · 技术社区  · 7 年前

    我目前正在尝试编写一个脚本,该脚本获取加入我们域的计算机列表,一次遍历一台,检查它们是否存在于我创建的Access DB中,对它们运行WMI查询,收集它们的系统信息,如果它们不在DB中,则将这些数据添加到DB中。我可以在大多数计算机上成功地做到这一点(大约一半),但其中一些计算机说没有找到RPC服务器。

    我知道其中一些错误是由于计算机处于脱机状态(防火墙被禁用,WMI查询被启用)。问题是有些电脑是在线的,当我运行 Get-WmiObject

    第二个问题是,在第一次迭代之后,我得到了下面的错误,即blank CompName 领域前两个迭代按预期工作,然后它只是抛出了一堆这些错误,与“计算机已经存在后”。

    Snippet of Error

    function Update-Systems {
        $PSCredential = Get-Credential
        $Comp = (Get-ADComputer -Filter * | select -ExpandProperty Name)
    
        foreach ($Computer in $Comp) {
            $RecordSet.MoveFirst()
            $RecordSet.Find("CompName = '$Computer'")
            $RecordCheck = $RecordSet.Fields.Item("CompName").Value
    
            if (!$RecordCheck) {
                "Collecting Data for $Record"
                $SystemProp = Get-WmiObject -Class Win32_ComputerSystem -Credential $PSCredential -ComputerName: $Computer -ErrorAction SilentlyContinue 
                $RecordSet.Addnew()
                $RecordSet.Fields.Item("DateRan") = Get-Date
                $RecordSet.Fields.Item("Domain") = $SystemProp.Domain
                $RecordSet.Fields.Item("CompName") = $SystemProp.Name
                $RecordSet.Fields.Item("Model") = $SystemProp.Model
                $RecordSet.Fields.Item("Manufacturer") = $SystemProp.Manufacturer
                $RecordSet.Update()
            } else {
                "Computer already exists"
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Ansgar Wiechers    7 年前

    最有可能 Get-WmiObject 无法从远程计算机查询信息。因为您指示cmdlet在出现错误时继续( -ErrorAction SilentlyContinue $SystemProp 当发生错误时,结果为空 $SystemProp.Name 评估结果为 $null

    您可以通过分配 $Computer 而不是 到记录集,至少作为这样的回退:

    $RecordSet.Fields.Item("CompName") = if (-not $SystemProp) {
        $Computer
    } else {
        $SystemProp.Name
    }
    

    $ErrorActionPreference = 'Stop'
    try {
        $SystemProp = Get-WmiObject -Class Win32_ComputerSystem -Credential $PSCredential -ComputerName $Computer
        $RecordSet.AddNew()
        $RecordSet.Fields.Item("DateRan")      = Get-Date
        $RecordSet.Fields.Item("Domain")       = $SystemProp.Domain
        $RecordSet.Fields.Item("CompName")     = $SystemProp.Name
        $RecordSet.Fields.Item("Model")        = $SystemProp.Model
        $RecordSet.Fields.Item("Manufacturer") = $SystemProp.Manufacturer
    } catch {
        Write-Error $_ -ErrorAction Continue
    }
    

    你也可以 retry 在放弃之前几次。