Nope, I was able to put together some moderate batch scripts, but I've
always had a hard time learning scripting languages. I could never learn a
foreign language in school so maybe the two are related. If you asked that
because of the $blnIsValid variable, that was some input from a friend (who
does have a lot of VB experience) helping me structure the do/while
statements. I just didn't bother to change the variable name. With that
said, I do feel like I'm picking Powershell a little bit easier each day.

Thanks for the suggestions on simplifying, that does look a lot
cleaner. The script will typically be run from a shared drive so it's
easier for the analyst to right-click and run with powershell. The 10
second delays were added just to allow the person executing the script a
chance to see the results before the script exits since that results in the
session closing.

On Sat, Dec 6, 2014 at 10:16 AM, Michael B. Smith <[email protected]>
wrote:

>  Were you a vbscript programmer? J
>
>
>
> I don’t see anything wrong. I would simplify a bit…
>
>
>
> Take
>
>
>
> ### Prompt for Server Name ###
>
> [Console]::ForegroundColor = "cyan"
>
> $Hostname = Read-Host 'Enter servername to be added to the SMTP Relay List'
>
> [Console]::ResetColor()
>
>
>
> And become
>
>
>
> ### Prompt for Server Name ###
>
> Write-Host 'Enter servername to be added to the SMTP Relay List'
> –ForeGroundColor Cyan -NoNewLine
>
> $Hostname = Read-Host
>
>
>
> Take
>
>
>
> [Console]::ForegroundColor = "yellow"
>
> Write-Host "No Hostname entered..."
>
> [Console]::ResetColor()
>
>
>
> And become
>
>
>
> Write-Host "No Hostname entered..." –ForeGroundColor Yelloow
>
>
>
> This just makes the code (much) easier to read.
>
>
>
> Also, I really don’t understand the point behind the “delay 10 seconds”
> prior to exiting the script.
>
>
>
> *From:* [email protected] [mailto:
> [email protected]] *On Behalf Of *Sean Martin
> *Sent:* Friday, December 5, 2014 8:54 PM
> *To:* [email protected]
> *Subject:* Re: [Exchange] PowerShell Help
>
>
>
> So a little background might help...
>
>
>
> I created the script because we were having continous issues with
> applications needing the ability to relay email not being configured on our
> specified receive connectors. We have 6 servers split between two sites
> (each hosting MB, HT, CAS roles), with one server in each site being
> designated the relay server. We use SRM in our environment to
> failover/migrate virtual machines between our sites. With that process VMs
> are configured with new IP addresses when moved to the alternate site, so
> we've run into issues where a VM has been failed over but the "failover IP
> address" hasn't been added to the receive connector for relay. Although
> applications only target one server in each site for relay, we keep the
> connector configurations updated on all of the Exchange servers just in
> case one has to stand in for that purpose. So I wanted to create an easy
> way for our less experienced admins to take a request for relay access and
> ensure all of the relevant information was gathered and configured on all
> of the receive connectors.
>
>
>
> So with all of that said, here's the script I came up with. I decided to
> not to pursue functionality outside of the EMS since most of the Analysts
> responsible for this task will have the EMS installed.
>
>
>
>
>
> ### Load Exchange Shell ###
> . 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'
> Connect-ExchangeServer -auto
>
>
>
> ### Variables ###
> $ErrorActionPreference = "SilentlyContinue"
> $Ping = New-Object System.Net.NetworkInformation.Ping
>
>
>
> ### Prompt for Server Name ###
> [Console]::ForegroundColor = "cyan"
> $Hostname = Read-Host 'Enter servername to be added to the SMTP Relay List'
> [Console]::ResetColor()
>
>
>
> ### Prompt for IP Address ###
> if ($hostname -eq "") {
>  [Console]::ForegroundColor = "yellow"
>  Write-Host "No Hostname entered..."
>  [Console]::ResetColor()
>  $blnIsValid = $False
>  Do {
>   [Console]::ForegroundColor = "cyan"
>   $IPAddr = Read-Host 'Please enter primary IP address'
>   [Console]::ResetColor()
>
>
>
> ### Validate IP Address ###
>   $IPAddrObj = [System.Net.IPAddress]::parse($IPAddr)
>   $isValidPriIP = [SYstem.Net.IPAddress]::tryparse([string]$IPAddr,
> [ref]$IPAddrObj)
>   if ($isValidPriIP) {
>    Write-Host "$IPAddr is a valid IP address"
>    $blnIsValid = $True
>   } else {
>    [Console]::ForegroundColor = "red"
>    Write-Host "ERROR: $IPAddr is not a valid IP address!"
>    $blnIsValid = $False
>    [Console]::ResetColor()
>    }
>  } While ($blnIsValid -eq $False)
> } else {
>
>
>
> ### Obtain IP address from hostname ###
>  $HostIP = [System.Net.DNS]::GetHostAddresses("$Hostname")
>  if ($HostIP -eq $null) {
>   [Console]::ForegroundColor = "red"
>   Write-Host "ERROR: The DNS lookup failed!"
>   [Console]::ResetColor()
>   Write-Host "Script will terminate in 10 seconds..."
>   Start-Sleep -s 10
>   exit
>  } else {
>   Write-Host "Converting IP address to string..."
>  }
> }
>
>
>
> ### Convert null Host variables to IP ###
> if ($Hostname -eq "") {
>  $HostIPConv = $IPAddr
>  $Hostname = $IPAddr
> } else {
>
>
>
> ### Convert IP Address to String ###
> $HostIPConv = $($Ping.Send($Hostname).Address).IPAddressToString
> }
>
>
>
> ### Connectivity test for host IP ###
> $HostIPTest = Test-Connection $HostIPConv -count 1 -quiet
> if ($HostIPTest -eq $false) {
>  [Console]::ForegroundColor = "yellow"
>  $HostIPTestResp = Read-Host 'The IP address'$HostIPConv' is not
> responding, would you like to continue? Enter Y or N'
>  [Console]::ResetColor()
>  }
>  if ($HostIPTestResp -eq "N") {
>   Write-Host "The script will terminate in 10 seconds..."
>   Start-Sleep -s 10
>   exit
> } else {
>  Write-Host "Adding $hostname to relay list..."
> }
>
>
>
> ### Retrieve existing list of relay IPs ###
> $RecvConns = Get-ReceiveConnector | where {$_.name -eq "SMTP Relay
> Connector"}
>
>
>
> ### Save Changes to SMTP Relay Connectors ###
> forEach ($RecvConn in $RecvConns) {
>  Write-Host "Updating", $RecvConn.Identity
>  $RecvConn.RemoteIPRanges += $HostIPConv
>  Set-ReceiveConnector $recvConn -RemoteIPRanges $RecvConn.RemoteIPRanges
> }
>
>
>
> ### Prompt for alternate IP Address ###
> $blnIsValid = $False
> Do {
>  [console]::ForegroundColor = "cyan"
>  $AltIP = Read-Host 'Enter failover IP address'
>  [Console]::ResetColor()
>  if ($AltIP -eq "") {
>   [console]::ForegroundColor = "yellow"
>   Write-Host "No failover IP address entered..."
>   [console]::ForegroundColor = "green"
>   Write-Host "Relay list Updates are complete!"
>   [Console]::ResetColor()
>   Write-Host "Script will terminate in 10 seconds..."
>   Start-Sleep -s 10
>   exit
>  } else {
>
>
>
> ### Validate IP Address ###
>   $AltIPObj = [System.Net.IPAddress]::parse($AltIP)
>   $isValidIP = [SYstem.Net.IPAddress]::tryparse([string]$AltIP,
> [ref]$AltIPObj)
>   if ($isValidIP) {
>    Write-Host "$AltIP is a valid IP address"
>    $blnIsValid = $True
>   } else {
>    [console]::ForegroundColor = "red"
>    Write-Host "ERROR: $AltIP is not a valid IP address!"
>    $blnIsValid = $False
>    [Console]::ResetColor()
>    }
>  }
> } While ($blnIsValid -eq $False)
>
>
>
> ### Connectivity test for failover IP (failover IPs should not respond
> unless application is currently failed over) ###
> $FailIPTest = Test-Connection $AltIP -count 1 -quiet
> if ($FailIPTest -eq $true) {
>  [Console]::ForegroundColor = "yellow"
>  $AltIPTestResp = Read-Host 'The IP address'$AltIP' is responding to ping,
> please verify you have obtained a valid failover IP address. Would you like
> to continue? Enter Y or N'
>  [Console]::ResetColor()
> }
>  if ($AltIPTestTesp -eq "N") {
>   Write-Host "The script will terminate in 10 seconds..."
>   Start-Sleep -s 10
>   exit
> } else {
>  Write-Host "Adding $AltIP to relay list..."
> }
>
>
>
> ### Retrieve existing list of relay IPs ###
> $RecvConns = Get-ReceiveConnector | where {$_.name -eq "SMTP Relay
> Connector"}
>
>
>
> ### Save Changes to connectors ###
> forEach ($RecvConn in $RecvConns) {
>  Write-Host "Updating", $RecvConn.Identity
>  $RecvConn.RemoteIPRanges += $AltIP
>  Set-ReceiveConnector $recvConn -RemoteIPRanges $RecvConn.RemoteIPRanges
> }
>
>  [Console]::ForegroundColor = "green"
>  Write-Host "Relay list updates are complete!"
>  [Console]::ResetColor()
>  Write-Host "Script will terminate in 10 seconds..."
>  Start-Sleep -s 10
>  exit
>
>

Reply via email to