Thansk again. Just another example of why these lists are so valuable. I truly appreciate the assistance.
- Sean On Mon, Dec 8, 2014 at 5:24 AM, Michael B. Smith <[email protected]> wrote: > $pause = Read-Host “Hit enter to exit script…” > > > > J > > > > *From:* [email protected] [mailto: > [email protected]] *On Behalf Of *Sean Martin > *Sent:* Monday, December 8, 2014 2:49 AM > > *To:* [email protected] > *Subject:* Re: [Exchange] PowerShell Help > > > > 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 > > > >
