<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://powershell.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Dreaming in PowerShell : Registry</title><link>http://powershell.com/cs/blogs/tobias/archive/tags/Registry/default.aspx</link><description>Tags: Registry</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Finding Logged On User (and Writing To Other People's Registry)</title><link>http://powershell.com/cs/blogs/tobias/archive/2012/04/19/finding-logged-on-user-and-writing-to-other-people-s-registry.aspx</link><pubDate>Thu, 19 Apr 2012 12:47:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:16043</guid><dc:creator>Tobias</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=16043</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2012/04/19/finding-logged-on-user-and-writing-to-other-people-s-registry.aspx#comments</comments><description>&lt;p&gt;How would I find out the &lt;strong&gt;currently logged on user on a remote machine&lt;/strong&gt;? And how can I remotely&amp;nbsp;access another person&amp;#39;s &lt;strong&gt;HKEY_CURRENT_USER&lt;/strong&gt; registry hive? Here are some tricks you may want to try...&lt;/p&gt;
&lt;h3&gt;Who&amp;#39;s Logged On?&lt;/h3&gt;
&lt;p&gt;To find out who&amp;#39;s logged on to another machine, you could use &lt;strong&gt;WMI&lt;/strong&gt; and check for the &lt;strong&gt;owner&lt;/strong&gt; of &lt;strong&gt;explorer.exe&lt;/strong&gt;. Since explorer.exe is providing the GUI, by looking at its owner you find the logged on users like this:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span style="color:#008000;"&gt;&lt;span class="comment"&gt;# specify the remote computer name or IP address you want to query&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# you do need remote WMI access to that machine&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$ComputerName&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$env:computername&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-WMIObject&lt;/span&gt;&lt;/span&gt; Win32_Process &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;filter&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;name=&amp;quot;explorer.exe&amp;quot;&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-computername&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$computername&lt;/span&gt;&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;ForEach-Object&lt;/span&gt;&lt;/span&gt; { &lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$owner&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$_&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;GetOwner&lt;/span&gt;&lt;/span&gt;()&lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;{0}\{1}&amp;#39;&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-f&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$owner&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;Domain&lt;/span&gt;&lt;/span&gt;, &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$owner&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;User&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;} | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Sort-Object&lt;/span&gt;&lt;/span&gt; | &lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-Unique&lt;/span&gt;&lt;/span&gt; |&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;ForEach-Object&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$rv&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; 1 | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; ComputerName, User&lt;br /&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$rv&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;ComputerName&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$computername&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$rv&lt;/span&gt;&lt;/span&gt;.&lt;span class="method"&gt;&lt;span style="color:#8b4513;"&gt;User&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#800080;"&gt;&lt;span class="var"&gt;$_&lt;/span&gt;&lt;br /&gt;&lt;span class="var"&gt;$rv&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/div&gt;
&lt;h3&gt;Writing to Other User&amp;#39;s HKEY_CURRENT_USER Registry Hive&lt;/h3&gt;
&lt;p&gt;Another common problem is remote registry access. There are many ways how you can remotely &lt;strong&gt;access the registry on another machine&lt;/strong&gt;. Today, I will be using PowerShell remoting so as a prerequisite, PowerShell remoting needs to be set up and enabled (I am not covering that part here).&lt;/p&gt;
&lt;p&gt;All of the following examples run locally and remotely. To run them &lt;strong&gt;remotely&lt;/strong&gt;, use &lt;strong&gt;Invoke-Command&lt;/strong&gt; and send the code to the remote system via &lt;strong&gt;PowerShell Remoting&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When you connect to a remote machine via PowerShell remoting, you can easily write to &lt;strong&gt;HKEY_LOCAL_MACHINE&lt;/strong&gt;, but writing to &lt;strong&gt;HKEY_CURRENT_USER&lt;/strong&gt; would always write to your very own &lt;strong&gt;HKEY_CURRENT_USER&lt;/strong&gt; and not to the one of the person currently logged on to that machine. This is because PowerShell remoting uses &lt;strong&gt;your identity&lt;/strong&gt; (and not the one of the currently logged on remote user).&lt;/p&gt;
&lt;p&gt;However, as long as there *is* someone logged on the remote machine, you can easily write to that person&amp;#39;s &lt;strong&gt;HKEY_CURRENT_USER&lt;/strong&gt; as well. First, you need to know &lt;strong&gt;who is logged on&lt;/strong&gt;. Here&amp;#39;s how you can find that out:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-CurrentUserName&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-ItemProperty&lt;/span&gt;&lt;/span&gt; &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Registry::HKEY_USERS\*\Volatile*&amp;#39;&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ExpandProperty&lt;/span&gt;&lt;/span&gt; UserName&lt;br /&gt;}&lt;/div&gt;
&lt;p&gt;Basically, we are looking into &lt;strong&gt;HKEY_USERS&lt;/strong&gt; and search for any user that has a subkey that starts with &amp;quot;&lt;strong&gt;Volatile&lt;/strong&gt;&amp;quot;, then we can read the registry value &amp;quot;UserName&amp;quot;. That&amp;#39;s it.&lt;/p&gt;
&lt;h3&gt;Accessing Logged On User via HKEY_USERS&lt;/h3&gt;
&lt;p&gt;By taking the same route, we can now write to another users&amp;#39; private registry hive. This is how you find the hive that represents this user:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Get-CurrentUser&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Split-Path&lt;/span&gt;&lt;/span&gt; (dir &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;Registry::HKEY_USERS\*\Volatile*&amp;#39;&lt;/span&gt;&lt;/span&gt; | &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Select-Object&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ExpandProperty&lt;/span&gt;&lt;/span&gt; Name)&lt;br /&gt;}&lt;/div&gt;
&lt;p&gt;To create a new key named &amp;quot;NewKey&amp;quot; in &lt;strong&gt;HKEY_CURRENT_USER\Software&lt;/strong&gt;, try this:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$user&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;=&lt;/span&gt;&lt;/span&gt; &lt;span style="color:#5f9ea0;"&gt;&lt;span class="verbnoun"&gt;Get-CurrentUser&lt;/span&gt;&lt;br /&gt;&lt;span class="verbnoun"&gt;New-Item&lt;/span&gt;&lt;/span&gt; Registry::&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$user&lt;/span&gt;&lt;/span&gt;\Software\NewKey&lt;/div&gt;
&lt;p&gt;Now, the key was written to &lt;strong&gt;HKCU:&lt;/strong&gt; in the context of the currently logged on user on the remote machine.&lt;/p&gt;
&lt;p&gt;I hope that was a useful hint. Stay tuned...!&lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Microsoft MVP PowerShell Germany&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;P.S.&lt;br /&gt;If you live in Germany or other parts of Europe and your company would like to set up a truly great PowerShell training, just contact me! I regularly train mid- to large-size companies. Trainings are always a blast with tons of real-world-examples and solutions. Here&amp;#39;s how to get in touch with me: &lt;a href="mailto:tobias.weltner@scriptinternals.de"&gt;&lt;span style="color:#3366cc;"&gt;tobias.weltner@scriptinternals.de&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=16043" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Registry/default.aspx">Registry</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/WMI/default.aspx">WMI</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/HKCU/default.aspx">HKCU</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Remote/default.aspx">Remote</category></item><item><title>Identifying Object Types</title><link>http://powershell.com/cs/blogs/tobias/archive/2008/10/14/identifying-object-types.aspx</link><pubDate>Tue, 14 Oct 2008 08:42:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:102</guid><dc:creator>Tobias Weltner</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=102</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2008/10/14/identifying-object-types.aspx#comments</comments><description>&lt;p&gt;In an object oriented world, commands return&amp;nbsp;all kinds of different objects. To really find what you are looking for, identifying object types is crucial. &lt;/p&gt;
&lt;h2&gt;&lt;span style="color:#3366ff;"&gt;Identifying .NET Objects&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Most often, you work with .NET objects since PowerShell is based on .NET. Cmdlets generally return .NET objects. Let&amp;#39;s take for example a simple &lt;strong&gt;Dir&lt;/strong&gt; (aka &lt;strong&gt;Get-Childitem&lt;/strong&gt;) to list the contents of your windows folder:&lt;/p&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;dir&amp;nbsp;$env:windir&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem::C:\Windows&lt;br /&gt;&lt;br /&gt;Mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastWriteTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Length&amp;nbsp;Name&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;------&amp;nbsp;----&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;18.11.2007&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;16:53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;ADAM&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;02.11.2006&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13:35&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;addins&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11.09.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;08:13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;AppPatch&lt;br /&gt;d-r-s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13.10.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;20:04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;assembly&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;04.04.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;19:17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;Boot&lt;br /&gt;(...)&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;29.03.2007&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13:11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;285488&amp;nbsp;BtwIEProxy.exe&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;06.12.2006&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;18:05&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;478&amp;nbsp;CLNDR.CMD&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;16.11.2007&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;16:36&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;762&amp;nbsp;comsetup.log&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;15.01.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;01:04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;370&amp;nbsp;comsetup.log.zip&lt;br /&gt;-a---&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;24.10.2007&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;20:19&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;12&amp;nbsp;csup.txt&lt;br /&gt;(...)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;When you start working with PowerShell, you may &lt;em&gt;think &lt;/em&gt;Cmdlets return text when in fact all you see are objects. PowerShell simply &amp;quot;reduces&amp;quot; objects to text if you don&amp;#39;t do anything with them, so the text output you see&amp;nbsp;in the PowerShell console is just a simplified text representation of your objects. I am not&amp;nbsp;going to dive deeper into this conversion today.&lt;/p&gt;
&lt;p&gt;As you can see, though, &lt;strong&gt;Dir&lt;/strong&gt; obviously returned two completely different object types: files and folders. Why on&amp;nbsp;earth would you care? For example, because you might want to filter the output and show only subfolders or only files. To do that, you need to know what object type you are looking for.&lt;/p&gt;
&lt;p&gt;With .NET, finding out object types is easy. Every .NET object has a &lt;strong&gt;GetType()&lt;/strong&gt; method which returns the type information. Type information again is an object with a number&amp;nbsp;of properties. The property &lt;strong&gt;FullName&lt;/strong&gt; gets you the fully qualified type name of any .NET object. Check this out:&lt;/p&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;dir&amp;nbsp;$env:windir&amp;nbsp;|&amp;nbsp;%&amp;nbsp;{&amp;nbsp;$_.GetType().FullName&amp;nbsp;}&lt;br /&gt;System.IO.DirectoryInfo&lt;br /&gt;System.IO.DirectoryInfo&lt;br /&gt;System.IO.DirectoryInfo&lt;br /&gt;(...)&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;System.IO.DirectoryInfo&lt;br /&gt;System.IO.DirectoryInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;System.IO.FileInfo&lt;br /&gt;(...)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;As you discover, files are represented by a &lt;strong&gt;System.IO.FileInfo&lt;/strong&gt; object whereas folders are wrapped up by a &lt;strong&gt;System.IO.DirectoryInfo&lt;/strong&gt; object. To filter the output of a Cmdlet by object type, all you do is use &lt;strong&gt;Where-Object&lt;/strong&gt; (short: &lt;strong&gt;?&lt;/strong&gt;) and make sure the condition is only met by the object you want. The following code lists only subfolders of a folder:&lt;/p&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;dir&amp;nbsp;$env:windir&amp;nbsp;|&amp;nbsp;?&amp;nbsp;{&amp;nbsp;$_&amp;nbsp;-is&amp;nbsp;[System.IO.DirectoryInfo]&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory:&amp;nbsp;Microsoft.PowerShell.Core\FileSystem::C:\Windows&lt;br /&gt;&lt;br /&gt;Mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastWriteTime&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Length&amp;nbsp;Name&lt;br /&gt;----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;------&amp;nbsp;----&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;18.11.2007&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;16:53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;ADAM&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;02.11.2006&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13:35&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;addins&lt;br /&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11.09.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;08:13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;AppPatch&lt;br /&gt;d-r-s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;13.10.2008&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;20:04&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;assembly&lt;br /&gt;(...)&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;d----&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;02.11.2006&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11:24&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DIR&amp;gt;&amp;nbsp;SchCache&lt;br /&gt;PS&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Note that in PowerShell, types are always identified by square brackets. You can use types in conjunction with the &lt;strong&gt;-is&lt;/strong&gt; operator to check whether an object is a specific type. &lt;/p&gt;
&lt;p&gt;Why are there different types in the first place? Because types are specialized data containers, and each type is best at representing a specific set of information. For example, a &lt;strong&gt;String&lt;/strong&gt; type can store any text whereas a &lt;strong&gt;DateTime&lt;/strong&gt; type stores Dates and Times. &lt;/p&gt;
&lt;p&gt;Of course you could store a Date or Time in the generic String type but a &lt;strong&gt;DateTime&lt;/strong&gt; type can handle Dates and Times much better and display the Weekday, format&amp;nbsp; the date according to your locate and provide specific Date and Time methods to add or remove&amp;nbsp;time intervals.&lt;/p&gt;
&lt;p&gt;This is why you&amp;nbsp;can also use types to convert information into the type you want:&lt;/p&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;(Get-Date).GetType().FullName&lt;br /&gt;System.DateTime&lt;br /&gt;PS&amp;gt;&amp;nbsp;&amp;quot;10/10/2008&amp;quot;&lt;br /&gt;10/10/2008&lt;br /&gt;PS&amp;gt;&amp;nbsp;[System.DateTime]&amp;quot;10/10/2008&amp;quot;&lt;br /&gt;&lt;br /&gt;Friday,&amp;nbsp;October 10,&amp;nbsp;2008&amp;nbsp;00:00:00&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;And you can use types to &amp;quot;strongly type&amp;quot; a variable and make sure it only accepts data that can be converted into the specified type:&lt;/p&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt; # regular variables store any type, and PowerShell picks the type for you:&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt; $date1&amp;nbsp;=&amp;nbsp;&amp;quot;10/10/2008&amp;quot;&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt; # here, PowerShell has chosen the plain vanilla String type:&lt;br /&gt;PS&amp;gt;&amp;nbsp;$date1&lt;br /&gt;10/10/2008&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt; # chose a specific type by appending it to a variable:&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;[System.DateTime]$date2&amp;nbsp;=&amp;nbsp;$date1&lt;br /&gt;PS&amp;gt;&amp;nbsp;$date2&lt;br /&gt;&lt;br /&gt;Friday,&amp;nbsp;October 10,&amp;nbsp;2008&amp;nbsp;00:00:00&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt; # $date2 will only accept data that can be converted to the DateTime type:&lt;/span&gt;&lt;/div&gt;
&lt;div style="FONT-SIZE:20px;BACKGROUND:#faf3e8;FONT-FAMILY:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;$date2&amp;nbsp;=&amp;nbsp;&amp;quot;This&amp;nbsp;is&amp;nbsp;no&amp;nbsp;valid&amp;nbsp;date.&amp;quot;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#faf3e8;"&gt;Cannot&amp;nbsp;convert&amp;nbsp;value&amp;nbsp;&amp;quot;This&amp;nbsp;is&amp;nbsp;no&amp;nbsp;valid&amp;nbsp;date.&amp;quot;&amp;nbsp;to&amp;nbsp;type&amp;nbsp;&amp;quot;System.DateTime&amp;quot;.&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#faf3e8;"&gt;Error:&amp;nbsp;&amp;quot;The&amp;nbsp;string&amp;nbsp;was&amp;nbsp;not&amp;nbsp;recognized&amp;nbsp;as&amp;nbsp;a&amp;nbsp;valid&amp;nbsp;DateTime.&amp;nbsp;There&amp;nbsp;is&amp;nbsp;a&amp;nbsp;unk&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#faf3e8;"&gt;nown&amp;nbsp;word&amp;nbsp;starting&amp;nbsp;at&amp;nbsp;index&amp;nbsp;0.&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#faf3e8;"&gt;At&amp;nbsp;line:1&amp;nbsp;char:7&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#ff0000;background-color:#faf3e8;"&gt;+&amp;nbsp;$date2&amp;nbsp;&amp;nbsp;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;nbsp;=&amp;nbsp;&amp;quot;This&amp;nbsp;is&amp;nbsp;no&amp;nbsp;valid&amp;nbsp;date.&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h2&gt;&lt;span style="color:#3366ff;"&gt;Identifying&amp;nbsp;COM Objects&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;COM objects are a completely different ballgame. COM is the &amp;quot;old&amp;quot; technique used before .NET was invented, and COM objects have no common methods such as &lt;strong&gt;GetType()&lt;/strong&gt;. How do you find the type of a COM object?&lt;/p&gt;
&lt;p&gt;In VBScript, there was a function called &lt;strong&gt;TypeName()&lt;/strong&gt; which worked almost like GetType(). This function is not available in PowerShell, though. Since you cannot access &lt;strong&gt;TypeName()&lt;/strong&gt; or &lt;strong&gt;GetType()&lt;/strong&gt;, are you stuck? Fortunately not.&lt;/p&gt;
&lt;p&gt;Whenever you instantiate a COM object in PowerShell, PowerShell actually adds a .NET interface to it. The good thing is that PowerShell remembers where the COM object came from and adds the property &lt;strong&gt;pstypenames&lt;/strong&gt; to every object. Let&amp;#39;s check that out:&lt;/p&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;$com&amp;nbsp;=&amp;nbsp;New-Object&amp;nbsp;-comObject&amp;nbsp;WScript.Shell&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;$com.pstypenames&lt;br /&gt;System.__ComObject#&lt;span style="color:#ff0000;"&gt;{41904400-be18-11d3-a28b-00104bd35090}&lt;/span&gt;&lt;br /&gt;System.__ComObject&lt;br /&gt;System.MarshalByRefObject&lt;br /&gt;System.Object&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;$com.pstypenames[0]&lt;br /&gt;System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;As it turns out, pstypenames is an array and gives you the conversion history, telling you the derivation of each object. In the example above, the COM object came from a COM Interface with a given GUID. The same works for .NET objects as well:&lt;/p&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;(Get-Date).pstypenames&lt;br /&gt;System.DateTime&lt;br /&gt;System.ValueType&lt;br /&gt;System.Object&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;Now, for COM objects a GUID is nice but does not tell you anything interesting about the interface. You are not getting the information you got from VBScript&amp;#39;s &lt;strong&gt;TypeName&lt;/strong&gt;. The GUID really is the identifier of a COM interface, and to find its name you can look it up in the registry:&lt;/p&gt;
&lt;div style="font-size:20px;background:#faf3e8;font-family:&amp;#39;Consolas&amp;#39;;"&gt;&lt;span style="color:#000000;background-color:#faf3e8;"&gt;PS&amp;gt;&amp;nbsp;$com&amp;nbsp;=&amp;nbsp;New-Object&amp;nbsp;-comObject&amp;nbsp;WScript.Shell&lt;br /&gt;PS&amp;gt;&amp;nbsp;$type&amp;nbsp;=&amp;nbsp;$com.pstypenames[0].Split(&amp;#39;#&amp;#39;)[1]&lt;br /&gt;PS&amp;gt;&amp;nbsp;(Get-ItemProperty&amp;nbsp;&amp;quot;HKLM:\SOFTWARE\Classes\Interface\$type&amp;quot;).&amp;#39;(default)&amp;#39;&lt;br /&gt;IWshShell3&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;The clear text interface name is &amp;quot;IWshShell3&amp;quot; which happens to be exactly the output you used to get from VBScript&amp;#39;s &lt;strong&gt;TypeName()&lt;/strong&gt; method. How did that work?&lt;/p&gt;
&lt;p&gt;PowerShell adds the Interface GUID to the COM type, separated by &amp;quot;#&amp;quot;, so you can use &lt;strong&gt;Split()&lt;/strong&gt; to use this as split mark and get back a string array. The GUID is located in the second element (index 1). This is stored in &lt;strong&gt;$type&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Next, &lt;strong&gt;Get-ItemProperty&lt;/strong&gt; looks up this GUID in your Windows Registry. Since Get-ItemProperty returns all kind of garbage and you are only interested in the (default) entry, only the result of Get-ItemProperty is taken. You then can query the Registry value you need. Since the key we are after contains special characters, it needs to be put in single quotes.&lt;/p&gt;
&lt;p&gt;Ok, I admit this was a deep dive at parts but I still hope you enjoyed this little tour.&lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=102" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/COM/default.aspx">COM</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/type/default.aspx">type</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/GetType/default.aspx">GetType</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/GUID/default.aspx">GUID</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Get-ItemProperty/default.aspx">Get-ItemProperty</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Registry/default.aspx">Registry</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Split/default.aspx">Split</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/-is/default.aspx">-is</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/TypeName/default.aspx">TypeName</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/pstypenames/default.aspx">pstypenames</category></item></channel></rss>