PowerShell Deep Dive: I–COM collections
The PowerShell Deep Dive last week was the best conference I have ever attended. The group consisted of members of the PowerShell team, Ed Wilson – the Scripting Guy, PowerShell MVPs and a large number of PowerShell experts and enthusiasts. The last word summed it up. The Scripting Club was supposed to finish at 10pm – it really finished at 3am next morning.
The sessions were short – 35 minutes – and much more interactive than a normal conference. A blog post can’t do justice to the event all I can say is that I’ll be booking for the next one as soon as its announced.
With that many experts drawn together I managed to learn something in every session – even the one I gave!
I’ll post some snippets of I what I learned in a series of posts. Some you may know & some may be new.
The first snippet involves working with COM collections. Many COM objects have properties that are actually collections of other objects. As an example consider the Windows firewall.
$fw = New-Object -ComObject HNetCfg.FwMgr
If we drill into the object we find
$fw.LocalPolicy.CurrentProfile.Services
on my machine I get three services
- File and Printer Sharing
- Network Discovery
- Remote Desktop
The logical thing to try would be
PS> $fw.LocalPolicy.CurrentProfile.Services[0]
Unable to index into an object of type System.__ComObject.
At line:1 char:41
+ $fw.LocalPolicy.CurrentProfile.Services[ <<<< 0]
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
But we get an error. The collection doesn’t have an index. Bah!!!
But if we do this
$x = @($fw.LocalPolicy.CurrentProfile.Services)
we can then do this
PS> $x[0]
Name : File and Printer Sharing
Type : 0
Customized : False
IpVersion : 2
Scope : 1
RemoteAddresses : LocalSubnet
Enabled : True
GloballyOpenPorts : System.__ComObject
which gives us an array where we can work with indexes
Simple but effective.
This is one of the strengths of an event like Deep Dive – you get to pick everyone else’s brain. During a session someone said “None of us know it all but between us in this room we know nearly all of it”
That should be the motto of the PowerShell community!!