Skip to main content

Describing Object Properties

Today we are going to look at a member of an object called a property.  Simply put, a property describes something. Take your phone for instance.  Let’s identify several properties. 
  •         Color
  •         Make
  •         Model
  •         Operating System
  •         Memory


Every cell phone on the market would have these properties, but we all know the value of these properties will not be the same.  Here are mine:
Property
Value
Color
Black
Make
Samsung
Model
Galaxy 7
Operating System
Android
Memory
32GB

Does your phone’s property values match mine? Most likely not.  Since your phone has the same properties as mine, we can make a safe assumption that it is an object of type Cell Phone.  Let’s go with our example from yesterday and take a look at the properties of a volume.  We are going to use the cmdlet Get-Member to show us all of the properties in the object produced by Get-Volume
PS C:\> Get-Volume | Get-Member -MemberType Properties


   TypeName:
Microsoft.Management.Infrastructure.CimInstance#ROOT/Microsoft/Windows/Storage/MSFT_Volume

Name                 MemberType     Definition                                           
----                 ----------     ----------                                            
AllocationUnitSize   Property       uint32 AllocationUnitSize {get;}                     
DriveLetter          Property       char DriveLetter {get;}                              
FileSystem           Property       string FileSystem {get;}                             
FileSystemLabel      Property       string FileSystemLabel {get;set;}                    
ObjectId             Property       string ObjectId {get;}                                
PassThroughClass     Property       string PassThroughClass {get;}                       
PassThroughIds       Property       string PassThroughIds {get;}                         
PassThroughNamespace Property       string PassThroughNamespace {get;}                   
PassThroughServer    Property       string PassThroughServer {get;}                      
Path                 Property       string Path {get;}                                   
PSComputerName       Property       string PSComputerName {get;}                         
Size                 Property       uint64 Size {get;}                                   
SizeRemaining        Property       uint64 SizeRemaining {get;}                          
UniqueId             Property       string UniqueId {get;}                               
DedupMode            ScriptProperty System.Object DedupMode {get=switch ($this.psBase.C...
DriveType            ScriptProperty System.Object DriveType {get=switch ($this.psBase.C...
FileSystemType       ScriptProperty System.Object FileSystemType {get=switch ($this.psB...
HealthStatus         ScriptProperty System.Object HealthStatus {get=switch ($this.psBas...
OperationalStatus    ScriptProperty System.Object OperationalStatus {get=$_status = @()...

There are actually 4 different property types that you may come across.  The way how to property was created determines what type of property it is.

NoteProperty: A .NET object.

AliasProperty: An alias for another property.

ScriptProperty: A property with get and set methods written in PowerShell.

CodeProperty: A property with get and set methods written in C#, VB.

A script property is one where you can actually see the code that determined the value of the property.  Take a look at our Get-Volume example.
PS C:\> Get-Volume

DriveLetter FileSystemLabel FileSystem DriveType HealthStatus OperationalStatus SizeRemaining      Size
----------- --------------- ---------- --------- ------------ ----------------- -------------      ----
                            NTFS       Fixed     Healthy      OK                     99.03 MB    450 MB
                            NTFS       Fixed     Healthy      OK                    321.21 MB    350 MB
E           DATA            NTFS       Fixed     Healthy      OK                     21.73 GB 238.34 GB
D           DATA            NTFS       Fixed     Healthy      OK                     19.99 GB 238.34 GB
            WINRETOOLS      NTFS       Fixed     Healthy      OK                    212.47 MB    492 MB
C           OS              NTFS       Fixed     Healthy      OK                      5.06 GB 108.29 GB
            PBR Image       NTFS       Fixed     Healthy      OK                     243.9 MB   9.03 GB

Notice the value of DriveType.  The word “Fixed” is not stored as part of the data. It is actually the integer value of 3. This is because there is a defined list of acceptable values for this property and storing a number, as opposed to a string, is more memory efficient.  Take a look at this definition of this ScriptProperty.

PS C:\> Get-Volume | Get-Member -Name Drivetype | Select-Object -ExpandProperty Definition
System.Object DriveType {get=switch ($this.psBase.CimInstanceProperties["DriveType"].Value)

          {
          0 { "Unknown" }
          1 { "Invalid Root Path" }
          2 { "Removable" }
          3 { "Fixed" }
          4 { "Remote" }
          5 { "CD-ROM" }
          6 { "RAM Disk" }
          Default { "Unknown" }
          };}

Let’s ask the Object of Get-Volume to give us it’s TypeName
PS C:\> Get-Volume | Get-Member | Select-Object -First 1 -Property TypeName

TypeName                                                                                 
--------                                                                                 
Microsoft.Management.Infrastructure.CimInstance#ROOT/Microsoft/Windows/Storage/MSFT_Volume


Going online and searching for MFST_Volume takes us to. https://msdn.microsoft.com/en-us/library/windows/desktop/hh830604(v=vs.85).aspx. Here is a screen shot of the DriveType property description. 

The data type for this property is an integer.  It is read only and it has 7 valid values.  The value of 3 represents a “Fixed” drive.

You will not be able to run Get-Help on an object to get information on what its members mean.  You will have to go to MSDN for that. To determine your search query for an objects information, use the TypeName.  If the TypeName contains a “\” like the one above, only query everything to the right of the final “\”.  In this case, MSFT_Volume. Look at the example below.

PS C:\> Get-Process | Get-Member | Select-Object -First 1 -Property TypeName

TypeName                 
--------                 
System.Diagnostics.Process

Since the TypeName does not contain any “\”, your query will be System.Diagnostics.Process.  You can also use my Show-MSDNResource cmdlet.  Make sure you read the setup instructions and help file.  You can get the cmdlet here.

You may also notice that the MSDN resources do not contain all of the properties that Get-Member displays.  That is because there are other cmdlets used in the process of collecting the information. These cmdlet add members to the object in the pipeline, but are not part of the original object. Here is the list of properties for MSFT_Volume on MSDN


Notice that it contains 10 properties.  Here is the result of Get-Volume | Get-Member.

PS C:\> Get-volume | Select-Object -Property * -First 1


OperationalStatus     : OK
HealthStatus          : Healthy
DriveType             : Fixed
FileSystemType        : NTFS
DedupMode             : NotAvailable
ObjectId              : {1}\\JASONPC2\root/Microsoft/Windows/Storage/Providers_v2\WSP_Volu
                        me.ObjectId="{c918366b-4c74-11e3-824f-806e6f6e6963}:VO:\\?\Volume{
                        463405a4-618b-43f5-a8d2-6279f60cf907}\"
PassThroughClass      :
PassThroughIds        :
PassThroughNamespace  :
PassThroughServer     :
UniqueId              : \\?\Volume{463405a4-618b-43f5-a8d2-6279f60cf907}\
AllocationUnitSize    : 4096
DriveLetter           :
FileSystem            : NTFS
FileSystemLabel       :
Path                  : \\?\Volume{463405a4-618b-43f5-a8d2-6279f60cf907}\
Size                  : 471855104
SizeRemaining         : 103841792
PSComputerName        :
CimClass              : ROOT/Microsoft/Windows/Storage:MSFT_Volume
CimInstanceProperties : {ObjectId, PassThroughClass, PassThroughIds,
                        PassThroughNamespace...}
CimSystemProperties   : Microsoft.Management.Infrastructure.CimSystemProperties

It contains 22 properties.  Again, this is because PowerShell and the cmdlets used to get this information is adding their own information to the object as it passes through the pipeline.

You may also noticed that some values are NULL.  This is OK.  The reason for this is either new properties were added to this objects description (class) and your current technology does not support it or it is older properties that newer technology does not use.  In either case, it is OK.  PowerShell will not error.  It will just leave the value at NULL.

Comments

Popular posts from this blog

Adding a Comment to a GPO with PowerShell

As I'm writing this article, I'm also writing a customization for a PowerShell course I'm teaching next week in Phoenix.  This customization deals with Group Policy and PowerShell.  For those of you who attend my classes may already know this, but I sit their and try to ask the questions to myself that others may ask as I present the material.  I finished up my customization a few hours ago and then I realized that I did not add in how to put a comment on a GPO.  This is a feature that many Group Policy Administrators may not be aware of. This past summer I attended a presentation at TechEd on Group Policy.  One organization in the crowd had over 5,000 Group Policies.  In an environment like that, the comment section can be priceless.  I always like to write in the comment section why I created the policy so I know its purpose next week after I've completed 50 other tasks and can't remember what I did 5 minutes ago. In the Group Policy module for PowerShell V3, th

Return duplicate values from a collection with PowerShell

If you have a collection of objects and you want to remove any duplicate items, it is fairly simple. # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   # Remove the duplicate values. $Set1 | Select-Object -Unique 1 2 3 4 5 6 7 What if you want only the duplicate values and nothing else? # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   #Create a second collection with duplicate values removed. $Set2 = $Set1 | Select-Object -Unique   # Return only the duplicate values. ( Compare-Object -ReferenceObject $Set2 -DifferenceObject $Set1 ) . InputObject | Select-Object – Unique 1 2 This works with objects as well as numbers.  The first command creates a collection with 2 duplicates of both 1 and 2.   The second command creates another collection with the duplicates filtered out.  The Compare-Object cmdlet will first find items that are diffe

How to list all the AD LDS instances on a server

AD LDS allows you to provide directory services to applications that are free of the confines of Active Directory.  To list all the AD LDS instances on a server, follow this procedure: Log into the server in question Open a command prompt. Type dsdbutil and press Enter Type List Instances and press Enter . You will receive a list of the instance name, both the LDAP and SSL port numbers, the location of the database, and its status.