VMware Snapshot reminder script

Here is a modified script for sending notifications to owners of Snapshots.    I found a couple of examples I hacked together.  I added a function to help Sanitize based on three different attributes. I consolidated them into a single function that determines to send a notification or not.  We have some static machines used for packaging software that maintain a single snapshot.  I included the two links of the original articles that have notification routines.

I wish the user who created the snapshot would be recorded on each snapshot as the owner.  A person has to retrieve the owner from the tasks / events, which is a bit of extra work.  I’ve been running this script for a couple months and been helpful. 

Enjoy

Steve Schofield
Microsoft MVP – IIS

 

# – SnapReminder V1.0 By Virtu-Al – http://virtu-al.net
#
# Please use the below variables to define your settings before use
# function GetSnapList uses http://virtualcurtis.wordpress.com/2011/10/02/find-virtual-machine-snapshots-with-powercli/
param
(
    [string]$vCenterServer = $(throw “Please specify the vCenter server you want to query for snapshots.”),
    [string]$smtpServer = “mail.example.com”,
    [string]$MailFrom = “[email protected]”,
    [string]$CredentialID = “domainuser”,
    [int]$AgeOfSnap = 14,
    [string]$Output = “Output”,
    [string]$OutputErrors = “OutputErrors”,
    [string]$OutputEmailAudit = “OutputEmailAudit”   
)

function Log([string]$path, [string]$value)
{
    Add-Content -Path “$($Path)$($LogDate).txt” -Value $value
}

# Loading Snapins
function LoadSnapin{
  param($PSSnapinName)
  if (!(Get-PSSnapin | where {$_.Name   -eq $PSSnapinName})){
    Add-pssnapin -name $PSSnapinName
  }
}
LoadSnapin -PSSnapinName   “VMware.VimAutomation.Core”

function Find-User ($username){
    if ($username -ne $null)
    {
        $usr = (($username.split(“”))[1])
        $root = [ADSI]””
        $filter = (“(&(objectCategory=user)(samAccountName=$Usr))”)
        $ds = new-object system.DirectoryServices.DirectorySearcher($root,$filter)
        $ds.PageSize = 1000
        $ds.FindOne()
    }
}

function GetSnapList
{

$myVMs = Get-VM
$VMsWithSnaps = @()

foreach ($vm in $myVMs)
{
    $vmView = $vm | Get-View
    if ($vmView.snapshot -ne $null)
    {
         $SnapshotEvents = Get-VIEvent -Entity $vm -type info -MaxSamples 1000 | Where { $_.FullFormattedMessage.contains(“Create virtual machine snapshot”)}
        try
        {
            $user = $SnapshotEvents[0].UserName
            $time = $SnapshotEvents[0].CreatedTime
        }
        catch [System.Exception]
        {
                $user = $SnapshotEvents.UserName
                $time = $SnapshotEvents.CreatedTime
        }
       $VMInfo = “” | Select “VM”,”CreationDate”,”User”
       $VMInfo.”VM” = $vm.Name
       $VMInfo.”CreationDate” = $time
       $VMInfo.”User” = $user
       $VMsWithSnaps += $VMInfo
    }
}

#Causes the array to be doubled
#$VMsWithSnaps | Sort CreationDate

return $VMsWithSnaps
}

function SnapMail ($Mailto, $snapshot)
{
    $msg = new-object Net.Mail.MailMessage
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $msg.From = $MailFrom
    $msg.To.Add($Mailto)
    $msg.Subject = “Snapshot Reminder”
    $MailText = “This is a reminder that you have a snapshot active on $($snapshot.VM) which was taken on $($snapshot.Created)”       
    $msg.Body = $MailText
    $smtp.Send($msg)
    $VMDiskSize = [Math]::Round(($snapshot.SizeGB),2)
    Log -Path $OutputEmailAudit -Value “$($Mailto),$($snapshot.VM),$($snapshot.Created),$($VMDiskSize) GB”   
}

#Sanitize if a notification is sent to owner of Snap
function Sanitize ($SnapInfo,[string]$VMName)
{
    [string]$SnapDescription=$SnapInfo.Description
    [string]$SnapName=$SnapInfo.Name
   
    switch -wildcard ($VMName)
    {
        “*abc*” {return $false}
        “*xyz*” {return $false}
        “*123*” {return $false}
        “*xp*” {return $false}
        #”*templates*” {return $false}
    }   
   
    switch -wildcard ($SnapDescription)
    {
        “*abc*” {return $false}
        “*xyz*” {return $false}
        “*123*” {return $false}
        “*xp*” {return $false}
        #”*templates*” {return $false}
    }   
   
    switch -wildcard ($SnapName)
    {
        “*abc*” {return $false}
        “*xyz*” {return $false}
        “*123*” {return $false}
        “*xp*” {return $false}
        #”*templates*” {return $false}
        default {return $true}
    }
}

[double]$SnapSpaceUsed=0
[int]$SnapCount=0
$StartDate = Get-Date
$LogDate = “$($StartDate.Month)-$($StartDate.Day)-$($StartDate.Year)-$($StartDate.Hour)-$($StartDate.Minute)-$($vCenterServer)”
$cred = Get-Credential $CredentialID
Connect-VIServer -server $vCenterServer -credential $cred
Log -Path $Output -Value “Starting process as $($Cred.Username) connecting to $($vCenterServer) at $($StartDate)”

$vmlist = GetSnapList

#Get a list of machines that have snapshots
#Loop through it
foreach ($snapdata in $vmlist)
{
    Write-Host “Starting VM – $($snapdata.vm)”
    #Start process that shows creation date is l
     if($snapdata.CreationDate -lt ((Get-Date).AddDays(-$AgeOfSnap)))
    {
      #Get a list of snaphosts per vm
      #Loop through the list of VM’s
      $snapPerVM = Get-VM -Name $snapdata.vm | Get-SnapShot
      foreach($snap in $snapPerVM)
      {           
           [Boolean]$ProcessNotification = Sanitize -SnapInfo $snap -VMName $snapdata.vm
               Log -Path $Output -Value “*************************************************”
            Log -Path $Output -Value “Starting VM – $snapdata.vm”
            Log -Path $Output -Value “Process : $($ProcessNotification) : Snap : $($snap)”
          
           if($ProcessNotification -eq $true -and $snapdata.User -ne $null)
           {
                $mailto = ((Find-User $snapdata.User).Properties)
                $mailattr = $mailto.mail
               
                if($mailattr -ne $null)
                {
                    SnapMail $mailto.mail $snap
                    Write-Host “$($mailto.mail) – $($snapdata.VM) and $($snap)”
                    Log -Path $Output -Value “MailTo Value : $($mailto.mail) : VMName : $($snapdata.VM) : SnapData : $($snap)”                   
                }
                else
                {
                    $FirstName = $mailTo.givenname
                    $LastName = $mailTo.sn
                    $FirstName = $FirstName -replace ” “, “”
                    $LastName = $LastName -replace ” “, “.”
                   
                    if($FirstName -eq $null)
                    {
                        $emailAddress = “[email protected]
                    }
                    else
                    {
                        $emailAddress = “$($FirstName).$($LastName)@example.com”
                    }
                   
                    SnapMail $emailAddress $snap
                    Write-Host “$($emailAddress) – $($snapdata.VM) and $($snap)”
                    Log -Path $Output -Value “EmailAddress : $($emailAddress) : VMName : $($snapdata.VM) : SnapData : $($snap)”
                    $emailAddress=””
                }
               
            $SnapCount++
            $SnapSpaceUsed += $snap.SizeGB
           
            Log -Path $Output -Value “Ending VM – $snapdata.vm”
            Log -Path $Output -Value “*************************************************”
           
            }
            else
            {
                Write-Host “Not sending email for $($snapdata) for $($snapdata.VM)”
                Log -Path $OutputErrors -Value ”    Not sending email for VMName : $($snapdata.VM) : SnapData : $($snap)”
            }
        }
    }
   
}

$SnapSpaceUsed = [Math]::Round($SnapSpaceUsed,2)
Log -path $Output -Value “Number of snaps notified via email : $($SnapCount)  `r`nAmount of spaced the snapshots consumed – $($SnapSpaceUsed) GB”

Disconnect-VIServer -Server $vCenterServer -Force -Confirm:$false
$EndDate = Get-Date
Log -Path $Output -Value “Ending process as $($Cred.Username) connecting to $($vCenterServer) at $($EndDate)”

Using CimCmdlets to connect to CIM provider with Powershell and VMware

I needed to retrieve hardware status on memory DIMM’s and used PowerCLI, Powershell to retrieve the data.  Note the script assumes you have a text file list of servers.

#Reference articles
#https://communities.vmware.com/thread/446593
#http://www.virtu-al.net/2012/10/29/using-powershell-v3-0-cim-cmdlets-with-vmware-esxi-hosts/
#http://technet.microsoft.com/en-us/library/jj553783.aspx
#http://www.powertheshell.com/additional-cim-cmdlets-for-download/
#http://blogs.msdn.com/b/powershell/archive/2012/08/24/introduction-to-cim-cmdlets.aspx
#Import-Module : The specified module ‘CimCmdlets’ was not loaded because no valid module file was found in any module directory.

#$Server = “esxiServer1”
#$HostUsername = “root”
#$HostUsername2=Get-Credential
#$CIOpt = New-CimSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck -Encoding Utf8 -UseSsl
#$Session = New-CimSession -Authentication Basic -Credential $HostUsername2 -ComputerName $Ipaddress -port 443 -SessionOption $CIOpt
#$Result = Get-CimInstance -CimSession $Session -ClassName CIM_Chip | where {$_.CreationClassName -eq “OMC_PhysicalMemory” } | Select Caption,DataWidth,FormFactor,MaxMemorySpeed,@{N=”CapacityGB”;E={[math]::Round($_.Capacity/1GB,0)}}

Import-module CimCmdlets

#$HostUsername = “root”
$HostUsername=Get-Credential

$serverlist=get-content -path ServerList.txt
foreach($server in $serverlist)
{
    $CIOpt = New-CimSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck -Encoding Utf8 -UseSsl
    $Session = New-CimSession -Authentication Basic -Credential $HostUsername -ComputerName $server -port 443 -SessionOption $CIOpt
    $Result = Get-CimInstance -CimSession $Session -ClassName CIM_Chip | where {$_.CreationClassName -eq “OMC_PhysicalMemory” } | Select Caption,DataWidth,FormFactor,MaxMemorySpeed,@{N=”CapacityGB”;E={[math]::Round($_.Capacity/1GB,0)}}

    foreach(  in $Result)
    {
        Write-Host $DIMM
    }
}

A new chapter begins virtualization!

I took a position working on VMware recently, I hope to share basic articles I’ve found useful and some personal experiences.  The first thing like any geek, you need to setup the environment to learn how things tick!

With VMware workstation, you can actually host an ESXi server within a guest (who knew!).  I don’t recommend for production, although for learning how things work or getting certification, it’s perfect. 

Nested virtualization (VMware workstation acting as the hypervisor) is sweet.  You’ll need a beefy laptop (SSD drive doesn’t hurt) or workstation with decent amount RAM, CPU and some multiple CPU cores.  I picked up a desktop with 10 GB of RAM, 6 core processor, 1 TB hard disk. 

 

I setup, definitely was easy, there are plenty of articles on the web doing this same thing.

  • Two ESXi servers
  • One domain controller
  • One vCenter server

 

Community

Get a account at https://my.vmware.com/web/vmware/login.   This includes setting up access to the community forums.  

Another thing I started doing was TwinBox with the following search syntax

#esxi OR #esx OR #vsphere OR #vmware OR #VMware OR #vcloud OR #vmwareview OR #vmwaretam

This pulls down some great information from Twitter.  

Enough for now!  Lots to share, and learn.  Take care.

Steve

System Center and Windows 2012 R2 notes

I got a new shiny machine at home with lots of RAM, Disk space and six cores.  This allowed me to setup the following environment

  • Two host machines running windows 2012 R2 with hyper-v
  • 1 domain controller
  • 1 Server running System Center 2012 R2 Orchestrator
  • 1 Server running System Center 2012 R2 operations manager
  • 1 Server running System Center 2012 R2 configuration manager

 

I downloaded the evaluations from MSDN and evaluation center. 

OS
http://technet.microsoft.com/en-us/evalcenter/dn205286.aspx

SCCM
http://technet.microsoft.com/en-US/evalcenter/dn205297

I downloaded Orchestrator and SCOM from MSDN

For the most part, everything installed cleanly.  A few to-do’s I have yet to confirm and figure out

  • Windows firewall being enabled
  • SQL RM0 Error when installing SCCM.  I found the sqlclini.msi was zero byte file.  I downloaded an SCCM 2012 SP1 version.  Once I copied the \server1$AppsSC2012_R2_PREVIEW_SCCM_SCEPSMSSETUPBINX64sqlncli.msi, SCCM installed cleanly. 
  • I’ve also ran into a couple issues where the default gateway wouldn’t set, one on my domain controller.  After I ran route delete 0.0.0.0 and set it manually a couple times, things worked. 

 

I’m in the process of adding SCVMM 2012 R2 to another server.  I have to P2V my one host, which is running windows 2012 w/SP1.  This will allow me to learn the P2V and also update my one host to Server 2012 R2.  I tried to allow live replication between my one host running 2012 SP1 and 2012 R2.  I get an error.  I’m not a VM guru, so this hopefully learn a bit more about SCVMM, App Controller

Other goals…

  • Learn OSD
  • Live Replication
  • P2V
  • SCCM Application module
  • APM management pack

 

Stay tuned for more blog posts.  Oh btw, I’ll be tinkering with IIS 8.5 and the new logging features

Happy Geeking,

Steve Schofield

Microsoft MVP – IIS

Adventure with OEM desktop pre-staged win 8

Oh the stories I could talk about regarding win 8 pre-loaded on a OEM box.  A few weeks back I picked up a nice desktop (refurb) for under $500.  It’s a 1.5 TB HD, 10 GB ram, 6 core processor.  Besides this being an awesome box with lots of goodies, I can’t believe the price.  Anywho, the reason I like to have such a decent box is play with software, usually the latest and greatest. Any geek usually has a little rouge setup in their house to test things like beta releases or do other crazy stuff they can’t or won’t do in a hosting or enterprise setting. 

When my box arrived, I was pretty geeked.  Being a lifelong server based IT geek, the first thing was to get rid of win8…..or so I thought.  I popped the disk into the drive, booted up, and I got this error….”

“The product key entered does not match any of the Windows images available for installation. Enter a different product key”

I’ve been out of the server OS build business a while, so I searched around and found on new win8 OEM boxes, the license key is embedded to the firmware…smart I’d say.  The down side, there is a particular order checking for the license key.  In my case, using a DVD was something I’ve done in the past on other machines.  Guess, MS wanted to make it a little harder.  Who knows! 

The end result I packed the machine up and set on the shelf for three weeks while I traveled.  It seemed to come down to the point I needed to build an unattended install to get my Server OS to boot to the DVD and look for the license key, bypassing the BIOS lookup.  The unattended install could use DISM or imageX.  Being rusty at building an unattended install, all I wanted to do was load a server OS like I’ve done in the past using a DVD.  I guess this machine wasn’t meant for win 2012 RTM. 

Windows Server 2012 R2 to the rescue, I think.  The Beta version came out when I got back from traveling, I downloaded the iso and was able to get past the activation error.  I went through the BIOS and made sure the legacy boot was enabled, secure boot was disabled.  then I was able to install.  There was some other option in the bios about enter keys.  All I know, if this had not of worked, a flavor of linux would have went on there along with virtual box  or some other virtual hypervisor.   MS, I hope you don’t continue to make things harder for a long time follower.  Luckily, IIS 8.5 had some new features I wanted to try out!  I guess this is a bit of a rant, but overall, the machine is online and I can start to use it.

Cheers and happy geeking!

Steve Schofield
Microsoft MVP – IIS

Evaluate IISLogs

Download IISLogs 30-day evaluation (This is a full version trial.)

Three versions to choose from (1 Stand-Alone EXE , 1 – Windows Service Versions).

IIS Log Help links

Windows Service Version Guide

When the program starts, you’ll be prompted for the Configuration File, This will be used for either Windows Service version or Stand-alone EXE version Select IISLogsSVC.exe.config (Windows Service Version)

Stand-Alone EXE Guide


When the program starts, you’ll be prompted for the Configuration File, This will be used for either Windows Service version or Stand-alone EXE version Select IISLogs.exe.config (Stand-Alone EXE version)

Purchase information

  • How do I obtain a full version license of IISLogs?

After you have performed an evaluation of IISLogs. We recommend testing IISLogs in a non-production environment.  Visit our purchase page, select the appropriate license pack, walk through the purchase steps. 

IISLogs support will be notified of the purchase.  We’ll respond to the notification with a “Welcome Aboard” message and full version license key.  You’ll deploy the license file to your server(s).  No activation or reinstall required.

Support

 

IIS Logs FAQ

  • What is IISLogs?

IISLogs helps administrators and developers easily manage log files created by Internet Information Server 5.0,6.0 and 7.0/7.5/8.0. The component will provide configurable options compressing files using ZIP, and/or just deleting files after a configurable setting based on time. One of the benefits will help maintain and conserve precious disk space on servers. The architecture of IISLogs is based on file extension. In addition to IIS logs, our component can help manage many 3rd party application logs too.

  • How do I obtain a full version license of IISLogs?

After you have performed an evaluation of IISLogs.  Visit our purchase page, select the appropiate license pack, walk through the purchase steps.  IISLogs support will be notified of the purchase.  We’ll respond to the notification with a “Welcome Aboard” message and full version license key.  You’ll deploy the license file to your server(s).  No activation or reinstall required.

  • How do I get a copy of the IISLogs component?

Visit evalution webpage

  • What platforms will IISLogs run on?

Windows XP Professional/Vista, Windows 2000/2003/2008/2008r2/2012

  • What version of .NET Framework needed to run?

.Net Framework 2.0, 4.0

What will this component do to the logfiles?

Based on a configurable time setting, it will zip and/or delete files Will IISLogs monitor multiple directories? Yes, it can monitor multiple directories or a single directory, the preference is yours.

  • Can I do this same option with VBScript, pkzip or winzip?

Yes

  • How old does a file need to be before IISLogs will process it?

Regardless of what feature you are using, IISLogs handles files 1 hour or older. For example, if the file last writetime was 12:00:00 AM (Midnight), you could set IISLogs to process the file at 1:01 AM. We encourage everyone testing IISLogs to install on a non-production system and learn what configuration works best. Always make a backup copy of log files before testing IISLogs or other 3rd party products.

  • How much will IISLogs cost?

IISLogs is priced per machine. Enterprise, educational and volume licensing also available (contact [email protected] for more details). Pricing is the same for Stand-Alone EXE or Windows Service Version.
Client here to purchase

  • Will IISLogs component run as a Windows Service or a stand-alone EXE?

There are versions (A stand-alone EXE and a Windows Service) – both of these are full versions.

  • Will IISLogs component require running as an Administrator credentials?

This still has to be worked out for configuration, the default setting is targeted NOT to require running as an Administrator. It will require permissions to to the directories that Store Internet Information server and related log files.

  • Will IISLogs record logging information to central SQL Server?

This is being considered, all current logging information is stored in a configurable log directory located on the local machine. Future enhancements will consider this option. The IISLogs internal log files are delimited so you could import using a tool like Excel or Access.

  • What are the main *features* of IISLogs?

There are many options to configure IISLogs, each option provides their own configurable settings to provide flexibility. The first option will allow for monitoring one or more specific directories (c:wwwLogsw3svc1mySite). An additional option will monitor entire directory structures. Either option will ZIP and/or Delete files based on configured settings. IISLogs can be setup to JUST ZIP files and/or delete files in the same directory structure. What we mean by directory structures? This is simple, by default, Internet Information Server puts web log files in %SystemRoot%System32Logfiles directory with several sub-directories below. There could be sub-directories for FTP, SMTP and WWW services; they might be named such as (MSFTPSVC1, SMTPSVC1, W3SVC1, W3SVC2 etc.). This option provides to monitor all of these sub-directories. If your running many websites on the same server, you might have configured IIS to store these log files in a different directory (IE D:wwwlogs). IISLogs can monitor custom directory structures also.

The second feature is to monitor the directories associated with the Microsoft SMTP Service. If your web applications use this functionality, these directories fill up with un-needed files. This feature is simple; it deletes files after a certain configurable date. This SMTP feature is effective in helping keep those directories free of 1000’s of bad emails and old files.

The third feature is similar to the SMTP option; it will monitor specific directories and delete files based on its own configured setting. Why does IISLogs have this option when it can be setup in the first option? First of all, this option monitors just single directories not entire directory structures like the first option does. There are occasions where certain directories need to have different retention periods that other directory structures. This option provides for this very situation. File Naming Options allows for someone to control what the ZIP file is named. This is available in both the Stand-Alone and Windows Service version. Per Directory (Available in IISLogs 2.).

  • Does IISLogs read the IIS metabase to get any IIS settings?

Yes, using the IISLogsGUI, part of the IISLogs suite, has a feature called EasyConfig that will read the metabase and automatically configure the required specific Directories.

  • Can I turn off detail logging?

Yes, this will reduce the need to receive a daily email on what happened on that particular machine. This is only recommended if you want IISLogs to run and not be notified about what is happening on the machine.

  • Will IISLogs run if I *JUST* copy the directory to another server w/o first running the setup.exe?

Yes, you can just copy the directory to another server without running the setup.exe as long as a few things are done. IISLogs is designed to be very easy to distribute and setup on many computers w/o manually installing on every machine. 1 – The server getting the files copied to is setup the same or similiar. the biggest thing is where the Log files are stored. From experience, shops with a lot of web servers typically store their web logs files in a central directory (such as D:Logfiles or D:wwwlogs). 2 – Below the InstallDirOfIISLogslogsPolicyAgreements directory is copied too. This is a security mechanism built into IISLogs to insure the administrator has thought through the configuration. IISLogs won’t ZIP or Delete files w/o these files being present. 3 – The IISLogs.exe.config has the appropriate log file paths on the target server. If you have further questions how to automate distribution of IISLogs w/o having to manually install on every machine, please contact [email protected]

  • Can I edit the IISLogs.exe.config using a generic text editor

Yes except for the MailUID and and MailPWD values which ONLY can be done through IISLogsGUI. These values are stored in a encrypted format.

  • How do I unzip or uncompress several zip files so I can re-run my stats program like Deep Matrix or Web Trends?

Use the built-in Windows 2003/XP to highlight and compress all ZIP files residing in the log file directories. If your using Windows 2000, you can use WINRAR or WINZIP to highlight and unzip/uncompress the files.

  • When configuring the specific options for IISLogs, will the MonitoredSpecificDirectories directories be used when trying to use the DeleteOnlySpecificDirectories?

No, these features are complete separate configuration options, each Feature (MonitoredEntireDirectories, MonitoredSpecificDirectories) use one set duration parameters, https://iislogs.com/help/Getting_Started/configuration_file.htm#Standard_Configuration_Options

  • SMTP feature has its own set of configuration options DeleteOnlySpecificDirectories has its own set of config options. What is the difference between The Delete Feature and Delete ONLY Specific Directories feature?

This can be confusing at first but it was done with the intention to provide flexibility. The Delete Feature is part of the entire ZIP Process. This process allows someone the flexibility to ZIP files X number of days old and then after Y number of days delete files that are zipped. Imagine log files that are older than 7 days would be zipped, after 180 days old delete these zipped files. This is what the Delete feature does, its just part of the entire ZIP file process. You don’t have to delete files but the option is available. The Delete ONLY Directories feature is separate and intended for those who JUST want to have the option of deleting files w/o worrying about ZIP process.

  • On the “Per Directory” what is the difference between the “Recursive” and “Include subdirectories”.

Recursive means it will start at a particular folder, such as c:wwwlogs and handle all sub-folders below the directory specified. It ‘recursively’ goes through all sub-directories and processes files based on rules specified. When recursive is selected, the ‘root’ folder isn’t processed. The ‘“Include subdirectories”’ options will process files in the ‘root’ folder specified, such as c:wwwlogs.

  • Can you clarify how I should use ‘unknown extensions’.

We have an internal function that checks to ensure the file type isn’t a known Operating system type file. We have tried to document most known file types and not allow IISLogs to process these files. For example, if you have a file with a datetime extension or no file extension, the ‘unknown extensions’ would help process these types of files. We recommend you carefully evaluate in a test environment before you enable this feature. Also, ensure you have backups to ensure if a file is processed, you can restore it.

Best regards,

Steve Schofield
Windows Server MVP – IIS
http://weblogs.asp.net/steveschofield

http://www.IISLogs.com
Log archival solution.
Install, Configure, Forget