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. 
**************************************************************************************************




Reply via email to