Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 无法在通过直连VPN连接的计算机上运行Get-WmiObject_Powershell_Wmi_Vpn - Fatal编程技术网

Powershell 无法在通过直连VPN连接的计算机上运行Get-WmiObject

Powershell 无法在通过直连VPN连接的计算机上运行Get-WmiObject,powershell,wmi,vpn,Powershell,Wmi,Vpn,尝试运行上述操作以从机器列表中收集信息时,遇到了两个问题:首先,我可以从直接连接到网络的机器中获取信息,但我们在直连VPN上的机器从get WmiObjectcommand中获取“无法联系RPC服务器”错误;其次,当我知道它们不同时,我得到的结果似乎都是一样的,所以有些地方出了问题。尝试使用CIM cmdlet而不是旧式获取WMIObject。在这种情况下,Get-CimInstance可以直接替代 我猜在不同的网络路径下会出现防火墙问题`Get-WMIObject在Windows PowerS

尝试运行上述操作以从机器列表中收集信息时,遇到了两个问题:首先,我可以从直接连接到网络的机器中获取信息,但我们在直连VPN上的机器从get WmiObjectcommand中获取“无法联系RPC服务器”错误;其次,当我知道它们不同时,我得到的结果似乎都是一样的,所以有些地方出了问题。

尝试使用CIM cmdlet而不是旧式
获取WMIObject
。在这种情况下,
Get-CimInstance
可以直接替代

我猜在不同的网络路径下会出现防火墙问题`Get-WMIObject在Windows PowerShell中已弃用,并已从PowerShell核心中删除

直截了当的例子:

$adminaccount = "DOMAIN\USERNAME"
$PASSWORD = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force
$UNPASSWORD = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD

$Machines = Get-Content -Path "C:\Temp\production computers.txt"

$Result = Foreach ($Machine in $Machines){
New-Object -TypeName PSObject -Property @{
$hardware =  Get-WmiObject Win32_ComputerSystem -ComputerName $Machine -Credential $UNPASSWORD
$os =  Get-WmiObject Win32_OperatingSystem -ComputerName $Machine -Credential $UNPASSWORD
Computer = $Machine
Manufacturer = $hardware.Manufacturer
Model = $hardware.Model
OS = $os.Caption
}| Select-Object Computer,Manufacturer,Model,OS
}

$Result | Export-Csv -Path "C:\Temp\pcsinventory.csv" -NoTypeInformation
我使用较新的
[PSCustomObject]
强制转换更改了一些语法。我还将I WMI查询移出了自定义对象声明。它们不需要在那里,这样就不需要
Select Object
命令。这是因为现在对象中唯一的属性是您无论如何都会选择的属性

即使Cim不能解决这个问题,它也确实是一条路要走。看看哪个会给你一个好的开始

更新以在CIM中使用凭据:

$adminaccount = "DOMAIN\USERNAME"
$PASSWORD     = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force
$UNPASSWORD   = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD
$hwProps      = 'manufacturer','Model'

$Machines = Get-Content -Path "C:\Temp\production computers.txt"

$Result = Foreach ($Machine in $Machines){
    $hw =  Get-CimInstance Win32_ComputerSystem -ComputerName $Machine -Property $hwProps -Credential $UNPASSWORD
    $os =  Get-CimInstance Win32_OperatingSystem -ComputerName $Machine -Credential $UNPASSWORD
    
    [PSCustomObject]@{    
        Computer     = $Machine
        Manufacturer = $hw.Manufacturer
        Model        = $hw.Model
        OS           = $os.Caption
    }
}

$Result | Export-Csv -Path "C:\Temp\pcsinventory.csv" -NoTypeInformation

上述更新使用带有
-Credential
参数的
新CimSession
。然后它指定
-CimSession$CimSession
而不是
-ComputerName…
。在我最初的示例中,凭证被忽略了。注意:使用CIM会话实际上比使用
-ComputerName…
重复命令更有效。后者在引擎盖下创建一个CIM会话,因此每次迭代都会创建并删除一个会话,方法是重用一个会话,这样做的次数会减少…

尝试使用CIM cmdlet,而不是旧式
Get WMIObject
。在这种情况下,
Get-CimInstance
可以直接替代

我猜在不同的网络路径下会出现防火墙问题`Get-WMIObject在Windows PowerShell中已弃用,并已从PowerShell核心中删除

直截了当的例子:

$adminaccount = "DOMAIN\USERNAME"
$PASSWORD = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force
$UNPASSWORD = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD

$Machines = Get-Content -Path "C:\Temp\production computers.txt"

$Result = Foreach ($Machine in $Machines){
New-Object -TypeName PSObject -Property @{
$hardware =  Get-WmiObject Win32_ComputerSystem -ComputerName $Machine -Credential $UNPASSWORD
$os =  Get-WmiObject Win32_OperatingSystem -ComputerName $Machine -Credential $UNPASSWORD
Computer = $Machine
Manufacturer = $hardware.Manufacturer
Model = $hardware.Model
OS = $os.Caption
}| Select-Object Computer,Manufacturer,Model,OS
}

$Result | Export-Csv -Path "C:\Temp\pcsinventory.csv" -NoTypeInformation
我使用较新的
[PSCustomObject]
强制转换更改了一些语法。我还将I WMI查询移出了自定义对象声明。它们不需要在那里,这样就不需要
Select Object
命令。这是因为现在对象中唯一的属性是您无论如何都会选择的属性

即使Cim不能解决这个问题,它也确实是一条路要走。看看哪个会给你一个好的开始

更新以在CIM中使用凭据:

$adminaccount = "DOMAIN\USERNAME"
$PASSWORD     = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force
$UNPASSWORD   = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD
$hwProps      = 'manufacturer','Model'

$Machines = Get-Content -Path "C:\Temp\production computers.txt"

$Result = Foreach ($Machine in $Machines){
    $hw =  Get-CimInstance Win32_ComputerSystem -ComputerName $Machine -Property $hwProps -Credential $UNPASSWORD
    $os =  Get-CimInstance Win32_OperatingSystem -ComputerName $Machine -Credential $UNPASSWORD
    
    [PSCustomObject]@{    
        Computer     = $Machine
        Manufacturer = $hw.Manufacturer
        Model        = $hw.Model
        OS           = $os.Caption
    }
}

$Result | Export-Csv -Path "C:\Temp\pcsinventory.csv" -NoTypeInformation

上述更新使用带有
-Credential
参数的
新CimSession
。然后它指定
-CimSession$CimSession
而不是
-ComputerName…
。在我最初的示例中,凭证被忽略了。注意:使用CIM会话实际上比使用
-ComputerName…
重复命令更有效。后者会在引擎盖下创建一个CIM会话,因此每次迭代都会创建并删除一个会话,通过重用会话,您可以减少会话的次数…

如果网络路径不同,是否会出现FW问题?您应该尝试
获取CimInstance
,而不是
获取WmiObject
。后者已被弃用,并从最新版本的PoSh中删除。其中一个原因是底层DCOM/RPC协议对FW不友好。考虑到不同的网络路径,是否可能存在FW问题?您应该尝试
获取CimInstance
,而不是
获取WmiObject
。后者已被弃用,并从最新版本的PoSh中删除。其中一个原因是底层DCOM/RPC协议对FW不友好。类
Win32\u ComputerSystem
Get CIMInstance
存在已知问题-它在该类中返回的内容之一是OEM徽标的位图,这会导致
getcimpinstance
失败,而
getwmioobject
没有失败。唯一的解决方法是在调用
Get cimpinstance
时指定您感兴趣的特定对象属性。我没有意识到这一点,谢谢您的提醒。本地OEMLogoBitmap不会为我返回。缩小返回属性的范围没有什么害处。我对样本进行了编辑。当然,这样做的另一个好处是返回的数据应该更小,性能应该会略有提高。正因为如此,语法清理似乎已经解决了我得到的重复结果,然而,我似乎根本无法让
getcimpinstance
工作,即使在
getwmiobject
以前工作过的机器上也是如此。一个明显的错误是
Get-cimpinstance
不接受-Credentials开关。我会一直用CIM堵住插头,直到有东西粘住为止!对不起,我错过了信用卡。我添加了第二个示例和附加注释,以帮助您克服这个问题。让我知道它是如何运行的。好吧,最新的更新是,我有了
新的CimSession
,当我从一台机器到一个域控制器进行操作时,它可以工作并获取信息,但我无法让它以另一种方式连接回来。这肯定是某种形式的防火墙欺骗,尽管我们确实通过GP打开了域防火墙!类
Win32\u ComputerSystem
Get-CIMInstance
存在已知问题-它在该类中返回的内容之一是OEM徽标的位图,这会导致
Get-CIMInstance
Get-WMIObject
没有的情况下失败。唯一的解决方法是在调用
Get cimpinstance
时指定您感兴趣的特定对象属性。我没有意识到这一点,谢谢您的提醒。本地OEMLogoBitmap不会为我返回。缩小返回道具的范围没有什么害处