2017-09-13 7 views
2

Ich habe dieses Stück Code, der die Informationen von den Computern in der Domäne erhält und an eine CSV-Datei ausgibt. Ich habe versucht, eine neue Codezeile hinzuzufügen, um auch die Datenträgerinformationen für die Computer zu erfassen, aber ich kann nicht wie erwartet funktionieren.Wie behebt man dieses Powershell-Skript mit Get-WmiObject?

# Get the list of all computer names and export to CSV file 
Get-ADComputer -Filter * | select Name | Export-Csv -Path 'C:\temp\computers.csv' -NoTypeInformation 

# Import the computer names from CSV file and get the system information 
$computers = Import-Csv “C:\Temp\computers.csv” | ForEach { 

    $computerSystem = Get-WmiObject Win32_ComputerSystem -ComputerName $_.Name 
    $computerOS = Get-WmiObject Win32_OperatingSystem -ComputerName $_.Name 
    $computerCPU = Get-WmiObject Win32_Processor -ComputerName $_.Name 
    $computerSN = Get-WmiObject Win32_bios -ComputerName $_.Name | Select-Object SerialNumber 
    $computerDisk = Get-WmiObject win32_logicaldisk -ComputerName $_.Name | Select-Object DeviceId 

    [PSCustomObject]@{ 
     'PCName' = $computerSystem.Name  
     'Model' = $computerSystem.Model 
     'RAM' = "{0:N2}" -f ($computerSystem.TotalPhysicalMemory/1GB)  
     'CPU' = $computerCPU.Name  
     'OS' = $computerOS.caption 
     'SN' = $computerSN.SerialNumber 
     'User' = $computerSystem.UserName 
     'Disk' = $computerDisk.DeviceId | Format-Table DeviceId, MediaType, @{n="Size";e={[math]::Round($_.Size/1GB,2)}},@{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}} 
    } 

} | Export-Csv 'C:\Temp\system-info.csv' -NoTypeInformation 

Dies ist die Codezeile für die Festplatte.

$computerDisk = Get-WmiObject win32_logicaldisk -ComputerName $_.Name | Select-Object DeviceId 

Und ...

'Disk' = $computerDisk.DeviceId | Format-Table DeviceId, MediaType, @{n="Size";e={[math]::Round($_.Size/1GB,2)}},@{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}} 

Die anderen Parameter arbeiten, aber nur die Platten Info-Bereich funktioniert nicht. Die Ausgabe ist: System.Object[] anstatt die Info anzuzeigen.

+0

'win32_logicaldisk' gibt eine Sammlung von Laufwerken zurück, da ein Computer mehrere Laufwerke haben kann. Sie brauchen also eine Foreach-Schleife, die über jedes Laufwerk iteriert. – Kiran

+0

Was genau erwarten Sie, dass die 'Disk'-Zeile in der CSV aussieht? –

+0

Unter Disk Spalte, brauche ich den Laufwerksbuchstaben (D :, E :, etc), Kapazität und freie Größe in GB, vielleicht Es benötigt 3 Spalten, aber ich weiß nicht, wie dies zu erreichen ist. –

Antwort

0

Sie können dies tun, das Ergebnis, das ich Sie denken zu bekommen sind nach:

$Computers = Import-Csv 'C:\Temp\computers.csv' 

$Computers | ForEach { 

    $computerSystem = Get-WmiObject Win32_ComputerSystem -ComputerName $_.Name 
    $computerOS = Get-WmiObject Win32_OperatingSystem -ComputerName $_.Name 
    $computerCPU = Get-WmiObject Win32_Processor -ComputerName $_.Name 
    $computerSN = Get-WmiObject Win32_bios -ComputerName $_.Name | Select-Object SerialNumber 
    $computerDisk = Get-WmiObject win32_logicaldisk -ComputerName $_.Name | Select-Object DeviceId, MediaType, @{n="Size";e={[math]::Round($_.Size/1GB,2)}},@{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}} 

    [PSCustomObject]@{ 
     'PCName' = $computerSystem.Name  
     'Model' = $computerSystem.Model 
     'RAM' = "{0:N2}" -f ($computerSystem.TotalPhysicalMemory/1GB)  
     'CPU' = $computerCPU.Name  
     'OS' = $computerOS.caption 
     'SN' = $computerSN.SerialNumber 
     'User' = $computerSystem.UserName 
     'Disk' = $computerDisk | Format-Table | Out-String 
    } 

} | Export-Csv 'C:\Temp\system-info.csv' -NoTypeInformation 

Das erste Problem war, dass in der $computerDisk = Linie Sie Select-Object verwendet haben nur die DeviceID Eigentum zurückzukehren, aber dann später waren versuchen, die anderen Eigenschaften zu verwenden.

Das zweite Problem war, dass man Format-Table-Out-String zu Rohr benötigen, wenn Sie Ausgabe, die es es in String-Format zu konvertieren, so dass Export-CSV es als Objekt nicht behandeln wird.

+0

Die Spalte Datenträger ist leer. Nicht sicher warum. –

+0

Machen wir es einfacher. Ich brauche nur die DeviceId, Kapazität und freien Speicherplatz. Keine Notwendigkeit für Medientyp. Ich denke, da jeder Computer mehrere Laufwerke hat, kommt der ausgegebene Datenträger als null heraus. Da die Datenträgerausgabe versucht, die Informationen nur in eine Spalte hinzuzufügen. Habe ich recht? –

+0

Sie öffnen es in Excel zu überprüfen? Da die obere Zeile leer ist, sieht es zunächst leer aus, aber es ist mehrzeilig, also erweitern Sie einfach die Zeile, und sie sollte dort sein. –

1

Das hat funktioniert oder ich etwas aber es ergreift nur die Informationen für die erste Fahrt. Außerdem ist der freie Speicherplatz größer als die Festplattengröße, was seltsam ist.

$Computers = Import-Csv 'C:\Temp\computers.csv' 

$Computers | ForEach { 

    $computerSystem = Get-WmiObject Win32_ComputerSystem -ComputerName $_.Name 
    $computerOS = Get-WmiObject Win32_OperatingSystem -ComputerName $_.Name 
    $computerCPU = Get-WmiObject Win32_Processor -ComputerName $_.Name 
    $computerSN = Get-WmiObject Win32_bios -ComputerName $_.Name | Select-Object SerialNumber 
    $computerDisk = Get-WmiObject win32_logicaldisk -ComputerName $_.Name | Select-Object DeviceId, Size, FreeSpace 

    [PSCustomObject]@{ 
     'PCName' = $computerSystem.Name  
     'Model' = $computerSystem.Model 
     'RAM' = "{0:N2}" -f ($computerSystem.TotalPhysicalMemory/1GB)  
     'CPU' = $computerCPU.Name  
     'OS' = $computerOS.caption 
     'SN' = $computerSN.SerialNumber 
     'User' = $computerSystem.UserName 
     'Disk' = $computerDisk.DeviceId | Format-Table | Out-String 
     'Size' = $computerDisk.Size | Format-Table | Out-String 
     'Free Space' = $computerDisk.FreeSpace | Format-Table | Out-String 
    } 

} | Export-Csv 'C:\Temp\system-info.csv' -NoTypeInformation