This is often a source of confusion when someone is new to
PowerShell. Since PowerShell is used
mostly be non-programers, they often do not understand what an object is. You need to have a basic understanding of
objects to know how these two difference parameters work. Let me give you an example.
PS C:\> Get-ADUser -Identity AdminUser
DistinguishedName : CN=AdminUser,CN=Users,DC=Adatum,DC=com
Enabled :
True
GivenName :
Name :
AdminUser
ObjectClass :
user
ObjectGUID :
696591fc-6697-4d93-b624-3ef7de206ee9
SamAccountName :
AdminUser
SID :
S-1-5-21-817349643-1871075972-606077769-500
Surname :
UserPrincipalName :
Here you can see a subset of a user object. This object is displaying 10 properties in
the left hand column with their associated values on the right. Let’s call the Get-Type() method to see the object’s typename.
PS C:\> (Get-ADUser -Identity AdminUser).getType()
IsPublic IsSerial Name
BaseType
-------- -------- ----
--------
True False ADUser
Microsoft.ActiveDirectory.Management.ADAccount
We can see that this is an ADUser object. Pipe it to Get-Member
TypeName:
Microsoft.ActiveDirectory.Management.ADUser
Name
MemberType
Definition
----
----------
----------
Contains
Method bool
Contains
Equals
Method bool
Equals(S
GetEnumerator
Method
System.Collec
GetHashCode
Method int
GetHashCo
GetType
Method type GetType(
ToString
Method string
ToStri
Item
ParameterizedProperty Microsoft.Act
DistinguishedName Property System.String
Enabled
Property
System.Boolea
GivenName
Property
System.String
Name
Property
System.String
ObjectClass
Property
System.String
ObjectGUID
Property
System.Nullab
SamAccountName
Property System.String
SID
Property
System.Securi
Surname
Property
System.String
UserPrincipalName Property System.String
Notice again that the entire object is a Microsoft.ActiveDirectory.Management.ADUser
object and the property called Name
is a System.String object. Let’s explore the –Property parameter first.
PS C:\> Get-ADUser -Identity AdminUser | Select-Object
-Property Name
Name
----
AdminUser
Now let’s pass this object to Get-Member.
PS C:\> Get-ADUser -Identity AdminUser | Select-Object
-Property Name | Get-Member
TypeName:
Selected.Microsoft.ActiveDirectory.Management.ADUser
Name
MemberType Definition
----
---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method
int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Name
NoteProperty string Name=AdminUser
Notice the TypeName.
It is still a Microsoft.ActiveDirectory.Management.ADUser
object, but it is prefixed with Selected. It is only containing selected information
from the original object. You still see
a property called Name with a
typename of System.String. Now let’s look at –ExpandProperty.
PS C:\> Get-ADUser -Identity AdminUser | Select-Object
-ExpandProperty Name
AdminUser
You see the user name, but you do not see a column
header. Piping the object to Get-Member reveals the reason why:
PS C:\> Get-ADUser -Identity AdminUser | Select-Object
-ExpandProperty Name | Get-Member
TypeName:
System.String
Name
MemberType
Definition
----
----------
----------
Clone
Method System.Object
CompareTo
Method int
CompareTo(
Contains
Method bool
Contains(
CopyTo
Method void
CopyTo(in
EndsWith
Method bool
EndsWith(
Equals Method
bool Equals(Sy
GetEnumerator
Method
System.CharEnu
GetHashCode
Method int
GetHashCod
GetType
Method type
GetType()
GetTypeCode
Method
System.TypeCod
IndexOf Method int IndexOf(ch
IndexOfAny
Method int
IndexOfAny
Insert
Method string
Insert(
IsNormalized
Method bool
IsNormali
LastIndexOf
Method int
LastIndexO
LastIndexOfAny
Method int
LastIndexO
Normalize
Method string
Normali
PadLeft
Method string
PadLeft
PadRight
Method string
PadRigh
Remove
Method string
Remove(
Replace
Method string
Replace
Split
Method string[]
Split
StartsWith
Method bool
StartsWit
Substring
Method string Substri
ToBoolean
Method bool
IConverti
ToByte
Method byte
IConverti
ToChar
Method char
IConverti
ToCharArray
Method char[]
ToCharA
ToDateTime Method datetime IConv
ToDecimal
Method decimal
IConve
ToDouble
Method double
IConver
ToInt16
Method int16
IConvert
ToInt32
Method int
IConvertib
ToInt64
Method long
IConverti
ToLower
Method string
ToLower
ToLowerInvariant Method string ToLower
ToSByte
Method sbyte
IConvert
ToSingle
Method float IConvert
ToString
Method string
ToStrin
ToType
Method
System.Object
ToUInt16
Method uint16
IConver
ToUInt32
Method uint32
IConver
ToUInt64
Method uint64
IConver
ToUpper
Method string
ToUpper
ToUpperInvariant Method string ToUpper
Trim
Method string
Trim(Pa
TrimEnd
Method string
TrimEnd
TrimStart
Method string
TrimSta
Chars
ParameterizedProperty char Chars(int
Length
Property int Length
{gePS C:\> Get-ADUser -Identity
We are no longer working with the original Microsoft.ActiveDirectory.Management.ADUser
object. We are working with System.String. –ExpandProperty pulled
the value of the Name property out
of the original object and discarded the original object. It them placed the value of the Name property in the PowerShell
pipeline. This was a System.String object.
In summary, -Property
removed members from an object that you do not want to use and can accept
multiple values. –ExpandProperty removes the original object, but allows the value
of the single specified property to continue.
Comments