私は PowerShell にかなり慣れていないので、ロープをよりよく学ぶために、ネットワーク内のコンピューターに関する基本的な概要情報を返す Powershell 関数に取り組んでいます。探しているものはほぼすべて取得できましたが、ハード ディスクやMAC アドレスなどのWMIクエリによって返された配列のすべての結果を表示する方法がわかりません。
たとえば、現在、WMI クエリ「DHCPEnabled = TRUE」を使用して、アクティブなNICを検出し、それらの MAC アドレスを取得していますが、ラップトップでは、理論的にはクエリが有線と無線の両方の NIC を返す可能性があります。
このコマンドの出力には、作成したカスタムPSObjectが表示されますが、結果の PSObject ではプロパティMACAddress
が空白で表示されます。結果はそこにあり、パイプラインまたはSelect-Objectを介して結果に到達できましたが、レポート用に保存する方法や「きれいにする」方法がわかりません。
これが私が今持っている作業関数です。これは、最初に返された結果が私が気にかけている唯一のものであるというひどい仮定をしています。繰り返しますが、この例では、これは主にハードディスクと MAC アドレスに関する問題ですが、今後の参考のためにその背後にある概念を理解したいと思います。
Function Get-PCInfo
{
[CmdletBinding()]
param(
[Parameter(Mandatory = $true,
Position = 0,
ValueFromPipeline = $true,
ValueFromPipelineByPropertyName = $true)]
[Alias("CName")]
[string[]] $ComputerName
)
foreach($cName in $ComputerName)
{
Write-Verbose "Testing connection to $cName"
If (Test-Connection -ComputerName $cName -BufferSize 16 -Quiet)
{
Write-Verbose "Connection successful."
Write-Verbose "Obtaining WMI objects from $cName"
$cs = Get-WMIObject -Class Win32_ComputerSystem -ComputerName $cName
$csp = Get-WMIObject -Class Win32_ComputerSystemProduct -ComputerName $cName
$os = Get-WMIObject -Class Win32_OperatingSystem -ComputerName $cName
$bios = Get-WMIObject -Class Win32_BIOS -ComputerName $cName
$cpu = Get-WMIObject -Class Win32_Processor -ComputerName $cName
$hdd = Get-WMIObject -Class Win32_LogicalDisk -Filter 'DeviceID = "C:"' -ComputerName $cName
$network = Get-WMIObject -Class Win32_NetworkAdapterConfiguration -Filter 'DHCPEnabled = True' -ComputerName $cName
if ($hdd -is [System.array])
{
Write-Verbose "Multiple hard drives detected; using first result"
$hddResult = $hdd[0]
} else {
Write-Verbose "Single hard drive detected"
$hddResult = $hdd
}
if ($network -is [System.array])
{
Write-Verbose "Multiple network cards detected; using first result"
$networkResult = $network[0]
} else {
Write-Verbose "Single network card detected"
$networkResult = $network
}
Write-Verbose "Creating output table"
$props = @{'Name' = $cs.Name;
'OSVersion' = $os.Version;
'ServicePack' = $os.ServicePackMajorVersion;
'HardDiskSize' = $hddResult.Size;
'SerialNumber' = $bios.serialNumber;
'Model' = $cs.Model;
'Manufacturer' = $cs.Manufacturer;
'Processor' = $cpu.Name;
'RAM' = $cs.TotalPhysicalMemory;
'MACAddress' = $networkResult.MACAddress}
Write-Verbose "Creating output object from table"
$result = New-Object -TypeName PSObject -Property $props
Write-Verbose "Outputting result"
$resultArray += @($result)
} else {
Write-Verbose "Connection failure"
$resultArray += @($null)
}
}
Write-Output $resultArray
}
より明確にするために、実行例を次に示します。データは偽物ですが、結果の形式は次のとおりです。
PS> Get-PCInfo ローカルホスト
SerialNumber : 12345
MACAddress :
RAM : 4203204608
Manufacturer : Computers, Inc.
Processor : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
HardDiskSize : 500105736192
OSVersion : 6.2.9200
Name : PC1
Model: : Super Awesome Computer
ServicePack : 0
これを ConvertTo-HTML などに送信して見栄えの良いレポートを作成したいのですが、MACAddress
が空白であるため、何もうまく作成できません。私が見たいのは、次のようなものです。
SerialNumber : 12345
MACAddress[0] : 00-11-22-33-44-55
MACAddress[1] : 88-99-AA-BB-CC-DD
...
HardDiskSize[0]: 500105736192
HardDiskSize[1]: 500105736192