You can’t do it that way, for a subtraction. You must use either the Remove() 
or RemoveAt() methods, on the RemoteIpRanges result.

How, precisely, to do it is going to be dependent on the exact format of the 
$HostIPConv variable.

From: [email protected] [mailto:[email protected]] On 
Behalf Of Sean Martin
Sent: Friday, December 5, 2014 2:13 AM
To: [email protected]
Subject: Re: [Exchange] PowerShell Help

So that works when adding an IP address (thank you!), however, I receive the 
following when attempting to remove an IP address (using -=):

Method invocation failed because [System.Collections.ArrayList] doesn't contain
 a method named 'op_Subtraction'.
At J:\MIS Technical Support\Distributed\Continuity\Continuity Binders\Scripting
\Exchange 2010\SMTPRelay\DoNotExecute\RemoveFromRelayList.ps1:92 char:29
+     $RecvConn.RemoteIPRanges -= <<<<  $HostIPConv
    + CategoryInfo          : InvalidOperation: (op_Subtraction:String) [], Ru
   ntimeException
    + FullyQualifiedErrorId : MethodNotFound

- Sean

On Thu, Dec 4, 2014 at 2:54 PM, Michael B. Smith 
<[email protected]<mailto:[email protected]>> wrote:
Hmmmm.

Willing to try something else?  Try this…

$RecvConns = Get-ReceiveConnector | where {$_.name -eq "SMTP Relay Connector"}

forEach ($recvConn in $recvConns) {
Write-Host "Updating", $recvConn.Identity
$RecvConn.RemoteIPRanges += $HostIPConv
$recvConn.Guid.ToString() | Set-ReceiveConnector -RemoteIPRanges 
$RecvConn.RemoteIPRanges
}

From: [email protected]<mailto:[email protected]> 
[mailto:[email protected]<mailto:[email protected]>] 
On Behalf Of Sean Martin
Sent: Thursday, December 4, 2014 6:13 PM
To: [email protected]<mailto:[email protected]>
Subject: Re: [Exchange] PowerShell Help

Thanks for the tip on the operator, that does make better sense.

Unfortunately I'm still encountering a similar issue:

Cannot process argument transformation on parameter 'Identity'. Cannot convert
the "b1645fd1-31c2-46f0-9df6-36cb7285303b" value of type "System.Guid" to type
"Microsoft.Exchange.Configuration.Tasks.ReceiveConnectorIdParameter".
    + CategoryInfo          : InvalidData: (:) [Set-ReceiveConnector], Paramet
   erBindin...mationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Set-Receive
   Connector

On Thu, Dec 4, 2014 at 1:47 PM, Michael B. Smith 
<[email protected]<mailto:[email protected]>> wrote:
This should sort it. As an aside, you should probably be using “-eq” instead of 
“-match”, if only one connector is supposed to match.

$RecvConns = Get-ReceiveConnector | where {$_.name -match "SMTP Relay 
Connector"}

forEach ($recvConn in $recvConns) {
 Write-Host "Updating", $recvConn.Identity
 $RecvConn.RemoteIPRanges += $HostIPConv
 Set-ReceiveConnector –Identity $recvConn.Guid -RemoteIPRanges 
$RecvConn.RemoteIPRanges
}


From: [email protected]<mailto:[email protected]> 
[mailto:[email protected]<mailto:[email protected]>] 
On Behalf Of Sean Martin
Sent: Thursday, December 4, 2014 3:47 PM
To: [email protected]<mailto:[email protected]>
Subject: [Exchange] PowerShell Help

Good morning/afternoon,

I need a little assistance with a PS script I'm putting together. Just to let 
it be known, scripting is not my strong suit.

I'm putting together a powershell script for Junior admins to quickly and 
efficiently add or remove IP addresses to a relay connector we have on our 
Exchange servers. The entire script accepts input from the user, does some 
connectivity checks, dns checks, etc. but the primary function is to gather the 
input and simply run the set-receiveconnector cmdlet with the updated IP list. 
When I execute the script from the Exchange Management shell, it works 
perfectly. However, I would like the admins to be able to execute the script 
quickly and easily, and potentially from a PC that doesn't have the EMS 
installed.

Here's the code that works when the script is executed from the EMS:

================================================================
$RecvConns = Get-ReceiveConnector | where {$_.name -match "SMTP Relay 
Connector"}

forEach ($recvConn in $recvConns) {
 Write-Host "Updating", $recvConn.Identity
 $RecvConn.RemoteIPRanges += $HostIPConv
 Set-ReceiveConnector $recvConn -RemoteIPRanges $RecvConn.RemoteIPRanges
}
================================================================

However, if I add the logic to import a PSsession so the user can simply 
right-click and execute in powershell:

================================================================
$ExchSrvr = "server1","server2","server3" | Where {Test-Connection 
-ComputerName $_ -Count 1 -Quiet} | Get-Random
$ExchSess = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri 
("http://{0}.<domain>/PowerShell<http://%7b0%7d.%3cdomain%3e/PowerShell>" -f 
$exchsrvr)
Import-PSSession $ExchSess
================================================================

I receive this error when the script attemps to set-receiveconnector:

Cannot process argument transformation on parameter 'Identity'. Cannot convert
the "<servername>\SMTP Relay Connector" value of type 
"Deserialized.Microsoft.Exchan
ge.Data.Directory.SystemConfiguration.ReceiveConnector" to type "Microsoft.Exch
ange.Configuration.Tasks.ReceiveConnectorIdParameter".
    + CategoryInfo          : InvalidData: (:) [Set-ReceiveConnector], Paramet
   erBindin...mationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Set-Receive
   Connector


I'm having a hard time tracking this issue down. Please note I removed 
references to actual server names and domains. The actual script is in the 
proper syntax. Appreciate any help anyone can provide.

- Sean



Reply via email to