This may help with testing for RPC availability. function Test-Port{ Param([string]$srv,$port=135,$timeout=1000,[switch]$verbose) $ErrorActionPreference = "SilentlyContinue" $tcpclient = new-Object system.Net.Sockets.TcpClient $iar = $tcpclient.BeginConnect($srv,$port,$null,$null) $wait = $iar.AsyncWaitHandle.WaitOne($timeout,$false) if(!$wait) { $tcpclient.Close() if($verbose){Write-Host "Connection Timeout"} Return $false } else { $error.Clear() $tcpclient.EndConnect($iar) | out-Null if($error[0]){if($verbose){write-host $error[0]};$failed = $true} $tcpclient.Close() } if($failed){return $false}else{return $true} }
-----Original Message----- From: Michael B. Smith [mailto:mich...@smithcons.com] Sent: Friday, April 16, 2010 2:51 PM To: MS-Exchange Admin Issues Subject: RE: powershell/.NET question Well....I don't think you can actually do that. But there are actually two potential issues. One you've identified and I'll give you a script to help with that. The other is that a firewall is running and blocking RPC. I can't much help you with that one, except to tell you that it can be controlled via group policy. Here is how you execute a ping in PowerShell to alleviate the first issue. (You'll need to remove the "log" statements or substitute your own logging infrastructure.) This works in v1 or v2 of PowerShell. function test-ping ([string]$server) { [string]$routine = "test-ping:" trap { # we should only get here if the New-Object fails. log $routine "Cannot create System.Net.NetworkInformation.Ping for $server." return $false } $ping = New-Object System.Net.NetworkInformation.Ping if ($ping) { trap [System.Management.Automation.MethodInvocationException] { log $routine "Invalid hostname specified (cannot resolve $server)." return $false } for ($i = 0; $i -lt 5; $i++) { $rslt = $ping.Send($server) if ($rslt -and ($rslt.Status -eq [System.Net.NetworkInformation.IPStatus]::Success)) { log $routine "Can ping $server. $routine successful on attempt $i." $ping = $null return $true } sleep -seconds 1 } $ping = $null } log $routine "Cannot ping $server. $routine failed after 5 attempts." return $false } Regards, Michael B. Smith Consultant and Exchange MVP http://TheEssentialExchange.com -----Original Message----- From: Bill Egan [mailto:william.e...@gmail.com] Sent: Friday, April 16, 2010 3:30 PM To: MS-Exchange Admin Issues Subject: OT: powershell/.NET question Sorry for the off topic post, but since many of you are powershell whizzes, I thought I'd give it a try. And forgive my inefficient code... So I am trying to put together a script to get the value of a registry key for every computer in the domain - this case the WSUS susclientid - and have come up with this (after plagiarizing the connection to remote registry with the .NET object): ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ $erroractionpreference = "SilentlyContinue" Write-Host "Server Value" Write-Host "------------------------------------------------------------------" Foreach($srv in get-qadcomputer){ $srvname = $srv.name $key = "SOFTWARE\Microsoft\Windows\CurrentVersion\windowsupdate" $type = [Microsoft.Win32.RegistryHive]::LocalMachine $regKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($type, $srvname) $regKey = $regKey.OpenSubKey($key) $val = $regKey.GetValue("susclientid") Write-host $srvname.PadRight(30) -nonewline Write-Host $val $val = "-----" } +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ And it sort of works. I think I have a few things to deal with in error handling and output format, but debugging and figuring that out is quite difficult since the script takes *hours* to run. I think the problem is that of the 725 computer objects in this domain, many of them are offline and the .NET object needs to timeout on each system that it cannot reach. And the timeout period appears to be ~45 seconds. Would anyone be able to tell me how I can set the timeout of the [Microsoft.Win32.RegistryKey] connection down to like 5 seconds? thanks and sorry again for the off topic question. b ************************************************************************************************** Note: The information contained in this message may be privileged and confidential and protected from disclosure. If the reader of this message is not the intended recipient, or an employee or agent responsible for delivering this message to the intended recipient, you are hereby notified that any dissemination, distribution or copying of this communication is strictly prohibited. If you have received this communication in error, please notify us immediately by replying to the message and deleting it from your computer. **************************************************************************************************