Chapters/globalizing-tools/GloboTools.psm1
Import-LocalizedData -BindingVariable msgTable function Get-GloboMachineInfo { [CmdletBinding()] Param( [Parameter(ValueFromPipeline=$True, Mandatory=$True)] [Alias('CN','MachineName','Name')] [string[]]$ComputerName, [string]$LogFailuresToPath, [ValidateSet('Wsman','Dcom')] [string]$Protocol = "Wsman", [switch]$ProtocolFallback ) BEGIN {} PROCESS { foreach ($computer in $computername) { if ($protocol -eq 'Dcom') { $option = New-CimSessionOption -Protocol Dcom } else { $option = New-CimSessionOption -Protocol Wsman } Try { Write-Verbose "$($msgTable.connectingTo) $computer ` $($msgTable.byMeansOf) $protocol" $params = @{'ComputerName'=$Computer 'SessionOption'=$option 'ErrorAction'='Stop'} $session = New-CimSession @params Write-Verbose "$($msgTable.queryingFrom) $computer" $os_params = @{'ClassName'='Win32_OperatingSystem' 'CimSession'=$session} $os = Get-CimInstance @os_params $cs_params = @{'ClassName'='Win32_ComputerSystem' 'CimSession'=$session} $cs = Get-CimInstance @cs_params $sysdrive = $os.SystemDrive $drive_params = @{'ClassName'='Win32_LogicalDisk' 'Filter'="DeviceId='$sysdrive'" 'CimSession'=$session} $drive = Get-CimInstance @drive_params $proc_params = @{'ClassName'='Win32_Processor' 'CimSession'=$session} $proc = Get-CimInstance @proc_params | Select-Object -first 1 Write-Verbose "$($msgTable.ClosingSessionTo) $computer" $session | Remove-CimSession Write-Verbose "$($msgTable.outputFor) $computer" $obj = [pscustomobject]@{'ComputerName'=$computer 'OSVersion'=$os.version 'SPVersion'=$os.servicepackmajorversion 'OSBuild'=$os.buildnumber 'Manufacturer'=$cs.manufacturer 'Model'=$cs.model 'Procs'=$cs.numberofprocessors 'Cores'=$cs.numberoflogicalprocessors 'RAM'=($cs.totalphysicalmemory / 1GB) 'Arch'=$proc.addresswidth 'SysDriveFreeSpace'=$drive.freespace} Write-Output $obj } Catch { Write-Warning "$($msgTable.failed) $computer ` $($msgTable.byMeansOf) $protocol" # Did we specify protocol fallback? # If so, try again. If we specified logging, # we won't log a problem here - we'll let # the logging occur if this fallback also # fails If ($ProtocolFallback) { If ($Protocol -eq 'Dcom') { $newprotocol = 'Wsman' } else { $newprotocol = 'Dcom' } #if protocol Write-Verbose "$($msgTable.tryingAgainByMeansOf) $newprotocol" $params = @{'ComputerName'=$Computer 'Protocol'=$newprotocol 'ProtocolFallback'=$False} If ($PSBoundParameters.ContainsKey('LogFailuresToPath')){ $params += @{'LogFailuresToPath'=$LogFailuresToPath} } #if logging Get-MachineInfo @params } #if protocolfallback # if we didn't specify fallback, but we # did specify logging, then log the error, # because we won't be trying again If (-not $ProtocolFallback -and $PSBoundParameters.ContainsKey('LogFailuresToPath')){ Write-Verbose "$($msgTable.loggingTo) $LogFailuresToPath" $computer | Out-File $LogFailuresToPath -Append } # if write to log } #try/catch } #foreach } #PROCESS END {} } #function |