<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic NetApp and VMware powercli to recover fast vm (mount snapshot) in VMware PowerCLI Discussions</title>
    <link>https://communities.vmware.com/t5/VMware-PowerCLI-Discussions/NetApp-and-VMware-powercli-to-recover-fast-vm-mount-snapshot/m-p/2151542#M70148</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="Screen Shot 2014-06-02 at 17.47.04.png"&gt;&lt;img src="https://communities.vmware.com/t5/image/serverpage/image-id/52394i299487F8A7F5C028/image-size/large?v=v2&amp;amp;px=999" role="button" title="Screen Shot 2014-06-02 at 17.47.04.png" alt="Screen Shot 2014-06-02 at 17.47.04.png" /&gt;&lt;/span&gt;Easy tool to internal team.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The main advantage of mounting a read/write snapshot is very easy and fast recovery.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The machine can up and running in less than a min as described below&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This will do following : restore vm by date with easy gui&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;1. poweroff or shutdown a vm&lt;/P&gt;&lt;P&gt;2. create vol snapshot&lt;/P&gt;&lt;P&gt;3. delete vm&lt;/P&gt;&lt;P&gt;4. create igroup with wwn&lt;/P&gt;&lt;P&gt;5. map snapshot to a lun (lun clone) and to a igroup&lt;/P&gt;&lt;P&gt;6. register the vm and poweron&lt;/P&gt;&lt;P&gt;7.svmotion to the original datastore&lt;/P&gt;&lt;P&gt;8. unmount datastore and unmap lun&lt;/P&gt;&lt;P&gt;9.delete lun&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The time till full recovery is only between phase 1-6.&lt;/P&gt;&lt;P&gt;Phase 7-9 will be done in the background while the vm is up and running.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;lt;PastedGraphic-1.png&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;function button ($App_title,$button_variable1, $button_variable2) {#, $TF) {&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;###################Load Assembly for creating form &amp;amp; button######&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;[void][System.Reflection.Assembly]::LoadWithPartialName( “System.Windows.Forms”)&lt;/P&gt;&lt;P&gt;[void][System.Reflection.Assembly]::LoadWithPartialName( “Microsoft.VisualBasic”)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$form = New-Object “System.Windows.Forms.Form”;&lt;/P&gt;&lt;P&gt;$form.Width = 500;&lt;/P&gt;&lt;P&gt;$form.Height = 150;&lt;/P&gt;&lt;P&gt;$form.Text = $App_title;&lt;/P&gt;&lt;P&gt;$form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;##############Define text label1&lt;/P&gt;&lt;P&gt;$textLabel1 = New-Object “System.Windows.Forms.Label”;&lt;/P&gt;&lt;P&gt;$textLabel1.Left = 25;&lt;/P&gt;&lt;P&gt;$textLabel1.Top = 15;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$textLabel1.Text = $button_variable1;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;##############Define text label2&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$textLabel2 = New-Object “System.Windows.Forms.Label”;&lt;/P&gt;&lt;P&gt;$textLabel2.Left = 25;&lt;/P&gt;&lt;P&gt;$textLabel2.Top = 50;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$textLabel2.Text = $button_variable2;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;##############Define text label3&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#$textLabel3 = New-Object “System.Windows.Forms.Label”;&lt;/P&gt;&lt;P&gt;#$textLabel3.Left = 25;&lt;/P&gt;&lt;P&gt;#$textLabel3.Top = 85;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#$textLabel3.Text = $TF;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;############Define text box1 for input&lt;/P&gt;&lt;P&gt;$textBox1 = New-Object “System.Windows.Forms.TextBox”;&lt;/P&gt;&lt;P&gt;$textBox1.Left = 150;&lt;/P&gt;&lt;P&gt;$textBox1.Top = 10;&lt;/P&gt;&lt;P&gt;$textBox1.width = 200;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;############Define text box2 for input&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$textBox2 = New-Object “System.Windows.Forms.TextBox”;&lt;/P&gt;&lt;P&gt;$textBox2.Left = 150;&lt;/P&gt;&lt;P&gt;$textBox2.Top = 50;&lt;/P&gt;&lt;P&gt;$textBox2.width = 200;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;############Define text box3 for input&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#$textBox3 = New-Object “System.Windows.Forms.TextBox”;&lt;/P&gt;&lt;P&gt;#$textBox3.Left = 150;&lt;/P&gt;&lt;P&gt;#$textBox3.Top = 90;&lt;/P&gt;&lt;P&gt;#$textBox3.width = 200;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#############Define default values for the input boxes&lt;/P&gt;&lt;P&gt;$defaultValue = “”&lt;/P&gt;&lt;P&gt;$textBox1.Text = $defaultValue;&lt;/P&gt;&lt;P&gt;$textBox2.Text = $defaultValue;&lt;/P&gt;&lt;P&gt;#$textBox3.Text = $defaultValue;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#############define OK button/“execute restore”;&lt;/P&gt;&lt;P&gt;$button = New-Object “System.Windows.Forms.Button”;&lt;/P&gt;&lt;P&gt;$button.Left = 360;&lt;/P&gt;&lt;P&gt;$button.Top = 85;&lt;/P&gt;&lt;P&gt;$button.Width = 100;&lt;/P&gt;&lt;P&gt;$button.Text = “execute restore”;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;############# This is when you have to close the form after getting values&lt;/P&gt;&lt;P&gt;$eventHandler = [System.EventHandler]{&lt;/P&gt;&lt;P&gt;$textBox1.Text;&lt;/P&gt;&lt;P&gt;$textBox2.Text;&lt;/P&gt;&lt;P&gt;$textBox23.Text;&lt;/P&gt;&lt;P&gt;$form.Close();};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$button.Add_Click($eventHandler) ;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#############Add controls to all the above objects defined&lt;/P&gt;&lt;P&gt;$form.Controls.Add($button);&lt;/P&gt;&lt;P&gt;$form.Controls.Add($textLabel1);&lt;/P&gt;&lt;P&gt;$form.Controls.Add($textLabel2);&lt;/P&gt;&lt;P&gt;#$form.Controls.Add($textLabel3);&lt;/P&gt;&lt;P&gt;$form.Controls.Add($textBox1);&lt;/P&gt;&lt;P&gt;$form.Controls.Add($textBox2);&lt;/P&gt;&lt;P&gt;#$form.Controls.Add($textBox3);&lt;/P&gt;&lt;P&gt;$ret = $form.ShowDialog();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;return $textBox1.Text, $textBox2.Text #, $textBox3.Text&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$return= button “Restore VM” "VM_Name" "Days to recover” # “Target Folder3”&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$return[0]&lt;/P&gt;&lt;P&gt;$return[1]&lt;/P&gt;&lt;P&gt;#$return[2]&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#Get-Process $return[0],$return[1]&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$snapins = @("VMware.VimAutomation.Core")&lt;/P&gt;&lt;P&gt;foreach ($snapin in $snapins){&lt;/P&gt;&lt;P&gt;&amp;nbsp; try {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "Trying to load snapin $snapin"&lt;/P&gt;&lt;P&gt;&amp;nbsp; Add-PSSnapin $snapin -ErrorAction Stop&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "$Snapin loaded"&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; catch {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "$snapin was already loaded or cannot be loaded"&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$creds = Get-VICredentialStoreItem -file C:\sc\vc_store.creds&lt;/P&gt;&lt;P&gt;Connect-VIServer -Server $creds.host -User $creds.User -Password $creds.Password&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Import-Module dataontap&lt;/P&gt;&lt;P&gt;$netapp_controller=“ip”&lt;/P&gt;&lt;P&gt;$narootpasswd = “password"&lt;/P&gt;&lt;P&gt;$password = ConvertTo-SecureString $narootpasswd -AsPlainText -Force&lt;/P&gt;&lt;P&gt;$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "root",$password&lt;/P&gt;&lt;P&gt;Connect-NaController "$netapp_controller" -Credential $cred&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$number_days_to_resotre=$return[1]&lt;/P&gt;&lt;P&gt;$Date = Get-Date&lt;/P&gt;&lt;P&gt;$Date = $Date.adddays(-"$number_days_to_resotre")&lt;/P&gt;&lt;P&gt;$Date2Str = $Date.ToString("M/dd/yyy")&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$vm_to_restore=$return[0]&lt;/P&gt;&lt;P&gt;$original_ds=Get-Datastore -vm $vm_to_restore&lt;/P&gt;&lt;P&gt;$original_vol=Get-NaVol | where {$_.name -match $original_ds}&lt;/P&gt;&lt;P&gt;$original_lun_path=Get-NaLun | where {$_.path -match "$original_ds"}&lt;/P&gt;&lt;P&gt;$lun_temp_mounted=($original_lun_path.path+"_restore.lun")&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$Date = Get-Date&lt;/P&gt;&lt;P&gt;$Date2Str1 = $Date.ToString("dd_MM_yyy_hh_mm")&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;ForEach($vm_to_stop in $vm_to_stop)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;$vm_to_stop=get-vm "$vm_to_restore"&lt;/P&gt;&lt;P&gt;$vm_view = $vm_to_stop | get-view&lt;/P&gt;&lt;P&gt;$vmtoolsstatus = $vm_view.summary.guest.toolsRunningStatus&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Write-Host “VM $vm_to_stop tools status is $Vmtoolsstatus”&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;if ($vmtoolsstatus -eq “guestToolsRunning”)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;Shutdown-VMGuest -VM $vm_to_stop -Confirm:$false&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;else&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;stop-vm -VM $vm_to_stop -Confirm:$false&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;New-NaSnapshot -SnapName ($vm_to_restore+"_$Date2Str1") -TargetName "$original_vol" # netapp&lt;/P&gt;&lt;P&gt;$vm_to_delete= Get-VM "$vm_to_restore"| where {$_.PowerState -eq "PoweredOff"}&lt;/P&gt;&lt;P&gt;$vm_to_delete | Remove-VM -DeletePermanently -Confirm:$false&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$parentSnapshot_to_mount=Get-NaSnapshot -TargetName $original_vol | where {$_.name -match "Job1"} | where {$_.Created -match "$Date2Str"}&lt;/P&gt;&lt;P&gt;#Get-NaSnapshot -TargetName $original_vol | where {$_.name -match "Job1"} | where {$_.Created -match "$Date2Str"}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;New-NaLunClone -ParentPath "$original_lun_path" -ClonePath $lun_temp_mounted -ParentSnapshot "$parentSnapshot_to_mount" -Unreserved:$true&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#igroup esx57&lt;/P&gt;&lt;P&gt;New-NaIgroup esx57_restore_temp -Protocol fcp vmware&lt;/P&gt;&lt;P&gt;Get-NaIgroup esx57_restore_temp | Set-NaIgroup -Key alua -value yes&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Add-NaIgroupInitiator esx57_restore_temp 21:00:00:1b:32:8b:68:3f&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#Add-NaIgroupInitiator esx57_restore_temp 21:00:00:24:ff:4c:7e:6e&lt;/P&gt;&lt;P&gt;#Add-NaIgroupInitiator esx57_restore_temp 21:00:00:24:ff:4c:7e:6f&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Add-NaLunMap $lun_temp_mounted -InitiatorGroup esx57_restore_temp -ID "100"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#Get-VM $vm_to_restore | Shutdown-VMGuest -Confirm:$false&lt;/P&gt;&lt;P&gt;Get-Cluster -Name “cluster1” | Get-VMHost | Get-VMHostStorage -RescanAllHba&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$TargetVMCenterHost=“vm_host"&lt;/P&gt;&lt;P&gt;$TargetVMCenterDatastoreName="restore1"&lt;/P&gt;&lt;P&gt;$TargetLUNNo="100"&lt;/P&gt;&lt;P&gt;$scsilun= "L" + $TargetLUNNo&lt;/P&gt;&lt;P&gt;$scsi= Get-ScsiLun -VmHost $TargetVMCenterHost -LunType disk | Where{ $_.RuntimeName -match "$scsilun" }&lt;/P&gt;&lt;P&gt;$scsiCname= $scsi.CanonicalName&lt;/P&gt;&lt;P&gt;#Create a list of unbound scsi devices&lt;/P&gt;&lt;P&gt;$hostView= get-vmhost -name $TargetVMCenterHost | get-view&lt;/P&gt;&lt;P&gt;$dsView= get-view $hostView.ConfigManager.DatastoreSystem&lt;/P&gt;&lt;P&gt;$unBound= $dsView.QueryUnresolvedVmfsVolumes()&lt;/P&gt;&lt;P&gt;#Loop thru unbound scsi devices and resignature applicable device.&lt;/P&gt;&lt;P&gt;foreach&lt;/P&gt;&lt;P&gt;($ub in $UnBound) {&lt;/P&gt;&lt;P&gt;$extPaths= @()&lt;/P&gt;&lt;P&gt;$Extents= $ub.Extent;&lt;/P&gt;&lt;P&gt;foreach&lt;/P&gt;&lt;P&gt;($ex in $Extents) {&lt;/P&gt;&lt;P&gt;$extPaths= $extPaths + $ex.DevicePath&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#Only resignature desired LUN No.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;IF ($extPaths -match $scsiCname)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$res = New-Object VMware.Vim.HostUnresolvedVmfsResignatureSpec&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$res.ExtentDevicePath = $extPaths&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$dsView.ResignatureUnresolvedVmfsVolume($res)&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;#Find and rename new datastore.&lt;/P&gt;&lt;P&gt;$NewDatastore= Get-Datastore -VmHost $TargetVMCenterHost | Where{ $_.Name -like "snap-*$ProdVol0" }&lt;/P&gt;&lt;P&gt;Set-Datastore $NewDatastore -Name $TargetVMCenterDatastoreName&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;####&lt;/P&gt;&lt;P&gt;#$vm_to_restore=$vm_to_restore&lt;/P&gt;&lt;P&gt;$esxhost= Get-VMHost vm_host&lt;/P&gt;&lt;P&gt;dir vmstores:\vc_ip@443\datacenter_name\$TargetVMCenterDatastoreName\$vm_to_restore\*.vmx |&lt;/P&gt;&lt;P&gt;% {New-VM -Host $esxhost -VMFilePath $_.DatastoreFullPath}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;###start and svmotion&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Get-VM $vm_to_restore | Start-VM&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Get-VM $vm_to_restore | Move-VM -Datastore $original_ds&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;# if to check if datastore is not used some how&lt;/P&gt;&lt;P&gt;##&lt;/P&gt;&lt;P&gt;Function Get-DatastoreMountInfo {&lt;/P&gt;&lt;P&gt;&amp;nbsp; [CmdletBinding()]&lt;/P&gt;&lt;P&gt;&amp;nbsp; Param (&lt;/P&gt;&lt;P&gt;&amp;nbsp; [Parameter(ValueFromPipeline=$true)]&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; )&lt;/P&gt;&lt;P&gt;&amp;nbsp; Process {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $AllInfo = @()&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (-not $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore = Get-Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($ds in $Datastore) { &lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.info.Vmfs) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSDiskName = $ds.ExtensionData.Info.vmfs.extent[0].diskname&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.Host) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $attachedHosts = $ds.ExtensionData.Host&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($VMHost in $attachedHosts) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostview = Get-View $VMHost.Key&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSState = $VMHost.MountInfo.Mounted&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys = Get-View $HostView.ConfigManager.StorageSystem&lt;/P&gt;&lt;P&gt;&amp;nbsp; $devices = $StorageSys.StorageDeviceInfo.ScsiLun&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($device in $devices) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info = "" | Select Datastore, VMHost, Lun, Mounted, State&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($device.canonicalName -eq $hostviewDSDiskName) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSAttachState = ""&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($device.operationalState[0] -eq "ok") {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSAttachState = "Attached"&lt;/P&gt;&lt;P&gt;&amp;nbsp; } elseif ($device.operationalState[0] -eq "off") {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSAttachState = "Detached"&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSAttachState = $device.operationalstate[0]&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info.Datastore = $ds.Name&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info.Lun = $hostviewDSDiskName&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info.VMHost = $hostview.Name&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info.Mounted = $HostViewDSState&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info.State = $hostviewDSAttachState&lt;/P&gt;&lt;P&gt;&amp;nbsp; $AllInfo += $Info&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; $AllInfo&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Function Detach-Datastore {&lt;/P&gt;&lt;P&gt;&amp;nbsp; [CmdletBinding()]&lt;/P&gt;&lt;P&gt;&amp;nbsp; Param (&lt;/P&gt;&lt;P&gt;&amp;nbsp; [Parameter(ValueFromPipeline=$true)]&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; )&lt;/P&gt;&lt;P&gt;&amp;nbsp; Process {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (-not $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "No Datastore defined as input"&lt;/P&gt;&lt;P&gt;&amp;nbsp; Exit&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($ds in $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSDiskName = $ds.ExtensionData.Info.vmfs.extent[0].Diskname&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.Host) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $attachedHosts = $ds.ExtensionData.Host&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($VMHost in $attachedHosts) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostview = Get-View $VMHost.Key&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys = Get-View $HostView.ConfigManager.StorageSystem&lt;/P&gt;&lt;P&gt;&amp;nbsp; $devices = $StorageSys.StorageDeviceInfo.ScsiLun&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($device in $devices) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($device.canonicalName -eq $hostviewDSDiskName) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $LunUUID = $Device.Uuid&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "Detaching LUN $($Device.CanonicalName) from host $($hostview.Name)..."&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys.DetachScsiLun($LunUUID);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Function Unmount-Datastore {&lt;/P&gt;&lt;P&gt;&amp;nbsp; [CmdletBinding()]&lt;/P&gt;&lt;P&gt;&amp;nbsp; Param (&lt;/P&gt;&lt;P&gt;&amp;nbsp; [Parameter(ValueFromPipeline=$true)]&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; )&lt;/P&gt;&lt;P&gt;&amp;nbsp; Process {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (-not $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "No Datastore defined as input"&lt;/P&gt;&lt;P&gt;&amp;nbsp; Exit&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($ds in $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSDiskName = $ds.ExtensionData.Info.vmfs.extent[0].Diskname&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.Host) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $attachedHosts = $ds.ExtensionData.Host&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($VMHost in $attachedHosts) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostview = Get-View $VMHost.Key&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys = Get-View $HostView.ConfigManager.StorageSystem&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "Unmounting VMFS Datastore $($DS.Name) from host $($hostview.Name)..."&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys.UnmountVmfsVolume($DS.ExtensionData.Info.vmfs.uuid);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Function Mount-Datastore {&lt;/P&gt;&lt;P&gt;&amp;nbsp; [CmdletBinding()]&lt;/P&gt;&lt;P&gt;&amp;nbsp; Param (&lt;/P&gt;&lt;P&gt;&amp;nbsp; [Parameter(ValueFromPipeline=$true)]&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; )&lt;/P&gt;&lt;P&gt;&amp;nbsp; Process {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (-not $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "No Datastore defined as input"&lt;/P&gt;&lt;P&gt;&amp;nbsp; Exit&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($ds in $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSDiskName = $ds.ExtensionData.Info.vmfs.extent[0].Diskname&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.Host) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $attachedHosts = $ds.ExtensionData.Host&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($VMHost in $attachedHosts) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostview = Get-View $VMHost.Key&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys = Get-View $HostView.ConfigManager.StorageSystem&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "Mounting VMFS Datastore $($DS.Name) on host $($hostview.Name)..."&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys.MountVmfsVolume($DS.ExtensionData.Info.vmfs.uuid);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Function Attach-Datastore {&lt;/P&gt;&lt;P&gt;&amp;nbsp; [CmdletBinding()]&lt;/P&gt;&lt;P&gt;&amp;nbsp; Param (&lt;/P&gt;&lt;P&gt;&amp;nbsp; [Parameter(ValueFromPipeline=$true)]&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; )&lt;/P&gt;&lt;P&gt;&amp;nbsp; Process {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (-not $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "No Datastore defined as input"&lt;/P&gt;&lt;P&gt;&amp;nbsp; Exit&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($ds in $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSDiskName = $ds.ExtensionData.Info.vmfs.extent[0].Diskname&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.Host) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $attachedHosts = $ds.ExtensionData.Host&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($VMHost in $attachedHosts) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostview = Get-View $VMHost.Key&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys = Get-View $HostView.ConfigManager.StorageSystem&lt;/P&gt;&lt;P&gt;&amp;nbsp; $devices = $StorageSys.StorageDeviceInfo.ScsiLun&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($device in $devices) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($device.canonicalName -eq $hostviewDSDiskName) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $LunUUID = $Device.Uuid&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "Attaching LUN $($Device.CanonicalName) to host $($hostview.Name)..."&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys.AttachScsiLun($LunUUID);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore | Get-DatastoreMountInfo | Sort Datastore, VMHost | FT -AutoSize&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2ISCSI01 | Unmount-Datastore&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2ISCSI01 | Get-DatastoreMountInfo | Sort Datastore, VMHost | FT -AutoSize&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Mount-Datastore&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Get-DatastoreMountInfo | Sort Datastore, VMHost | FT -AutoSize&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Detach-Datastore&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Get-DatastoreMountInfo | Sort Datastore, VMHost | FT -AutoSize&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Attach-datastore&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Get-DatastoreMountInfo | Sort Datastore, VMHost | FT -AutoSize&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Get-Datastore restore1 | Unmount-Datastore&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;sleep 15&lt;/P&gt;&lt;P&gt;#Remove-Datastore -Datastore $TargetVMCenterDatastoreName -VMHost vm_host -Confirm$:false # may be foreach&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#netapp&lt;/P&gt;&lt;P&gt;Get-NaLunMap $lun_temp_mounted | Remove-NaLunMap&lt;/P&gt;&lt;P&gt;Get-Cluster -Name "cluster1" | Get-VMHost | Get-VMHostStorage -RescanAllHba&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Get-NaLun $lun_temp_mounted | remove-nalun -confirm:$false&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;# delete igroup —&amp;gt; later on&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Yoni Shperling&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 02 Jun 2014 14:43:25 GMT</pubDate>
    <dc:creator>yonish</dc:creator>
    <dc:date>2014-06-02T14:43:25Z</dc:date>
    <item>
      <title>NetApp and VMware powercli to recover fast vm (mount snapshot)</title>
      <link>https://communities.vmware.com/t5/VMware-PowerCLI-Discussions/NetApp-and-VMware-powercli-to-recover-fast-vm-mount-snapshot/m-p/2151542#M70148</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="Screen Shot 2014-06-02 at 17.47.04.png"&gt;&lt;img src="https://communities.vmware.com/t5/image/serverpage/image-id/52394i299487F8A7F5C028/image-size/large?v=v2&amp;amp;px=999" role="button" title="Screen Shot 2014-06-02 at 17.47.04.png" alt="Screen Shot 2014-06-02 at 17.47.04.png" /&gt;&lt;/span&gt;Easy tool to internal team.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The main advantage of mounting a read/write snapshot is very easy and fast recovery.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The machine can up and running in less than a min as described below&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This will do following : restore vm by date with easy gui&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;1. poweroff or shutdown a vm&lt;/P&gt;&lt;P&gt;2. create vol snapshot&lt;/P&gt;&lt;P&gt;3. delete vm&lt;/P&gt;&lt;P&gt;4. create igroup with wwn&lt;/P&gt;&lt;P&gt;5. map snapshot to a lun (lun clone) and to a igroup&lt;/P&gt;&lt;P&gt;6. register the vm and poweron&lt;/P&gt;&lt;P&gt;7.svmotion to the original datastore&lt;/P&gt;&lt;P&gt;8. unmount datastore and unmap lun&lt;/P&gt;&lt;P&gt;9.delete lun&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The time till full recovery is only between phase 1-6.&lt;/P&gt;&lt;P&gt;Phase 7-9 will be done in the background while the vm is up and running.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;lt;PastedGraphic-1.png&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;function button ($App_title,$button_variable1, $button_variable2) {#, $TF) {&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;###################Load Assembly for creating form &amp;amp; button######&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;[void][System.Reflection.Assembly]::LoadWithPartialName( “System.Windows.Forms”)&lt;/P&gt;&lt;P&gt;[void][System.Reflection.Assembly]::LoadWithPartialName( “Microsoft.VisualBasic”)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$form = New-Object “System.Windows.Forms.Form”;&lt;/P&gt;&lt;P&gt;$form.Width = 500;&lt;/P&gt;&lt;P&gt;$form.Height = 150;&lt;/P&gt;&lt;P&gt;$form.Text = $App_title;&lt;/P&gt;&lt;P&gt;$form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;##############Define text label1&lt;/P&gt;&lt;P&gt;$textLabel1 = New-Object “System.Windows.Forms.Label”;&lt;/P&gt;&lt;P&gt;$textLabel1.Left = 25;&lt;/P&gt;&lt;P&gt;$textLabel1.Top = 15;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$textLabel1.Text = $button_variable1;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;##############Define text label2&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$textLabel2 = New-Object “System.Windows.Forms.Label”;&lt;/P&gt;&lt;P&gt;$textLabel2.Left = 25;&lt;/P&gt;&lt;P&gt;$textLabel2.Top = 50;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$textLabel2.Text = $button_variable2;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;##############Define text label3&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#$textLabel3 = New-Object “System.Windows.Forms.Label”;&lt;/P&gt;&lt;P&gt;#$textLabel3.Left = 25;&lt;/P&gt;&lt;P&gt;#$textLabel3.Top = 85;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#$textLabel3.Text = $TF;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;############Define text box1 for input&lt;/P&gt;&lt;P&gt;$textBox1 = New-Object “System.Windows.Forms.TextBox”;&lt;/P&gt;&lt;P&gt;$textBox1.Left = 150;&lt;/P&gt;&lt;P&gt;$textBox1.Top = 10;&lt;/P&gt;&lt;P&gt;$textBox1.width = 200;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;############Define text box2 for input&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$textBox2 = New-Object “System.Windows.Forms.TextBox”;&lt;/P&gt;&lt;P&gt;$textBox2.Left = 150;&lt;/P&gt;&lt;P&gt;$textBox2.Top = 50;&lt;/P&gt;&lt;P&gt;$textBox2.width = 200;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;############Define text box3 for input&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#$textBox3 = New-Object “System.Windows.Forms.TextBox”;&lt;/P&gt;&lt;P&gt;#$textBox3.Left = 150;&lt;/P&gt;&lt;P&gt;#$textBox3.Top = 90;&lt;/P&gt;&lt;P&gt;#$textBox3.width = 200;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#############Define default values for the input boxes&lt;/P&gt;&lt;P&gt;$defaultValue = “”&lt;/P&gt;&lt;P&gt;$textBox1.Text = $defaultValue;&lt;/P&gt;&lt;P&gt;$textBox2.Text = $defaultValue;&lt;/P&gt;&lt;P&gt;#$textBox3.Text = $defaultValue;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#############define OK button/“execute restore”;&lt;/P&gt;&lt;P&gt;$button = New-Object “System.Windows.Forms.Button”;&lt;/P&gt;&lt;P&gt;$button.Left = 360;&lt;/P&gt;&lt;P&gt;$button.Top = 85;&lt;/P&gt;&lt;P&gt;$button.Width = 100;&lt;/P&gt;&lt;P&gt;$button.Text = “execute restore”;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;############# This is when you have to close the form after getting values&lt;/P&gt;&lt;P&gt;$eventHandler = [System.EventHandler]{&lt;/P&gt;&lt;P&gt;$textBox1.Text;&lt;/P&gt;&lt;P&gt;$textBox2.Text;&lt;/P&gt;&lt;P&gt;$textBox23.Text;&lt;/P&gt;&lt;P&gt;$form.Close();};&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$button.Add_Click($eventHandler) ;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#############Add controls to all the above objects defined&lt;/P&gt;&lt;P&gt;$form.Controls.Add($button);&lt;/P&gt;&lt;P&gt;$form.Controls.Add($textLabel1);&lt;/P&gt;&lt;P&gt;$form.Controls.Add($textLabel2);&lt;/P&gt;&lt;P&gt;#$form.Controls.Add($textLabel3);&lt;/P&gt;&lt;P&gt;$form.Controls.Add($textBox1);&lt;/P&gt;&lt;P&gt;$form.Controls.Add($textBox2);&lt;/P&gt;&lt;P&gt;#$form.Controls.Add($textBox3);&lt;/P&gt;&lt;P&gt;$ret = $form.ShowDialog();&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;return $textBox1.Text, $textBox2.Text #, $textBox3.Text&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$return= button “Restore VM” "VM_Name" "Days to recover” # “Target Folder3”&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$return[0]&lt;/P&gt;&lt;P&gt;$return[1]&lt;/P&gt;&lt;P&gt;#$return[2]&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#Get-Process $return[0],$return[1]&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$snapins = @("VMware.VimAutomation.Core")&lt;/P&gt;&lt;P&gt;foreach ($snapin in $snapins){&lt;/P&gt;&lt;P&gt;&amp;nbsp; try {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "Trying to load snapin $snapin"&lt;/P&gt;&lt;P&gt;&amp;nbsp; Add-PSSnapin $snapin -ErrorAction Stop&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "$Snapin loaded"&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; catch {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "$snapin was already loaded or cannot be loaded"&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$creds = Get-VICredentialStoreItem -file C:\sc\vc_store.creds&lt;/P&gt;&lt;P&gt;Connect-VIServer -Server $creds.host -User $creds.User -Password $creds.Password&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Import-Module dataontap&lt;/P&gt;&lt;P&gt;$netapp_controller=“ip”&lt;/P&gt;&lt;P&gt;$narootpasswd = “password"&lt;/P&gt;&lt;P&gt;$password = ConvertTo-SecureString $narootpasswd -AsPlainText -Force&lt;/P&gt;&lt;P&gt;$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "root",$password&lt;/P&gt;&lt;P&gt;Connect-NaController "$netapp_controller" -Credential $cred&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$number_days_to_resotre=$return[1]&lt;/P&gt;&lt;P&gt;$Date = Get-Date&lt;/P&gt;&lt;P&gt;$Date = $Date.adddays(-"$number_days_to_resotre")&lt;/P&gt;&lt;P&gt;$Date2Str = $Date.ToString("M/dd/yyy")&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$vm_to_restore=$return[0]&lt;/P&gt;&lt;P&gt;$original_ds=Get-Datastore -vm $vm_to_restore&lt;/P&gt;&lt;P&gt;$original_vol=Get-NaVol | where {$_.name -match $original_ds}&lt;/P&gt;&lt;P&gt;$original_lun_path=Get-NaLun | where {$_.path -match "$original_ds"}&lt;/P&gt;&lt;P&gt;$lun_temp_mounted=($original_lun_path.path+"_restore.lun")&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$Date = Get-Date&lt;/P&gt;&lt;P&gt;$Date2Str1 = $Date.ToString("dd_MM_yyy_hh_mm")&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;ForEach($vm_to_stop in $vm_to_stop)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;$vm_to_stop=get-vm "$vm_to_restore"&lt;/P&gt;&lt;P&gt;$vm_view = $vm_to_stop | get-view&lt;/P&gt;&lt;P&gt;$vmtoolsstatus = $vm_view.summary.guest.toolsRunningStatus&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Write-Host “VM $vm_to_stop tools status is $Vmtoolsstatus”&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;if ($vmtoolsstatus -eq “guestToolsRunning”)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;Shutdown-VMGuest -VM $vm_to_stop -Confirm:$false&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;else&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;stop-vm -VM $vm_to_stop -Confirm:$false&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;New-NaSnapshot -SnapName ($vm_to_restore+"_$Date2Str1") -TargetName "$original_vol" # netapp&lt;/P&gt;&lt;P&gt;$vm_to_delete= Get-VM "$vm_to_restore"| where {$_.PowerState -eq "PoweredOff"}&lt;/P&gt;&lt;P&gt;$vm_to_delete | Remove-VM -DeletePermanently -Confirm:$false&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$parentSnapshot_to_mount=Get-NaSnapshot -TargetName $original_vol | where {$_.name -match "Job1"} | where {$_.Created -match "$Date2Str"}&lt;/P&gt;&lt;P&gt;#Get-NaSnapshot -TargetName $original_vol | where {$_.name -match "Job1"} | where {$_.Created -match "$Date2Str"}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;New-NaLunClone -ParentPath "$original_lun_path" -ClonePath $lun_temp_mounted -ParentSnapshot "$parentSnapshot_to_mount" -Unreserved:$true&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#igroup esx57&lt;/P&gt;&lt;P&gt;New-NaIgroup esx57_restore_temp -Protocol fcp vmware&lt;/P&gt;&lt;P&gt;Get-NaIgroup esx57_restore_temp | Set-NaIgroup -Key alua -value yes&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Add-NaIgroupInitiator esx57_restore_temp 21:00:00:1b:32:8b:68:3f&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#Add-NaIgroupInitiator esx57_restore_temp 21:00:00:24:ff:4c:7e:6e&lt;/P&gt;&lt;P&gt;#Add-NaIgroupInitiator esx57_restore_temp 21:00:00:24:ff:4c:7e:6f&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Add-NaLunMap $lun_temp_mounted -InitiatorGroup esx57_restore_temp -ID "100"&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#Get-VM $vm_to_restore | Shutdown-VMGuest -Confirm:$false&lt;/P&gt;&lt;P&gt;Get-Cluster -Name “cluster1” | Get-VMHost | Get-VMHostStorage -RescanAllHba&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$TargetVMCenterHost=“vm_host"&lt;/P&gt;&lt;P&gt;$TargetVMCenterDatastoreName="restore1"&lt;/P&gt;&lt;P&gt;$TargetLUNNo="100"&lt;/P&gt;&lt;P&gt;$scsilun= "L" + $TargetLUNNo&lt;/P&gt;&lt;P&gt;$scsi= Get-ScsiLun -VmHost $TargetVMCenterHost -LunType disk | Where{ $_.RuntimeName -match "$scsilun" }&lt;/P&gt;&lt;P&gt;$scsiCname= $scsi.CanonicalName&lt;/P&gt;&lt;P&gt;#Create a list of unbound scsi devices&lt;/P&gt;&lt;P&gt;$hostView= get-vmhost -name $TargetVMCenterHost | get-view&lt;/P&gt;&lt;P&gt;$dsView= get-view $hostView.ConfigManager.DatastoreSystem&lt;/P&gt;&lt;P&gt;$unBound= $dsView.QueryUnresolvedVmfsVolumes()&lt;/P&gt;&lt;P&gt;#Loop thru unbound scsi devices and resignature applicable device.&lt;/P&gt;&lt;P&gt;foreach&lt;/P&gt;&lt;P&gt;($ub in $UnBound) {&lt;/P&gt;&lt;P&gt;$extPaths= @()&lt;/P&gt;&lt;P&gt;$Extents= $ub.Extent;&lt;/P&gt;&lt;P&gt;foreach&lt;/P&gt;&lt;P&gt;($ex in $Extents) {&lt;/P&gt;&lt;P&gt;$extPaths= $extPaths + $ex.DevicePath&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#Only resignature desired LUN No.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;IF ($extPaths -match $scsiCname)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$res = New-Object VMware.Vim.HostUnresolvedVmfsResignatureSpec&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$res.ExtentDevicePath = $extPaths&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;$dsView.ResignatureUnresolvedVmfsVolume($res)&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;#Find and rename new datastore.&lt;/P&gt;&lt;P&gt;$NewDatastore= Get-Datastore -VmHost $TargetVMCenterHost | Where{ $_.Name -like "snap-*$ProdVol0" }&lt;/P&gt;&lt;P&gt;Set-Datastore $NewDatastore -Name $TargetVMCenterDatastoreName&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;####&lt;/P&gt;&lt;P&gt;#$vm_to_restore=$vm_to_restore&lt;/P&gt;&lt;P&gt;$esxhost= Get-VMHost vm_host&lt;/P&gt;&lt;P&gt;dir vmstores:\vc_ip@443\datacenter_name\$TargetVMCenterDatastoreName\$vm_to_restore\*.vmx |&lt;/P&gt;&lt;P&gt;% {New-VM -Host $esxhost -VMFilePath $_.DatastoreFullPath}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;###start and svmotion&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Get-VM $vm_to_restore | Start-VM&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Get-VM $vm_to_restore | Move-VM -Datastore $original_ds&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;# if to check if datastore is not used some how&lt;/P&gt;&lt;P&gt;##&lt;/P&gt;&lt;P&gt;Function Get-DatastoreMountInfo {&lt;/P&gt;&lt;P&gt;&amp;nbsp; [CmdletBinding()]&lt;/P&gt;&lt;P&gt;&amp;nbsp; Param (&lt;/P&gt;&lt;P&gt;&amp;nbsp; [Parameter(ValueFromPipeline=$true)]&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; )&lt;/P&gt;&lt;P&gt;&amp;nbsp; Process {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $AllInfo = @()&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (-not $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore = Get-Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($ds in $Datastore) { &lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.info.Vmfs) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSDiskName = $ds.ExtensionData.Info.vmfs.extent[0].diskname&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.Host) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $attachedHosts = $ds.ExtensionData.Host&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($VMHost in $attachedHosts) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostview = Get-View $VMHost.Key&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSState = $VMHost.MountInfo.Mounted&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys = Get-View $HostView.ConfigManager.StorageSystem&lt;/P&gt;&lt;P&gt;&amp;nbsp; $devices = $StorageSys.StorageDeviceInfo.ScsiLun&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($device in $devices) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info = "" | Select Datastore, VMHost, Lun, Mounted, State&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($device.canonicalName -eq $hostviewDSDiskName) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSAttachState = ""&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($device.operationalState[0] -eq "ok") {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSAttachState = "Attached"&lt;/P&gt;&lt;P&gt;&amp;nbsp; } elseif ($device.operationalState[0] -eq "off") {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSAttachState = "Detached"&lt;/P&gt;&lt;P&gt;&amp;nbsp; } else {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSAttachState = $device.operationalstate[0]&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info.Datastore = $ds.Name&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info.Lun = $hostviewDSDiskName&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info.VMHost = $hostview.Name&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info.Mounted = $HostViewDSState&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Info.State = $hostviewDSAttachState&lt;/P&gt;&lt;P&gt;&amp;nbsp; $AllInfo += $Info&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; $AllInfo&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Function Detach-Datastore {&lt;/P&gt;&lt;P&gt;&amp;nbsp; [CmdletBinding()]&lt;/P&gt;&lt;P&gt;&amp;nbsp; Param (&lt;/P&gt;&lt;P&gt;&amp;nbsp; [Parameter(ValueFromPipeline=$true)]&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; )&lt;/P&gt;&lt;P&gt;&amp;nbsp; Process {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (-not $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "No Datastore defined as input"&lt;/P&gt;&lt;P&gt;&amp;nbsp; Exit&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($ds in $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSDiskName = $ds.ExtensionData.Info.vmfs.extent[0].Diskname&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.Host) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $attachedHosts = $ds.ExtensionData.Host&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($VMHost in $attachedHosts) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostview = Get-View $VMHost.Key&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys = Get-View $HostView.ConfigManager.StorageSystem&lt;/P&gt;&lt;P&gt;&amp;nbsp; $devices = $StorageSys.StorageDeviceInfo.ScsiLun&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($device in $devices) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($device.canonicalName -eq $hostviewDSDiskName) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $LunUUID = $Device.Uuid&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "Detaching LUN $($Device.CanonicalName) from host $($hostview.Name)..."&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys.DetachScsiLun($LunUUID);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Function Unmount-Datastore {&lt;/P&gt;&lt;P&gt;&amp;nbsp; [CmdletBinding()]&lt;/P&gt;&lt;P&gt;&amp;nbsp; Param (&lt;/P&gt;&lt;P&gt;&amp;nbsp; [Parameter(ValueFromPipeline=$true)]&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; )&lt;/P&gt;&lt;P&gt;&amp;nbsp; Process {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (-not $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "No Datastore defined as input"&lt;/P&gt;&lt;P&gt;&amp;nbsp; Exit&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($ds in $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSDiskName = $ds.ExtensionData.Info.vmfs.extent[0].Diskname&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.Host) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $attachedHosts = $ds.ExtensionData.Host&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($VMHost in $attachedHosts) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostview = Get-View $VMHost.Key&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys = Get-View $HostView.ConfigManager.StorageSystem&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "Unmounting VMFS Datastore $($DS.Name) from host $($hostview.Name)..."&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys.UnmountVmfsVolume($DS.ExtensionData.Info.vmfs.uuid);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Function Mount-Datastore {&lt;/P&gt;&lt;P&gt;&amp;nbsp; [CmdletBinding()]&lt;/P&gt;&lt;P&gt;&amp;nbsp; Param (&lt;/P&gt;&lt;P&gt;&amp;nbsp; [Parameter(ValueFromPipeline=$true)]&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; )&lt;/P&gt;&lt;P&gt;&amp;nbsp; Process {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (-not $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "No Datastore defined as input"&lt;/P&gt;&lt;P&gt;&amp;nbsp; Exit&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($ds in $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSDiskName = $ds.ExtensionData.Info.vmfs.extent[0].Diskname&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.Host) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $attachedHosts = $ds.ExtensionData.Host&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($VMHost in $attachedHosts) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostview = Get-View $VMHost.Key&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys = Get-View $HostView.ConfigManager.StorageSystem&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "Mounting VMFS Datastore $($DS.Name) on host $($hostview.Name)..."&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys.MountVmfsVolume($DS.ExtensionData.Info.vmfs.uuid);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Function Attach-Datastore {&lt;/P&gt;&lt;P&gt;&amp;nbsp; [CmdletBinding()]&lt;/P&gt;&lt;P&gt;&amp;nbsp; Param (&lt;/P&gt;&lt;P&gt;&amp;nbsp; [Parameter(ValueFromPipeline=$true)]&lt;/P&gt;&lt;P&gt;&amp;nbsp; $Datastore&lt;/P&gt;&lt;P&gt;&amp;nbsp; )&lt;/P&gt;&lt;P&gt;&amp;nbsp; Process {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (-not $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "No Datastore defined as input"&lt;/P&gt;&lt;P&gt;&amp;nbsp; Exit&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($ds in $Datastore) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostviewDSDiskName = $ds.ExtensionData.Info.vmfs.extent[0].Diskname&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($ds.ExtensionData.Host) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $attachedHosts = $ds.ExtensionData.Host&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($VMHost in $attachedHosts) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $hostview = Get-View $VMHost.Key&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys = Get-View $HostView.ConfigManager.StorageSystem&lt;/P&gt;&lt;P&gt;&amp;nbsp; $devices = $StorageSys.StorageDeviceInfo.ScsiLun&lt;/P&gt;&lt;P&gt;&amp;nbsp; Foreach ($device in $devices) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; if ($device.canonicalName -eq $hostviewDSDiskName) {&lt;/P&gt;&lt;P&gt;&amp;nbsp; $LunUUID = $Device.Uuid&lt;/P&gt;&lt;P&gt;&amp;nbsp; Write-Host "Attaching LUN $($Device.CanonicalName) to host $($hostview.Name)..."&lt;/P&gt;&lt;P&gt;&amp;nbsp; $StorageSys.AttachScsiLun($LunUUID);&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore | Get-DatastoreMountInfo | Sort Datastore, VMHost | FT -AutoSize&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2ISCSI01 | Unmount-Datastore&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2ISCSI01 | Get-DatastoreMountInfo | Sort Datastore, VMHost | FT -AutoSize&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Mount-Datastore&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Get-DatastoreMountInfo | Sort Datastore, VMHost | FT -AutoSize&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Detach-Datastore&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Get-DatastoreMountInfo | Sort Datastore, VMHost | FT -AutoSize&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Attach-datastore&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;#Get-Datastore IX2iSCSI01 | Get-DatastoreMountInfo | Sort Datastore, VMHost | FT -AutoSize&lt;/P&gt;&lt;P&gt;#&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Get-Datastore restore1 | Unmount-Datastore&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;sleep 15&lt;/P&gt;&lt;P&gt;#Remove-Datastore -Datastore $TargetVMCenterDatastoreName -VMHost vm_host -Confirm$:false # may be foreach&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#netapp&lt;/P&gt;&lt;P&gt;Get-NaLunMap $lun_temp_mounted | Remove-NaLunMap&lt;/P&gt;&lt;P&gt;Get-Cluster -Name "cluster1" | Get-VMHost | Get-VMHostStorage -RescanAllHba&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Get-NaLun $lun_temp_mounted | remove-nalun -confirm:$false&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;# delete igroup —&amp;gt; later on&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Yoni Shperling&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 02 Jun 2014 14:43:25 GMT</pubDate>
      <guid>https://communities.vmware.com/t5/VMware-PowerCLI-Discussions/NetApp-and-VMware-powercli-to-recover-fast-vm-mount-snapshot/m-p/2151542#M70148</guid>
      <dc:creator>yonish</dc:creator>
      <dc:date>2014-06-02T14:43:25Z</dc:date>
    </item>
  </channel>
</rss>

