Quick dirty post–Powershell Script to check registry keys on remote servers (check for E2010 fixed ports)
Hi all,
I know Exchange 2010 is almost outdated, but that’s just for my reference and also for an example about how to query registry keys at the same time : this script checks servers for specific registry keys, in this example it checks for the registry keys we used in Exchange 2010 to fix ports, which were done for 2 Exchange components (Store and Address Book), using 2 registry keys – More information about how to fix E2010 ports here.
Apologize for the drafty post, but again, it’s just for future reference about how to query registry keys in general…
############################################## Script Start ##############################################
# HOW TO check registry keys
# In the below example: check for Ports fixed for Client Access ....
#
# WARNING : Script Requires Exchange tools to get list of Exchange if you use Get-ClientAccessServer or Get-ExchangeServer
# NOTE: Script does NOT require EXchange tools if you use a Powershell list you put in a variable like $ExchangeServers = "Server1", "Server2", "Server3"
#Initializing variable - best practice of developpers and just in case
$MSExch1 = $null
$MSExch2 = $null
$MSExch2type = $null
$ExchangeServers = $null
$Reg = $null
$RegKey = $null
$computer = $null
# 3 methods to get Exchange CAS servers :
# - filter on the "ServerRole" property of an entire "ExchangeServer" object - PROS: if you have mix of Exchange 2007/2010 servers, you can add an "AdminDisplayVersion" filter to query only the Exchange version you want to check !
# - just do a "Get-ClientAccessServer" - PROS : simpler ! But in case you have mix of E2010/E2007 servers, you'll check all of these
# - give a list of machines to the $ExchangeServers variable like $ExchangeServers = "Server1", "Server2", "Server3"
# $ExchangeServers = get-exchangeserver | ? {$_.ServerRole -like "*ClientAccess*" -and $_.AdminDisplayVersion -like "*14.*"} #$ExchangeServers = Get-ClientAccessServer
# $ExchangeServers = "Server1", "Server2", "Server3"
# $ExchangeServers = Get-ClientAccessServer
$ExchangeServers = Get-ClientAccessServer
# Here is where, for each computer on the list in the $ExchangeServers variable, we query the registry keys
foreach ($computer in $ExchangeServers){
Write-host "Checking computer $Computer"
#We check if the computer is reachable - if it is, we continue, if it is not, we print "Computer is down" and move on...
if (test-connection $computer -quiet -count 1)
{
#First we open the registry on the remote computer - note the ".NET" notation [Object.Properties]::Function([parameters]) ...
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $computer)
#Second we open or navigate to the key where we know we'll find the registry object to query
$RegKey= $Reg.OpenSubKey("SYSTEM\\CurrentControlSet\\services\\MSExchangeRPC\\ParametersSystem")
#Third we query the value and the type (DWORD, REG_SZ or whatever) of the key we want (we pass the key name inside the GetValue function)
$MSExch1 = $RegKey.GetValue("TCP/IP Port")
$MSExch1type = $RegKey.GetValueKind("TCP/IP Port")
#Then we repeat the above for other registry keys...
$RegKey = $Reg.OpenSubKey("SYSTEM\\CurrentControlSet\\services\\MSExchangeAB\\Parameters")
$MSExch2 = $RegKEy.GetValue("RpcTcpPort")
$MSExch2type = $RegKey.GetValueKind("RpcTcpPort")
#We then just pring the value and valuetype on the console, with some fancy colors (Magenta here)
Write-Host "MSExchangeIS Port = $MSExch1 / Type = $MSExch1type" -foregroundcolor magenta
Write-Host "MSExchangeAB Port = $MSExch2 / Type = $MSExch2type" -foregroundcolor magenta
}
else
{
Write-Host "$computer is down" -foregroundcolor RED
}
}
############################################## Script End ##############################################
Have fun !
Cheers,
Sam