Gosh, I was attempting to RDP to a remote server today at work when I realised that the RDP Session is dead with the infamous grey screen. I decided that it fine, I will use PowerShell to remotely view the processes on the remote server and I found WMI is leaking over 2000 handles.
Hmmm… I thought to myself, I should be able to issue an Invoke-Command to remotely kill the process since I don’t have a GUI on that remote 2003R2 server. But all I got is an error output stating that WinRM is not configured.
So I issued Get-Service to remotely query that 2003R2 server and found out that WinRM service does not exist. I am not surprised because 2003R2 does not have this WinRM service by default anyway.
I got home and decided to draft a PowerShell Cmdlet for testing WinRM and this is how these codes come about.
Download Link – http://gallery.technet.microsoft.com/Test-WinRM-91734e31
This is extremly handy for me now and you can download this free from the link above.
function Test-WinRM { <# .SYNOPSIS Test Windows Remote Management .DESCRIPTION Allows the administrator to test Windows Remote Management is working or not on localhost and remote server. It will enable administrator to be able to establish a quick test of the Windows Remote Management in their environment and assess the possibility of executing powershell script remotely. .PARAMETER ComputerName Specify a hostname for query. .PARAMETER Test Specify to continous testing until stopped. To stop -type Control-C. .EXAMPLE Test-WinRM -ComputerName Redmond This initiate a Windows Remote Management test on Redmond server .EXAMPLE Test-WinRM -ComputerName Contoso -Test True This initiate a continuous Windows Remote Management test on Contoso server until user initiate to stop the test using Control-C. If Windows Remote Management not running on Contoso, it will continously return False. .EXAMPLE Test-WinRM -ComputerName Contoso -Verbose VERBOSE: WinRM - Running This initiate a Verbose output. .EXAMPLE $Test = Test-WinRM -ComputerName Redmond ; if($Test -eq $True){ write-host "Yes!!! Eureka!!! It works!" } Yes!!! Eureka!!! It works! This utilises the returned boolean value as True or False for other condition statement. .LINK Windows Remote Management http://msdn.microsoft.com/en-us/library/windows/desktop/aa384426(v=vs.85).aspx Installation and Configuration for Windows Remote Management http://msdn.microsoft.com/en-us/library/windows/desktop/aa384372(v=vs.85).aspx .NOTES Author : Ryen Kia Zhi Tang Date : 23/07/2012 Blog : ryentang.wordpress.com Version : 1.0 Windows Server 2003 R2: WinRM is not installed by default, but is available as the Hardware Management feature through the Add/Remove System Components feature in Control Panel under Management and Monitoring Tools. #> [CmdletBinding( SupportsShouldProcess=$True, ConfirmImpact='High')] #define command parameters param ( [Parameter( Mandatory=$False, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)] $ComputerName = $env:computername, [Parameter( Mandatory=$False, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)] [Alias('T')] [Switch] $Test ) BEGIN { #clear variable $Result = "" } PROCESS { do{ try { #invoke a command to get WinRM service status $Result = Invoke-Command -ComputerName $ComputerName -ScriptBlock {Get-Service | Where-Object {($_.Name -eq "WinRM") -and ($_.Status -eq "Running")}} -ErrorAction Stop #success output if($PSBoundParameters['Verbose']) { Write-Verbose "WinRM - Running" }else{ $True} }catch{ #failure output if($PSBoundParameters['Verbose']) { Write-Verbose "WinRM - Not Running"; Write-Error $_.ToString() }else{ $False } } #verify if -Test parameter is specified if($Test) { Continue }else{ Break } }while(!$Result?) } END { } } #end of #function Test-WinRM