#here's a typical way to use WMI in PowerShell $os=get-wmiobject Win32_OperatingSystem #list properties and values #Selected.System.Management.PropertyData #works fine for a single instance $os.properties | select name,value #although you could do this $d=Get-WmiObject win32_logicaldisk -filter "drivetype=3" $d | foreach {$_.properties | select name,value } #save properties as an array of string names [string[]]$prop=$os.properties | Select -expand name #select all of them $os | Select -Property $prop #or as a one liner $os | Select -property ([string[]]($os.properties | Select -expand name)) #or as a more complex one liner Get-WmiObject win32_OperatingSystem | foreach {Select -InputObject $_ -Property ([string[]](Select -InputObject $_ -expand Properties | Select -expand Name))} #an alternative using [WMIClass] [wmiclass]"win32_operatingsystem" | Select -expand Properties | Select name #which leads to this ([wmiclass]"win32_operatingsystem").Properties #...to this ([wmiclass]"win32_operatingsystem").Properties | Select -expand Name #we can use the same technique with a slightly easier one-liner get-wmiobject win32_operatingsystem | select -property ([string[]](([wmiclass]"Win32_Operatingsystem").properties | select -expand name)) #how about a shortcut? $p={[string[]](([wmiclass]"Win32_Operatingsystem").properties | select -expand name) } get-wmiobject win32_operatingsystem | select -property (&$p) #now let's make it flexible $p={Param([string]$class) [string[]](([wmiclass]$class).properties | select -expand name) } #test it &$p win32_bios #use it get-wmiobject win32_bios | select -property (&$p "win32_bios")