Help with error handling

This topic contains 9 replies, has 3 voices, and was last updated by Profile photo of Alex Alex 6 months, 3 weeks ago.

  • Author
    Posts
  • #38600
    Profile photo of Gary Smith
    Gary Smith
    Participant

    Hi Guys, how can I catch $UserInfo.Manager being empty or not found?
    If it is empty I would like it to tell me then exit, if it not found I would like it to go to next step of checking AD.

    I'm trying to catch it if it is a SharedMailbox that has no owner, as opposed to its not a exchange object so move on to checking AD.

    Function Get-Owner {
    
    Param(
    	[Parameter(Mandatory=$true)]
    	[string]$object
    	) #exit Param
    
    Write-Verbose "Connecting to Exchange"
    getExchangeSession
    	
    Try
    {
    	Write-Verbose "Looking for Owner on Exchange"
    	$UserInfo = Get-User -Identity $Object #-erroraction 'silentlycontinue'
    	$UserInfo.Manager
    }
    Catch[System.Management.Automation.CommandNotFoundException]
    {
    Write-Verbose "ManagedBy Not Found on Exchange!" -Verbose
    Write-Host "CommandNotFoundException"
    }
    Catch{
    Write-Verbose "Not Found on Exchange"
    Write-Host "Other exception"
    }
    Finally{
    if ([string]::IsNullOrEmpty($UserInfo.Manager)){
    	Write-Verbose "Checking AD" -Verbose
    	$ManagedBy = Get-ADGroup -Identity $Object -Properties ManagedBy 
    	$ManagedBy.ManagedBy
    }
    }
    Get-PSSession | Remove-PSSession
    }
    
  • #38621
    Profile photo of Michael Maher
    Michael Maher
    Participant

    Hi Gary,

    I don't have Exchange here so I can't test the code but to test a condition in PowerShell is ridiculously easy.

    $UserInfo = Get-User -Identity $Object #-erroraction 'silentlycontinue'
    if ($UserInfo.Manager){
    # Means its not Null
    Run your code
    }
    

    Your example code has two Catch statements – An error message somehow got embedded in there with one of them.

    Also the Finally block is the clean up area rather than where the main code should be executed. Here's an example (again I haven't run it given I've no Exchange but it should get you going again)

    I also removed Write-Host. Although Jeffrey Snover did do a presentation with Don Jones recently and said it's no longer a faux pas for scripts. I didn't hear why though so better to use Write-Output or continue your use of the Write-Verbose cmdlet.

    Function Get-Owner {
    
    Param(
    	[Parameter(Mandatory=$true)]
    	[string]$object
    	) #exit Param
    
    Write-Verbose "Connecting to Exchange"
    #getExchangeSession
    	
    Try{
    	Write-Verbose "Looking for Owner on Exchange"
    	$UserInfo = Get-User -Identity $Object #-erroraction 'silentlycontinue'
    	
        if ($UserInfo.Manager){
    	    Write-Verbose "Checking AD" -Verbose
    	    $ManagedBy = Get-ADGroup -Identity $Object -Properties ManagedBy 
    	    $ManagedBy.ManagedBy
        }
    }
    
    Catch{
        Write-Verbose "ManagedBy Not Found on Exchange!" -Verbose
    }
    
    Finally{}
    
    Get-PSSession | Remove-PSSession
    }
    
  • #38656
    Profile photo of Gary Smith
    Gary Smith
    Participant
    $UserInfo = Get-User -Identity $Object
    if ($UserInfo.Manager){
    # Means its not Null
    Run your code
    }
    

    Correct me if I am wrong but wouldn't this be null if the user is not found on exchange or if the manager is not set? I'm struggling to find a way of managing these 2 things.

    The error code above was just a test, i was finding mixed results so was testing it with a few different exceptions. That was my mistake, I should have cleaned that up before posting.

    I'll have more time to look at this later but looks like JRV had the same problem.

    https://social.technet.microsoft.com/Forums/scriptcenter/en-US/dbb95788-28ca-4327-89f2-26ca070fda63/powershell-remote-sessions-trycatch-erroractionpreference?forum=ITCG

  • #38669
    Profile photo of Alex
    Alex
    Participant

    As previously mentioned you can use an IF statement, I just want to point out, you can use something like:

    If(!$UserInfo.Manager){
    Write-Error "Your Custom Error Message"
    Break
    }
    

    What this will do is write an error message to the screen and then break out of the script if the variable is empty.
    Having the "!" in front of the variable basically tell the if statement "If the variable is null" rather than "If the variable is not null".
    Which means you don't have to encase your entire script in an if statement.

    Apologies, I should have read your entire post.

    You could possible try running it on a try catch block, along the lines of:

    
    Try{
    $UserInfo = Get-User -Identity $Object
    $userinfo.manager
    }
    catch{
    if ($error[0] -matches "does not exsist"){do something}else{do something else}
    }
    
    

    If the error messages are different between it not existing and not being set then, in theory it might work.

    Hope this helps.

  • #38709
    Profile photo of Gary Smith
    Gary Smith
    Participant

    Thank you Alex. I think I see where I have been going wrong. I didn't have the code block in the try block. I will do some testing now and see if they return different errors and see if this method returns the required results.

  • #38766
    Profile photo of Alex
    Alex
    Participant

    Okay, let me know how the testing goes 🙂

  • #38811
    Profile photo of Gary Smith
    Gary Smith
    Participant

    Thanks, I used a few different things that you both helped me with to finally get it working.
    But it checks for owner of mailbox\email, DL, aduser.. hopefully, I haven't missed anything..

    It's still a mess, but I'll deal with that when I learn more.

    Function Test-GetOwner {
    
    Param([Parameter(Mandatory=$true)][string]$object)
    
    Write-Verbose "Connecting to Active Directory" -Verbose
    Import-Module ActiveDirectory
    
    Write-Verbose "Connecting to Exchange" -Verbose
    getExchangeSession
    
    $MailboxUser = Get-Mailbox -Identity $object -ErrorAction SilentlyContinue
    if($MailboxUser -eq $null){
    	Write-Host "Not Found on Exchange. Continue checking AD"
    		Try{$User = Get-ADUser -Identity $Object -Properties Manager}
    		Catch{If($User -eq $null){
    		Write-Verbose "No User Found in Active Directory, Check if Group" -Verbose
    			$DLname = Get-ADGroup -Identity $object -Properties ManagedBy
    			if($DLname.managedby -eq $null){
    				Write-Host "Distribution Group found but no Manager"}
    			else{$DLname.managedby}
    		}
    	Else{If($DLname -eq $null){
    	Write-Host "Not a Active Directory Account or Group. Terminating Function"}
    	break}
    	break}
    if($User.Manager -eq $null){
    	Write-Host "No Manager found on Active Directory. Terminating Function"
    	Write-Verbose "Remove ALL exchange sessions" -Verbose
    Get-PSSession | Remove-PSSession
    	break}
    	else{$User.manager}	
    	}
    
    else{Write-Host "Found on Exchange"
    	$ExchangeUser = Get-user -Identity $object  | Select Manager 
    	if($ExchangeUser.Manager -eq $null){Write-Host "There is no owner of this Email"}
    	else{$ExchangeUser.Manager}
    	}
    Write-Verbose "Remove ALL exchange sessions" -Verbose
    Get-PSSession | Remove-PSSession
    }
    
  • #38817
    Profile photo of Alex
    Alex
    Participant

    Looks good. The only thing I would look at, is

    Write-Host "Not Found on Exchange. Continue checking AD" 
    

    and

    Write-Host "Distribution Group found but no Manager"
    

    I would have as write-warning (so they always appear without having to run the function with the -verbose option. That is more a preference though.

  • #38978
    Profile photo of Gary Smith
    Gary Smith
    Participant

    I'll look at it. Thanks.
    I don't think verbose is working the way it should anyway as it always shows which wasn't what I wanted.

  • #38979
    Profile photo of Alex
    Alex
    Participant

    When you are writing the "Write-verbose" don't include the -verbose parameter, it seems to always display it when set. (just tested it on my machine).

    so just have:

    write-verbose "the text in here"
    

You must be logged in to reply to this topic.