If statement in PowerShell dependant on if RPC Server is unavailable

0

I'm writing a script in PowerShell that ideally would gather information from another server. If it's not able to reach that server, I want to prompt it to have the user manually enter the information. I know how to do all of these, but I'm getting hung up when the RPC Server is unavailable. I will also say that I know how to fix the error when it occurs, but I do not want to rely on my end users to have to go in and fix this.

As an example, if I run:

Get-WmiObject Win32_ComputerSystem -Computer 10.5.21.94

the result I get back is:

Get-WmiObject : The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)
At line:1 char:1
+ Get-WmiObject Win32_ComputerSystem -Computer 10.5.21.94
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], 
COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

I'm trying to find a way to write an if statement that will check to see if the RPC server is available or not, but I'm not sure what to check in order to create a true/false variable. And again, I'm not really looking for someone to tell me how to write the if statement, I'm just trying to figure out any query I can run to determine if I can properly connect to this server and get a result back that can tell me to continue on or not.

powershell
if-statement
rpc
asked on Stack Overflow May 9, 2019 by Christopher Cass • edited May 9, 2019 by Ansgar Wiechers

2 Answers

1

An easy way to get around it in an if-statement is just to ignore potential errormessages with Erroraction and use a -not statement to check whether it can reach the destination or not and then append a $false value to a variable if it can't.

See the below example.

$status = ""
if (!(Get-WmiObject Win32_ComputerSystem -ComputerName 10.5.21.94 -ErrorAction SilentlyContinue)) {
Write-Host "Server is unavailable!"
$status += $false 
}

    else {
    Get-WmiObject Win32_ComputerSystem -ComputerName 10.5.21.94
    }

if ($status -eq $false) {
    $Server = Read-Host "Please enter the destionation"
    Get-WmiObject Win32_ComputerSystem -ComputerName $Server
}
answered on Stack Overflow May 9, 2019 by Ezzi
0

There was a suggestion for a Try/Catch block, but since this is not a terminating error, it didn't work initially. Then I found this:

Try/catch does not seem to have an effect

There is an answer in there about making all errors terminating:

try {

   $ErrorActionPreference = "Stop"; #Make all errors terminating
   get-item filethatdoesntexist; # normally non-terminating
   write-host "You won't hit me";  
} catch{
   Write-Host "Caught the exception";
   Write-Host $Error[0].Exception;
}finally{
   $ErrorActionPreference = "Continue"; #Reset the error action pref to default

}

This gave me exactly what I was looking for!

answered on Stack Overflow May 9, 2019 by Christopher Cass

User contributions licensed under CC BY-SA 3.0