Thomas Lee's collection of random interesting items, views on things, mainly IT related, as well as the occasional rant
Wednesday, September 20, 2017
The PowerShell Book Is Complete
Wednesday, August 30, 2017
VSCode as a replacement for the ISE
Mike Robbins has produced a nice video, which you can find at http://mikefrobbins.com/2017/08/24/how-to-install-visual-studio-code-and-configure-it-as-a-replacement-for-the-powershell-ise/. This video takes you through the process of downloading VSCode, and setting it up as a replacement for the ISE.
It turns out to be remarkably simple to do this. Downloading is easy - and the installation process the normal clickercise approach. Once you get VS Code installed, you can easily configure it to act as the replacement for the ISE.
Once you have your settings configured, you end up with something that looks like this:
It looks and feels almost like the ISE, but with a lot of extra features above and beyond the basics provided by the ISE. These include the ability to determine aliases (and replace them with full cmdlet names), GIT hub/VSTeam Services/Hg integration and a lot more.
If you like the ISE, you are likely to enjoy VS Code!
Wednesday, August 16, 2017
Creating a SHA1 Hash - Using PowerShell
# Create Input Data
$enc = [system.Text.Encoding]::UTF8
$string = "This is a string to hash< $data = $enc.GetBytes($string)
# Create a New SHA1 Crypto Provider
$sha1 = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider
# Now hash and display results
$ResultHash = $sha1.ComputeHash($data)
$ResultHash
The trick to this approach is to convert the string into a byte array and then pass the byte array to the ComputeHash method.
Saturday, July 15, 2017
Managing Azure with PowerShell - A Spiceworks Blog Series
In that role, Spiceworks asked me to create a series of blog posts on the Spiceworks Cloud blog which covers PowerShell and how you use it in the context of Azure. I offered to update some of the content in my upcoming book (See http://tfl09.blogspot.co.uk/2017/04/my-next-powershell-book.html for details). The publisher (Packt Publishing) kindly agreed.
The first article, Introduction to Managing Azure Services Using Windows PowerShell, was posted this week. The next blog post, which looks at getting the modules you need to manage Azure whould be posted sometime next week. A third article on the basics of Azure storage and how to create an SMB share (and access the share across the Internet) is planned and should follow on in due course.
I have a number of additional posts to create, including one on building a Virtual Machine, and another on virtual networks and creating a P2S VPN into the VM. I am very much open to suggestions for more in this series.
Thursday, July 13, 2017
Hyper-V and PowerShell - A Tale of Two Modules
These VMs all run on client Hyper-V, on a Windows 10 (AU) host that has 96gb or ram, 2x6-core XEON processors, and loads of disk. The VMs are nearly all running Windows 2016 Server. The chapters all utilise AD/DNS/DHCP/CA etc. A nice setup for writing a book.
In writing, I've noticed that Windows 10 as well as Windows Server 2016 both ship with two Hyper-V modules. The two modules are version 1.1 and 2.0.0.0, as you can see here:
The version 2.0.0.0 module is a superset of the version 1.1 module. Version 1.1 contains 178 cmdlets, while version 2.0.0.0 contains 235. Both modules have display XML included. Both versions use the same file name, but the Version 2.0.0.0 copy is larger.
You could, or course, manually load version 1.1 module like this:
Import-Module -Name Hyper-V -MaximumVersion 1.1So long as you just use the cmdlets in the 1.1 version, you would be safe, but if your script did load 1.1, then trying to use cmdlets in the 2.0.0.0 module generates what at first sight is a curious message:
The error message is also both wrong and, if taken, confusing. Importing the module as suggested by the error message generates more error messages. The error messages (Error in TypeData, etc) occur because Powershell is trying to load the version 2.0.0.0 copy of the display XML, and most of the components were already loaded from the 1.1 version. And even if you ignore the display XML errors, the suggested solution still fails with the same error message.
The solution to this error is easy: update your scripts to not explicitly load v1.1. OR, if you do need for some reason to use the 1.1 version and use cmdlets in 2.0.0.0, then pressed them with a 'Get-Module Hyper-V | Remove-Module Hyper-V' and then follow the 2.0.0.0 cmdlet with commands to remove the module and reload the 1.1 version. Personally, while that could work, it's awfully messy and possibly not needed.
Does having two versions really matter? If you just use cmdlet names in the Hyper-V module, such as Get-VM, then PowerShell by default loads version 2.0.0.0. If your script uses Import-Module to load the Hyper-V module explicitly, then again by default, PowerShell loads 2.0.0.0. Having written over 100 scripts across a dozen different Server 2016 features and roles - I never noticed any problems. My scripts, with a few exceptions, relied on PowerShell's module autoload feature - I called the cmdlet and PowerShell loaded one.
If your scripts, on the other hand, explicitly load V 1.1 (as shown above), then you may get a strange error. But in most cases, that can be avoided by simply not explicitly loading version 1.1 of the module. Now I know there may be cases where you may need to use a V 1.1 cmdlet, but those cases should be pretty rare.
Monday, June 26, 2017
Setting Application Pool Recycling Values with PowerShell
With IIS, you can create applications that run in application pools. An application is some set of web pages (with related executables). An application pool is a process, or processes, that run this application. This provides process isolation between applications reducing the impact a badly behaved application can have on other applications running on the same server. Resource leaks can bring an entire web server down, for example.
One way to minimise these sorts of issues is to recycle the application pool - just stop then restart the processes running the application. A neat trick that reduces the risks of resource leaks. One downside is that any state within the application is lost. Needless to say, there are other ways to save state that are not affected by an application pool restart. For a fuller look at the things you can do to configure application pools, see: https://technet.microsoft.com/en-us/library/cc745955.aspx. This document is old, but is a good starting point (and worked fine on IIS 10 for my needs).
You set application pool recycling values, using PowerShell, by setting item properties on certain items within the WebAdministration provider (the IIS: drive). This is simple, but the property names are not all that obvious at first.
What I wanted to do was:
- Set specific times at which to recycle the application pool
- Set the pool to automatically if private memory rises beyond a limit, say 1GB.
- Set the pool to recycle the pool after the pool processes a certain number of requests, say 1 million.
In PowerShell, once you know where to look, this is simple:
# Set Application Pool Restart time Clear-ItemProperty IIS:\AppPools\WWW2Pool -Name Recycling.periodicRestart.schedule $RestartAt = @('07:55', '19:55') New-ItemProperty -Path 'IIS:\AppPools\WWW2Pool' -Name Recycling.periodicRestart.schedule -Value $RestartAt # Set Application Pool Maximum Private memory Clear-ItemProperty IIS:\AppPools\WWW2Pool -Name Recycling.periodicRestart.privatememory [int32] $PrivMemMax = 1GB Set-ItemProperty -Path "IIS:\AppPools\WWW2Pool" -Name Recycling.periodicRestart.privateMemory -Value $PrivMemMax # Set max requests before a recycle Clear-ItemProperty IIS:\AppPools\WWW2Pool -Name Recycling.periodicRestart.requests [int32] $MaxRequests = 100000 Set-ItemProperty -Path "IIS:\AppPools\www2POOL" -Name Recycling.periodicRestart.requests -Value $MaxRequests
Some things that caught me out a bit:
1. Finding out the property names. In the case of recycling after 1m hits, the property name is 'Recycling.periodicRestart.PrivateMemory'. I suspect this naming is used by the provider to access the underlying XML that IIS actually uses to hold configuration information.
2. Finding values is easy, if there is one. I found the easitest way to set these values was to first clear the property, then set it.
3. Some item properties take properties of a certain type. It helps to specify the type (as shown above) as some times PowerShell tries to be helpful which can confuse the provider.
Tuesday, May 02, 2017
AD User Properties In PowerShell
One issue that arises often is around getting properties back from a user object in Windows Active Directory. Typically we see posters knowing the GUI interface in Active Directory Users and Computers (ADUC), and wanting to get the same details. Although it is NOT new, I found a great resource the other day: Mappings for the Active Directory Users and Computers Snap-in.
This page, which has numerous subpages, maps the fields you find on the property sheets inside the ADUC MMC snap-in to the properties names you get/set using the Microsoft provided AD cmdlets.
For example, if you have set an Office address on the OU Managed By property sheet, you need to use the Physical-Delivery-Office-Name property from Get-Organizational unit to obtain that information. Likewise, the General Property Page for a user object shows First Name (property givenName), Last Name (sn), and the Display Name (displayName).
This page has links for:
- Computer Object User Interface Mapping
- Domain Object User Interface Mapping
- Group Object User Interface Mapping
- Object Property Sheet
- Organizational Unit User Interface Mapping
- Printer Object User Interface Mapping
- Shared Folder Object User Interface Mapping
- User Object User Interface Mapping
Saturday, April 29, 2017
Top 50 PowerShell Blogs
I started this blog in 2003 - and first blogged about PowerShell (well, it was called Monad in those days) on 1 Nov 2003. It's been a long run with PowerShell - since that first day when Jeffrey Snover presented 'Batch Scripting, what you can do in 7 lines of code' to PDC 2003.
As Robert Hunter once wrote (and the Grateful Dead sang) "What a long strange trip it's been".
My Next PowerShell Book
- What’s New in PowerShell
- Implementing NanoServer
- Managing Windows Updates
- Managing Printers
- Managing Server Backup
- Managing Performance
- Troubleshooting Servers
- Managing Windows Network Services
- Managing Network Shares
- Managing IIS
- Managing Hyper-V
- Managing Azure
- Using Desired State Configuration
[Later]
Publication should be early October. Sadly, my planned co-author had to drop out of the writing due to personal commitments. Additionally, I had to scale back a bit on the contents. The original plan was to write 450 pages. The book ended up something like 650!
Saturday, January 28, 2017
Nested Hyper-V with Windows 10
Nested Hyper-V is a feature that enables you to create a virtual machine, and then load Hyper-V into that machine. So you can have a VM running VMs. This feature is cool, certainly at a technical level. No doubt someone is going to point out that VMware supports this, but the feature is new in Hyper-V on Server 2016. And interestingly enough, it works in Windows 10 Anniversary Update too!
Why does it matter? For me, it matters since I am writing a book on PowerShell showing its range and depth. One chapter covers Hyper-V and having Nested Hyper-V means I can create two VMs (HV1, HV2) cluster the VMs, then create clustered virtual machines, The chapter is now easier to write.
The feature matters for customers too. This enables you to use Hyper-V containers within a VM on a VM. And, it's a fantastic training tool when using on-line labs. The lab vendor, such as Virsoft (a great hosted labs experience!), to provide a student with a VM, in which they can load and use Hyper-V. Previously that was unsupported.
Getting nested Hyper-V to work is great news. For some time, I believed that this would not work on my systems. I have three big Dell Precision 7500 systems. When I tried this during the beta of Windows Server 2016, Coreinfo.exe suggested that my system did not support SLAT. And that meant I could not use nested Hyper-V. But it was wrong!
Here's a picture of a VM hosting a nested VM:
As you can see, a VM running a nested VM. The nested VM, which I called 'embedded' is in the midst on installation.
It turns out that the fix was pretty simple. In the host VM, I just had to issue a simple PowerShell command:
Set-VMProcessor -VMname DC1-ExposeVirtualizationExtensions $TrueI had to shut down the VM first, then reboot. Once rebooted, I was able to bring up the Hyper-V console and create the embedded VM.
Saturday, January 21, 2017
Grammarly
Grammarly is a browser plug in for the Chrome browser which provides spelling and grammar advice. A spell and grammar checker on steroids. On my main writing workstation, I have Grammarly loaded and running all the time. It almost feels like a part of the underlying browser, but with nice bells and whistles.
I am currently working on a book for Packt, and we have a sweet content development portal. We just go to the web site and use the text editing features to enter the text and graphics. We can then output to PDF - it works well. Inside this CDP, Grammarly is wonderful!
When I am entering content in the CDP, you can see Grammarly when it has something it's not happy with, like this:
In practice, I write and insert code/pics, then repeat and repeat. I touch type, but not with perfect accuracy. For me, at least, it's faster to leave a typo in the sentence and continue typing than to fix the error then carry on. I can then just use the mouse to fix the errors - and that works well for me!
The free version is excellent. But for a fee, there's a Professional version that adds a significant number of additional grammar checking rules, including passive voice as well as a plagiarism checker. The Pro version is billed either monthly ($US 37.95), quarterly ($US 24.98), and annually ($US 11.66). At the moment, there is a 20% reduction - but I do now know how long that will last - with the discounts the prices are $29.95, $19.98, and 11.66 per month).
On the downside, several of us have noticed that with Grammarly turned on, our content deployment system can crash. This is a pain, but regular saves, autosave turned on, and bit of experience - recovery is usually pretty easy. I can live with the occasional hang in exchange for such a great product.
Friday, January 20, 2017
WMF 5.1 released for download
If you are using Windows 7 or Windows Server 2008 R2, you should be a little careful installing this package. The installation instructions were changed - so read the release notes carefully.
It should be clear from the blog post, but if not: if you are using Windows 10 AU or Windows Server 2016, there is nothing for you to do. Those two operating systems ship with WMF 5.1 installed.
Wednesday, January 18, 2017
Using Get-CimAssociatedInstance
Initially, I searched through the many Win32_Classes and found one that looked promising (Win32_LogonSession). So I tried looking at the interactive logons:
Get-CimInstance Win32_LogonSession | Where-Object LogonType -EQ 10But that returned me a somewhat unhelpful response:
I wanted the username (and the SID). So I searched around a bit and found a class name that looked appealing: win32_loggedonuse. Turns out this is one an associator class. In WMI, the associator associates two other instances in the WMI database. In this case. the associator class associates a Win32_LogonSession with the WIn32_Account that is logged on in that session.
So I turned it into a tool :.
Function Get-WhoIAm {And for fun, I set an alias of WhoAmi - a tool I've used for a decade or longer. With that done, the output looks like this:
# Get Account for the loggede on user$Me = Get-CimINstance Win32_LogonSession | Where-Object LogonType -EQ 10 | Get-CimAssociatedInstance -Association win32_loggedonuser
# Extract useful properties$IAmHT = [ordered] @{}$IAmHT.Account = $Me.Caption$IAmHT.Description = $Me.Description$IAmHT.LocalAccount = $Me.LocalAccount$IAmHT.PasswordChangeable = $me.PasswordChangeable$IAmHT.SID = $Me.SID$IamHT.CommputerName = (Get-CimInstance -Classname Win32_Computersystem).Name
# Create a new object$IAm = New-Object -TypeName PSCustomObject -Property $IAmHT
# And return the Iam objectreturn $IAm
}
Happy days with WMI and the CIM Cmdlets.
Friday, December 23, 2016
Building a GUI with PowerShell
Sapien's PowerShell Studio (see https://www.sapien.com/software/powershell_studio for more information) works very well, but it is commercial. And at a price of £389, out of reach to many folks.
I just discovered a cool online site that does a great job of building a GUI with PowerShell - for free: https://poshgui.com/#. The starting page looks like this:
This is not anywhere near as rich as Sapien's tool, but great for really simple GUI development. Once you get the form right, just copy/paste it into the ISE and away you go!
Thursday, December 22, 2016
PowerShell cmdlet documentation is open source - COOL!
I was recently teaching a PowerShell course, and we looked at the definition the NAME parameter in Get-Service. It stated that the parameter did not accept wild cards. But it did. That made the demo sub-optimal.
So what's the obvious thing to do? Easy: just fix it! And you can! If you look at the online version of the cmdlet's documentation (here: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.management/get-service) the page looks like this:
In the upper right-hand corner is a little button Contribute. You do need to be logged in with a Microsoft Live ID to see the contribute icon.
Clicking Contribute takes you to the GitHub page for this document. All you have to do is to click on the Edit (the pencil icon), make the changes, and create a pull request. The pull request asks the doc team accept your update. Then send it and away you go. The whole process is automated and very quick and easy. The pull request is reviewed before being accepted - and as part of that process, the doc team can ask for something more/different. The process is very slick.
And finally, when you DO have the pull request accepted, your Live ID picture appears on the page. COOL - my face on the PowerShell documentation.
Sunday, September 04, 2016
My Ten Tips For Technical Writing
I have written many hundreds of thousands of words over my career – not only work product, but books, trade publication articles and so on. Over that time, I’ve read far more then I’ve written. And in that time, I’ve slowly developed a set of rules for how I write. Or for how I hope to write!
In my career, I have had three great writing mentors: Keith Burgess, Roy Chapman, and Susan Greenberg. Keith was a partner at what was then Arthur Andersen Management Consultants who I worked directly throughout my time there (and was to work for again 20 years later). I did work for Roy over the years, he was a master at writing. Susan Greenberg was an amazing instructional designer at Microsoft and a great teacher. All these people strove for excellent writing – and each helped me to learn to write better.
My ten rules are really pretty straightforward. Some can easily be converted in to muscle memory – your hands just type better text. And when I see some of my rules broken in other people’s writing – it drives me nuts. Those authors who have had me as an editor will recognise some of them!
So here are my ten rules for better writing:
- Avoid future tense This rule has a couple of benefits. Some languages deal with future tense differently to English – present tense is easier. Also future tense may make the writing harder to understand. For example: if you say “clicking on the foo button will make bar happen”. So the question is when will that happen? Is it immediate? Will bar happen in a minute/hour/day? Better to say: ‘Clicking on the foo button makes bar happen.
- Avoid passive voice Passive voice is, to cite Wikipedia,a grammatical construction where the noun that would be the object of an active sentence appears as the subject of the sentence. Active voice, for example “Our company builds the best widgets whilst in passive voice it’s “The best widgets are built by our company. Sentences with passive voice add words to the sentence (6 vs 8 words). They can also make the reader work harder to understand the intended meaning.
- No split infinitives Yeah – I know: To Boldly Go and all that. But an infinitive is a single idea – splitting it makes understanding more difficult. You should avoid that.
- What is it, so what This is one of the lessons Susan Greenberg beat into me. It’s simple really: when you are writing about something, you should explain what it IS, before telling us why it matters. I really hate reading about some product or technology where the writer spends the first few paragraphs telling me why it was cool, without ever explaining precisely what ‘it’ actually is. Define your terms, THEN tell me why I need this product.
- Organise carefully I learned this lesson watching Keith Burgess. When you are writing a client report, or a magazine article, you have a purpose. That purpose could be to justify a project, or to explain a product or product feature. You need to organise your thoughts carefully, progressing from premise through to conclusion. You are taking the reader on the journey. We all know authors who veer widely off topic with annoying regularity.
- Decide on 2nd person vs 3rd person This is about how you are talking to the reader. Do you say: “You do X to make the Y feature work” or “The user does X to make the Y feature work”. I prefer to directly to the reader, you, vs some one else, eg the user, the manager, the IT Pro. I like to talk directly to the person who is reading.
- Gender neutrality - or not This is one where political correctness can abound. I see some writers trying to be cute and always using ‘she’, or ‘chairwoman, or those being politically correct, eg the chairperson. I have views here – but the level of neutrality you need will depend on the target audience. You do need to be sensitive to your audience
- The Oxford Comma This one is subjective – some ignore it, others insist. It’s called Oxford comma because it was used by printers, readers, and editors at Oxford University Press. It can clarify the meaning of a sentence when the items in a list are not single words.
- Be balanced I like to see the good news AND the bad news. Nothing I hate more than pure puff pieces – ones that just say good things about a product. Likewise, I dislike totally negative articles. I’ve prefer writers that see both sides, who are balanced in their coverage. NO product is perfect.
- If you can't say something nice, say nothing at all Rarely, but on occasion, I’ve had occasion to use this rule. I’ve been asked to write about products or technologies I just do not believe in. I’ve found it easier to just not write an article than write one that is just negative.
That’s it. Simple really!
Wednesday, August 03, 2016
Windows 10 Anniversary Edition–You’re Fired!
Like many, I was excited about the progress that Microsoft made with WIndows 10 and was looking forward to running the final version! Sadly, my enthusiasm was short lived.
I have a nice home workstation: dual processor/ hex core, 96gb of ram and 4tb of disk – and a nice pair of modern 24 inch TFT panels. I have two other systems of similar size under my desk – these run Server 2016 TP5. All three systems are connected to the twin TFTs via a nice Lindy 4 port HDMI/USB KVM switch. The two servers use just one screen, whereas the workstation has one output going to the KVM, the other direct to the right screen. Having two screens has become not only natural, but important for work. Being able to have three large windows open is now normal practice.
So, last night I saw there was an update and I agreed. Go for it, I thought. The ‘upgrade’ took nearly an hour all told. But then I got the logon screen. After logon I got my first bit of bad news: Only one screen. The other two systems on the KVM switch work perfectly – the Windows 10 machine would not project to the second panel. I tried all the normal tricks of plugging things in, power cycling everything, etc. But I carried on.
Then the next bit of bad news: application compatibility. First, Network Monitor – AE gave me toast saying it was not supported. NO problem, I thought – I have Wireshark. Second, Foxit PDF reader started behaving oddly. If I double clicked a PDF in a mail in Outlook, the file opened, but Foxit immediately crashed.
Then came the proverbial 3rd strike. I fired up a VM (The old box ran around 10-12 VMs albeit not at the same time). I double clicked on the VM, and the VM Connect box errored out. I tried again. Error.
Sorry Microsoft, losing the second screen. having app compatibility issues with key tools, and no being able to see inside my VMs is simply unacceptable. I can not accept the downgrade in functionality. Frankly, for me an OS is just a tool. The changes for me are mainly cosmetic – except of course for PowerShell (but I can get that separately anyway).
So I reverted. Foxit works, as does Netmon. VM Connect works just fine. And I have my two screens back. Sorry Microsoft. Sorry Windows 10 Anniversary Edition, but You’re Fired.
Saturday, June 18, 2016
Backing up SSD Disk In Azure
Given all the coverage of the LinkedIn purchase, you may have missed the latest feature update in Azure: you can now backup data stored on Azure hosted SSD Storage using Azure backup.
Azure Premium storage allows you to provision SSD disks in the cloud – which naturally speeds up I/O operations and improves performance of workloads like SQL Server. Unlike traditional (i.e. spinning disk) storage in Azure, you pay for the disk you provision irrespective of how much you use. Traditional storage is billed based on the amount of storage actually used.
Like just about every feature area in Azure, Premium Storage is an evolving story. Last month, Microsoft announced that you could use Azure Site Recovery to replicate to Premium storage.
The most recent announcement means a VM using Premium Storage for storing VHD and other data can now be backed up with Azure backup. There is some documentation on the Azure documentation site: https://azure.microsoft.com/en-us/documentation/articles/backup-azure-vms-first-look-arm/.
With this updated feature, you can now fully backup any Azure VM, whether V1/ARM irrespective of storage used (spinning disks vs premium SSD storage). You can specify the replication options to enable LRS vs GRS, define the backup goals, set policy and specify what to backup. Backup is pretty straight forward!
Thursday, June 16, 2016
Windows Server 2016–Coming Soon (and a free e-book)
Windows Server 2016 is coming soon. While Microsoft has not issued a formal release or launch date yet, the updated server OS is due out sometime in the coming months. As I understand it, we are likely to see one further technical preview before RTM. I’m expecting RTM to be over the summer and expect to be able to download it from MSDN soon after. We’ll see how accurate my guesstimates are – and no I have NO inside information.
A sign that the new OS is coming soon is the release of a new e-book: Introducing Windows Server 2015 Techical Preview. It’s a bit dated (it was released in April) but has great details of the key new features of Server 2016, including Nano Server, Containers and the huge host of other updated or new features. I have downloaded the PFD and have been reading it on my train journeys to/from London.
Wednesday, May 18, 2016
Finding Type Information in PowerShell
On frequent occasions, I find myself using a cmdlet and needing more information about the objects that cmdlet produces. The details are in Microsoft’s MSDN library, but it can be hard to use the GUI to find it. Fortunately, I found a cool way of dealing with this. I found the trick on the Internet but I really can not remember where I found it.
The trick is simple: I use some Type XML to extend all objects with a new script method called MSDN. If I create an object – I can assign it to a variable and just call the .MSDN() method on any occurrence. Suppose I did a Get-ChildItem against the Certificate Provider and needed more details on the object returned. I just do this:
$Certs = Get-ChildItem Cert:\CurrentUser\My
$Certs[0].MSDN()
The MSDN() method, something I’ve added in, then brings up Internet Explorer and nvigates to the appropriate page in the MSDN library. Which is: https://msdn.microsoft.com/library/System.Security.Cryptography.X509Certificates.X509Certificate2.ASPX.
But how did that method come about – you might ask! Easy – it’s just a bit of type XML I add to each system I use. I just add an xml file and reference it in my PowerShell profile. The XML file looks like this:
<Types>
<Type>
<Name>System.Object</Name>
<Members>
<ScriptMethod>
<Name>MSDN</Name>
<Script>
if (($global:MSDNViewer -eq $null) –or
($global:MSDNViewer.HWND -eq $null))
{$global:MSDNViewer = new-object -ComObject InterNetExplorer.Application}
$Uri = "http://msdn2.microsoft.com/library/" + $this.GetType().FullName + ".ASPX"
$global:MSDNViewer.Navigate2($Uri)
$global:MSDNViewer.Visible = $TRUE
</Script>
</ScriptMethod>
</Members>
</Type>
</Types>
I have saved this into a file (I saved it as c:\foo\my.types.ps1.xml) then in each PowerShell profile I just add it in:
Update-TypeData -appendPath C:\foo\my.types.ps1xml
And from then on, you can just use the MSDN method on just about any type. It’s not perfect – sadly there are types/classes that do not appear documented in MSDN (or at least now where this little XML trick can find it).
If you know where this came from, Please comment – I just can’t remember where I found it!








