06 stycznia 2014

Sprawdzanie i włączanie komponentów Exchange raz jeszcze

Niedawno pisałem na tym blogu o sprawdzaniu komponentów serwera Exchange. Ponieważ standardowe cmdlety niezbyt wygodnie prezentują stan komponentów, zacząłem używać skryptu, który opublikował na swoim blogu Michael Van Horenbeeck. Jednak oryginalny skrypt tylko sprawdzał stan komponentów, więc postarałem się go trochę rozbudować. Wykorzystałem do tego funkcję get-choice, opracowaną dwa lata wcześniej przez Andy Schneidera. Oczywiście można to zrobić na wiele sposobów, ale uznałem, że wygodnie będzie dać możliwość wyboru, czy na pewno chcemy dany komponent ponownie aktywować. Jeżeli znajdę czas ja albo Michael to skrypt będzie rozbudowany.

Poniżej skrypt:

<#
.SYNOPSIS
Checks component state of local Exchange
2013 server and give choice to activate any inactive component
.DESCRIPTION
Checks component state of local Exchange
2013 server. You have choice to activate any inactive component
.NOTES
Prepared by Konrad Sagala
Sched Task Required : No
Exchange Version :
2013
Disclaimer : You running this script means you won't blame me
if this breaks your stuff.
Code used
in script : First version of this script prepared by Michael Van Horenbeeck, function new-choice by Andy Schneider
.LINK
http:
//michaelvh.wordpress.com/tag/compontent-state/
.LINK
http:
//poshcode.org/2660
.EXAMPLE
.\Query
-componentstates.ps1
.INPUTS
None. You cannot pipe objects to this script. But you can add server name.
#>

function New-Choice {
<
#
.SYNOPSIS
The New
-Choice function is used to provide extended control to a script author who writing code
that will prompt a user
for information.

.PARAMETER Choices
An Array of Choices, ie Yes, No and Maybe

.PARAMETER Caption
Caption to present to
end user

.EXAMPLE
PS C:\
> New-Choice -Choices 'Yes','No' -Caption "PowerShell makes choices easy"

.NOTES
Author: Andy Schneider
Date:
5/6/2011
#>

[CmdletBinding()]
param(

[Parameter(Position
=0, Mandatory=$True, ValueFromPipeline=$True)]
$Choices,

[Parameter(Position
=1)]
$Caption,

[Parameter(Position
=2)]
$Message

)

process {

$resulthash += @{}
for ($i = 0; $i -lt $choices.count; $i++)
{

$ChoiceDescriptions += @(New-Object System.Management.Automation.Host.ChoiceDescription ("&" + $choices[$i]))
$resulthash.$i = $choices[$i]
}
$AllChoices = [System.Management.Automation.Host.ChoiceDescription[]]($ChoiceDescriptions)
$result = $Host.UI.PromptForChoice($Caption,$Message, $AllChoices, 1)
$resulthash.$result -replace "&", ""
}
}

#
#
main part of the script
#
$localserver = $env:computerName
$components = Get-ChildItem HKLM:\SOFTWARE\Microsoft\ExchangeServer\v15\ServerComponentStates\ -Recurse | select PSPath

foreach($component in $components){

$componentstates = (Get-ItemProperty $component.PSPath | Select * -ExcludeProperty PS* ) | Get-Member -MemberType NoteProperty

$i=0

do {

$componentstate = ($componentstates[$i].Definition).split("=")
$statebreakdown = $componentstate[1].Split(":")

#$componentActualState = $statebreakdown[1]

switch($statebreakdown[1]){
1 {$componentActualState = "Active"}
0 {$componentActualState = "Inactive"}
}
$componentActualTime = [timezone]::CurrentTimeZone.ToLocalTime([datetime]::FromBinary($statebreakdown[2]))

$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name Component -Value $($component.PSPath.Split("\"))[7]
$obj | Add-Member -MemberType NoteProperty -Name Requester -Value $componentstates[$i].Name
$obj | Add-Member -MemberType NoteProperty -Name State -Value $componentActualState
$obj | Add-Member -MemberType NoteProperty -Name TimeStamp -Value $componentActualTime
$obj

$i++
if ($componentActualState -eq 'Inactive')
{
$answer = New-Choice -Choices 'Yes','No' -Message "Do you want to activate component?"
if ($answer -eq 'Yes')
{
Set
-ServerComponentState -Identity $localserver -Component $obj.Component -Requester $obj.Requester -State Active
}
}
}
while ($i -lt $componentstates.count)
}

Brak komentarzy: