I had one of those randomly appearing PowerShell questions last night. Windows PowerShell is a huge interest for me, so there’s really no surprise.
I wondered, How can only return the date time related properties from Get-ADComputer? It seems to happen quite often that I’ll need to view date and time information from Get-ADComputer (and Get-ADUser). It’s mildly cumbersome to scan though all the properties looking for dates and times in the property’s value — the ultimate reason behind this random thought.
The command I threw together was ugly, and seemed to lack a simpler approach. I stopped there, and decided to pass this one out to the community. Can you come with a better way?
Again, the idea is to return only the properties from Get-ADComputer that are System.DateTime properties (have System.DateTime in the Definition property of Get-Member). Take a look at my example and you might better understand my goal. I didn’t bother filtering out the default properties returned by Get-ADComputer (at first), but you’re welcome to do that, too. Cheers!
PS> Get-ADComputer -Identity SERVER01 -Properties ((Get-ADComputer -Identity SERVER01 -Properties * | Get-Member | Where-Object Definition -match 'System.DateTime').Name) AccountExpirationDate : AccountLockoutTime : Created : 9/12/2013 1:34:06 PM createTimeStamp : 9/12/2013 1:34:06 PM DistinguishedName : CN=SERVER01,OU=Finance,DC=mydomain,DC=com DNSHostName : SERVER01.mydomain.com Enabled : True LastBadPasswordAttempt : LastLogonDate : 3/17/2014 10:35:35 AM Modified : 8/18/2014 11:48:34 AM modifyTimeStamp : 8/18/2014 11:48:34 AM Name : SERVER01 ObjectClass : computer ObjectGUID : 234cbaed59-1ab3-6ebc-9782-e9542bedaec PasswordLastSet : 3/14/2014 5:12:24 PM SamAccountName : SERVER01$ SID : S-1-5-21-174985627-956854884-123956358-942569 UserPrincipalName : whenChanged : 8/18/2014 11:48:34 AM whenCreated : 9/12/2013 1:34:06 PM
Update1: I went ahead and edited the command so that it would not return the default Get-ADComputer properties (Name, SamAccountName, etc.), using the Select-Object cmdlet. I repeated the command I issued to the -Properties parameter of Get-ADComputer, as the value for Select-Object.
So, any takers? Can you come up with a better way to do this?
PS> Get-ADComputer -Identity SERVER01 -Properties ((Get-ADComputer -Identity SERVER01 -Properties * | Get-Member | Where-Object Definition -match 'System.DateTime').Name) | Select-Object (Get-ADComputer -Identity SERVER01 -Properties * | Get-Member | Where-Object Definition -match 'System.DateTime').Name AccountExpirationDate : AccountLockoutTime : Created : 9/12/2013 1:34:06 PM createTimeStamp : 9/12/2013 1:34:06 PM LastBadPasswordAttempt : LastLogonDate : 3/17/2014 10:35:35 AM Modified : 8/18/2014 11:48:34 AM modifyTimeStamp : 8/18/2014 11:48:34 AM PasswordLastSet : 3/14/2014 5:12:24 PM whenChanged : 8/18/2014 11:48:34 AM whenCreated : 9/12/2013 1:34:06 PM
Update2: There’s a second update to this post. Jonathan Angliss tweeted a much cleaner solution — exactly what I had hoped someone might do. Here’s his contribution:
PS> Get-ADComputer -Identity SERVER01 -Properties * | ForEach-Object {$_.psobject.properties | Where-Object {$_.TypeNameofValue -eq 'System.DateTime'}} | Select-Object Name,Value