$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
머신 목록에서 정보를 수집하기 위해 위를 실행하려고하면 두 가지 문제가 발생했습니다. 첫째로 네트워크에 직접 연결된 머신에서 정보를 다시 가져올 수 있지만 Direct Connect VPN에있는 머신에 "Unable to contact RPC Server"오류가 발생합니다. Get-WmiObject 명령에서; 둘째로, 내가 얻는 결과는 모두 똑같은 것처럼 보입니다. 그들이 다르다는 것을 알았을 때 뭔가 잘못되고 있습니다.
레거시 대신 CIM cmdlet을 사용해보십시오 Get-WMIObject
. 이 경우 Get-CimInstance
직접적인 대체물 이 될 수 있습니다.
다른 네트워크 경로를 고려할 때 방화벽 문제가 있다고 생각합니다. `Get-WMIObject는 Windows PowerShell에서 더 이상 사용되지 않으며 PowerShell Core에서 제거되었습니다.
간단한 예 :
$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
새로운 [PSCustomObject]
캐스팅을 사용하여 약간의 구문을 변경했습니다 . 또한 사용자 지정 개체 선언에서 I WMI 쿼리를 이동했습니다. 그들은 거기에있을 필요가 없으며 그렇게함으로써 Select-Object
명령이 필요하지 않습니다 . 이것은 이제 개체의 유일한 속성이 어쨌든 선택한 속성이기 때문입니다.
Cim이 문제를 해결하지 않더라도 실제로는 갈 길입니다. 좋은 시작을 할 수있는 CIM CMdlet 소개를 살펴보십시오 .
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){
$CimSession = New-CimSession -ComputerName $Machine -Credential $UNPASSWORD
$hw = Get-CimInstance Win32_ComputerSystem -CimSession $CimSession -Property $hwProps -Credential $UNPASSWORD
$os = Get-CimInstance Win32_OperatingSystem -CimSession $CimSession -Credential $UNPASSWORD
[PSCustomObject]@{
Computer = $Machine
Manufacturer = $hw.Manufacturer
Model = $hw.Model
OS = $os.Caption
}
}
$Result | Export-Csv -Path "C:\Temp\pcsinventory.csv" -NoTypeInformation
위의 사용 New-CimSession
을 -Credential
매개 변수로 업데이트 하십시오 . 그런 다음 -CimSession $CimSession
대신 -ComputerName...
. 내 초기 예제에서 자격 증명을 간과했습니다. 참고 : CIM 세션을 사용하는 것이 실제로 -ComputerName...
. 후자는 내부적으로 CIM 세션을 생성하므로 각 반복은 세션을 재사용하여 세션을 생성하고 해체합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다