Wednesday 11 January 2017

Impact of Leap Second

What is Leap Second:


A leap second is a one-second adjustment that was added to Coordinated Universal Time (UTC) after midnight on 31st Dec 2016
Leap seconds are a periodic one-second adjustment of Coordinated Universal Time(UTC) in order to keep a system's time of day close to the mean solar time. However, the Earth's rotation speed varies in response to climatic and geological events, and due to this, UTC leap seconds are irregularly spaced and unpredictable. This article seeks to provide information regarding the leap seconds, along with addressing.

Impact of Leap Second:


Leap seconds help to keep clocks aligned with Earth’s rotation, which can vary due to geologic and even weather conditions. But an extra second can wreak havoc with applications and services that depend on systems being tightly synchronized. Time synchronization is critical for keeping replica up to date, determining which data-affecting operation happened last, and correctly reporting the order of searches and clicks, the company says.

Ordinary operating systems can’t accommodate a minute that’s 61 seconds long, so some organizations have used special-case workarounds for the extra second. But sometimes these methods raise issues, like what happens to write operations that take place during that second.

Solution:



Since the leap second was inserted by IERS (International Earth Rotation Services) at the moment. We all need to check with the respective application vendor about this leap second whether they have a fix to align with NTP. Obviously, we must install the fix if your application is not synching with Network time protocol through internet.  Keep your eye on scheduled jobs which used to synch with external third party API’s 

Tuesday 29 March 2016

Automation of resource pool allocation

Operations teams are struggling to manage the resource pool. We have been either migrating or decommissioning lots of VM's everyday. We need to adjust the resource pool memory and CPU after every migration and decommission of VM's. 

I have written the below powerCLI script to automate this task. This script will identify only discrepancy resource pool by comparing the resource pool memory and CPU share values with vCPU and memory count of VM's  inside the resource pool.

By this way you can use an unused memory and CPU shares to another resources. 

I have asked you to type the details of $VIserver, $SMTPserver, $mailFrom and $mailTo in the below script. Please add the requested details before running. You will get the discrepancy report of resource pool to  your given "$mailTo" address after the completion of running script.  



#######################################################

# Created By = Sankar Munirathinam


########################################################


[string]$head = @'
<style type = "text/css">
p {font-family: Calibri;}
h1,h2,h3 {font-family: Calibri;}
ol {font-family: Calibri;}
li {font-family: Calibri;}
table {width: 50%;}
table, th, td {border: 1px solid black;border-collapse: collapse; font-size:10pt}
th {background-color:Orange; color:black}
td, th {padding: 3px; text-align:center;}
</style>
'@



$VIserver = "Type your datacenter here"

Connect-VIserver $VIserver
 $report = @()
 
 $datacenters = get-datacenter 

 
 foreach($datacenter in $datacenters)
 {
 
 $clusters = get-datacenter $datacenter | get-cluster
 
 foreach($cluster in $clusters)
 {
 $Resourcepool = get-cluster $cluster | Get-ResourcePool | select -ExpandProperty Name
 
 foreach($resource in $Resourcepool)
 {
 
  $numvcpus = 0
    $totalmemory = 0
    $numvms = 0
 $pool = get-resourcepool $resource -location $cluster
  $cpuShares = $pool.Numcpushares
$MemoryShares = $pool.Nummemshares
 
 [int]$ClusterCPUShares = $cpuShares/1000
 [int]$clusterMemShares = $MemoryShares/1000
 
$VMs = $pool | get-vm

 
 foreach($vm in $VMs)
 {
    #count number of CPUs
        $NumvCPUs += ($VM).NumCpu
        #count how much memory is allocated
        $TotalMemory += ($vm).MemoryGB
        #count number of VMs
        $NumVMs += 1
 
 }

  if((($numvcpus -lt $ClusterCPUShares) -or ($numvcpus -gt $ClusterCPUShares)) -or (($totalmemory -lt $clusterMemShares) -or ($totalmemory -gt $clusterMemShares)))
 {
  $totalmemory = "{0:N2}" -f $totalmemory
 
 $object = New-Object -TypeName Psobject
 $object | Add-Member -MemberType NoteProperty -Name "DataCenter" -Value $datacenter
 
$object | Add-Member -MemberType NoteProperty -Name "Cluster" -Value $cluster
$object | Add-Member -MemberType NoteProperty -Name "ResourcePool" -Value $resource



Write-Host "--------------------------------------------"
Write-Host "Cluster Name : $cluster" -ForegroundColor White
Write-Host "Resource Pool Name : $resource " -ForegroundColor White
Write-Host "Resource Pool CPU Shares : $cpushares" -ForegroundColor White
Write-Host "Total VM's vCPU Count : $numvcpus" -ForegroundColor White
Write-Host "--------------------------------------------"

$object | Add-Member -MemberType NoteProperty -Name "ResourcePool Cpu Shares" -Value $cpuShares
$object | Add-Member -MemberType NoteProperty -Name "Total VM's vCpu Count" -Value $numvcpus

Write-Host "--------------------------------------------"
Write-Host "Cluster Name : $cluster" -ForegroundColor green
Write-Host "Resource Pool Name : $pool" -ForegroundColor green
Write-Host "Resource Pool Memory Shares : $Memoryshares" -ForegroundColor green
Write-Host "Total VM's Memory : $TotalMemory GB" -ForegroundColor green
Write-Host "--------------------------------------------"
$object | Add-Member -MemberType NoteProperty -Name "ResourcePool Memory Shares" -Value $MemoryShares
$object | Add-Member -MemberType NoteProperty -Name "Total VM's Memory in GB" -Value $totalmemory
$report += $object
}

}
}
}


$final = $report | ConvertTo-Html -Head $head


$SMTPServer = "Type your smtp address"
$mailto = ""
$mailfrom = ""
$subject = "Report of ResourcePool $VIserver"

[string]$Message = @"
<!DOCTYPE html>
<html>
<body style = "font-family: Calibri"; font-size:8px>
<font size = "3">

<p><center>$final</center></p>
<p>Regards</p>
<p><strong>Operation Team</strong></p>
</font>
</body>
</html>
"@

send-mailmessage -to $mailto -Subject $subject  -from $mailfrom  -smtpserver $SMTPServer -body $Message -BodyAsHtml
 ##############################################




Friday 13 March 2015

Message Tracking Log for Distribution Group

Are you wondering how to take the transaction logs for distribution group?

I have written an exchange powershell to take the logs of distribution group which are receiving the mails from external network. We need to specify the event id as Expand as mentioned in the below script.

When you run Get-MessageTrackingLog on the hub server you could pull only the logs which are being sent the server where you are going to run this tracking log cmdlet.

To get an accurate log report we should pull the transaction logs from all the hub transport server installed in the organisation

How do you pull the tracking logs if you have multiple hub transport server?

$Servers = Get-ExchangeServer | where { $_.isHubTransportServer -eq $true -or $_.isMailboxServer -eq $true }

We are saving all the hub server details in the $server variable to get the logs from all the hub server installed in the organization

You just wanted to change the start date and end date based on the requirement. if you wanted to pull the logs for last 15 days you need to align with start and date in the below script.


###############Get-Messagetrackinglog from all installed hub servers######################

$Servers = Get-ExchangeServer | where { $_.isHubTransportServer -eq $true -or $_.isMailboxServer -eq $true }

$report = @()

try {

$logs = $servers | ForEach-Object { Get-MessageTrackingLog -EA SilentlyContinue -ResultSize Unlimited -Server $_.Name -Start (Get-Date).AddDays(-30) -End (Get-Date) -EventID Expand | select sender, RelatedRecipientAddress}


foreach ($log in $logs)
{

$MSGSender = $log.Sender
$DG = $log.RelatedRecipientAddress


$Obj = New-Object PSObject
$Obj | Add-Member -MemberType NoteProperty -Name "Sender" -Value $MSGSender
$Obj | Add-Member -MemberType NoteProperty  -Name"DistributionGroup" -Value $DG
$report += $Obj

}

} catch {

} finally {

$report | Export-Csv  C:\Users\sankar\Desktop\DG-MessageTracking.CSV

$report | Out-GridView
}

#####################################################################

Friday 12 September 2014

Advanced Search Query

Use the Search-Mailbox cmdlet for the following scenarios

1. Deleting the meetings from the end user calendar.

2. Delete the Mail from the end user Mailbox

3. Copy the mails from one mailbox to other mailbox

4. Delete the meetings made by terminated users

5. Delete the meeting from Resource mailbox


Use the below cmdlet for taking the backup and see what emails you are going to recall. So if anything goes wrong you could use this backed up emails. 

search-mailbox -searchquery "kind:meetings from:$recipient" -targetmailbox $yourmailid -targetfolder "REPORT" 

Check $yourmailid to see what meetings you are going to delete. If you are ok then go ahead and use delete parameter for deleting the meeting

search-mailbox -searchquery "kind:meetings from:$recipient"  -deletecontent -force

Use the below cmdlet for copying emails from one mailbox to another mailbox


Search-Mailbox mailid@domain.com -SearchQuery "Kind:email AND sent: 06/01/14..09/16/14" -TargetMailbox sankar@domain.com  -TargetFolder Backup

Monday 7 July 2014

Powershell Error Handling

There are two common parameters for error handling.

-Erroraction and -Errorvariable

To know about common parameters:

Get-Help -Name about_CommonParameters;

if an error occurs while running the script it will save that error in automatic variable

Automatic variable : $error

Error handling is very important when you write scripts. You should know what is happening when the script is running. you could catch errors if the error occurs while running the script

Syntax:

Try
{

}
catch
{

$_

}

Finally

{

}

Put your scripts in Try block and Catch block would catch the errors while running the scripts.

Monday 23 June 2014

Remote Powershell



Use remote powershell if you dont have installed Exchange Management tool.

Use the below script to log in through remote powershell

$username = 'domain\username'
$password = '**************'
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString -String $password -AsPlainText -Force))

$session = New-PSSession -Authentication basic -Credential $cred -ConnectionUri https://*****.******.com/PowerShell -ConfigurationName Microsoft.Exchange
Import-PSSession $session

If you want to login to the different machine through remote use the below code

$cred=Get-Credential
$session = New-PSSession -Credential $cred -ComputerName <remote machine>
Enter-PSSession $sessio

To exit the remote session

Exit-PSSession
Remove-PSSession $session

Powershell Execution policy

if the powershell scripts to be allowed to run the scripts on your computer, Use the below execution policy cmdlets

Set-ExecutionPolicy RemoteSigned

Then use the below cmdlet to check the execution policy

Get-ExecutionPolicy




Friday 9 May 2014

Convert Powershell Script as Executable File

How to convert the Powershell Script as Executable File?

Sometimes we need to run the PS script as an executable file. In this case we could convert the powershell script as an exe file. Then run it on the windows OS. Please pay the attention on the Microsoft .Net Framework while creating the executable file.

1. Install the latest version of PowerGUI Script Editor

2. Write the script on the PowerGUI Script Editor which you want to convert it as EXE file

3. Then Click on "Tools"

4. Then Click on "Compile Script"

5. If you want you can show powershell script on console. Else you could disable that option