function Sync-ITDVMwareVMMetadataToSharePoint { [CmdletBinding()] param ( [string[]] $VMName, [switch] $SRMImplemented, [switch] $WhatIf ) begin { } process { # validate vcenter connection # search for sharepoint record # if multiple, error # get VM (non-placeholder) information # name, cpu, memoryGB, disks, cluster, datacenter # compare, discover fields that are mismatched # if SRMImplement -eq $true, set SP record to match that # set sharepoint record to values pulled from vcenter If ($global:DefaultVIServers) { } Else { Write-Error -Message "Not connected to vCenter" -ErrorAction Stop } Write-Verbose -Message "Get SharePoint Cluster List" $SharePointClusterList = Get-ITDSharePointVMClusterList Write-Verbose -Message "Get SharePoint Guest List" $SharePointVMList = Get-ITDSharePointVMGuestList ForEach ($ComputerName in $VMName) { Write-Verbose -Message "Start $ComputerName" $RecordToUpdate = $SharePointVMList | Where-Object Title -EQ $ComputerName $VM = Get-VM -Name $ComputerName | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" } switch (@($VM).count) { { $_ -le 0 } { Write-Error -Message "No virtual machine found with name $ComputerName" -ErrorAction Stop } { $_ -gt 1 } { Write-Error -Message "More than one virtual machine found with name $ComputerName" -ErrorAction Stop } { 1 } { switch (@($RecordToUpdate).count) { { $_ -le 0 } { Write-Error "SharePoint record with Title $ComputerName not found. Create the new record first." -ErrorAction Stop } { $_ -gt 1 } { Write-Error "More than one SharePoint record found with Title equal to $ComputerName" -ErrorAction Stop } { 1 } { # get virtual hard disks and load variables $VMDisks = $VM | Get-HardDisk $VMDisk1 = ($VMDisks | Where-Object Name -EQ "Hard Disk 1").CapacityGB $VMDisk2 = ($VMDisks | Where-Object Name -EQ "Hard Disk 2").CapacityGB $VMDisk3 = ($VMDisks | Where-Object Name -EQ "Hard Disk 3").CapacityGB $VMDisk4 = ($VMDisks | Where-Object Name -EQ "Hard Disk 4").CapacityGB $VMDisk5 = ($VMDisks | Where-Object Name -EQ "Hard Disk 5").CapacityGB $VMDisk6 = ($VMDisks | Where-Object Name -EQ "Hard Disk 6").CapacityGB $VMDisk7 = ($VMDisks | Where-Object Name -EQ "Hard Disk 7").CapacityGB $VMDisk8 = ($VMDisks | Where-Object Name -EQ "Hard Disk 8").CapacityGB $VMDisk9 = ($VMDisks | Where-Object Name -EQ "Hard Disk 9").CapacityGB $VMDisk10 = ($VMDisks | Where-Object Name -EQ "Hard Disk 10").CapacityGB $VMDisk11 = ($VMDisks | Where-Object Name -EQ "Hard Disk 11").CapacityGB $VMDisk12 = ($VMDisks | Where-Object Name -EQ "Hard Disk 12").CapacityGB $VMDisk13 = ($VMDisks | Where-Object Name -EQ "Hard Disk 13").CapacityGB $VMDisk14 = ($VMDisks | Where-Object Name -EQ "Hard Disk 14").CapacityGB $VMDisk15 = ($VMDisks | Where-Object Name -EQ "Hard Disk 15").CapacityGB $VMDisk16 = ($VMDisks | Where-Object { $_.Name.split(' ')[2] -notmatch '\b([1-9]|1[0-5])\b' } | Measure-Object -Sum CapacityGB).Sum If ($null -eq $VMDisk1 ) { $VMDisk1 = 0 } If ($null -eq $VMDisk2 ) { $VMDisk2 = 0 } If ($null -eq $VMDisk3 ) { $VMDisk3 = 0 } If ($null -eq $VMDisk4 ) { $VMDisk4 = 0 } If ($null -eq $VMDisk5 ) { $VMDisk5 = 0 } If ($null -eq $VMDisk6 ) { $VMDisk6 = 0 } If ($null -eq $VMDisk7 ) { $VMDisk7 = 0 } If ($null -eq $VMDisk8 ) { $VMDisk8 = 0 } If ($null -eq $VMDisk9 ) { $VMDisk9 = 0 } If ($null -eq $VMDisk10) { $VMDisk10 = 0 } If ($null -eq $VMDisk11) { $VMDisk11 = 0 } If ($null -eq $VMDisk12) { $VMDisk12 = 0 } If ($null -eq $VMDisk13) { $VMDisk13 = 0 } If ($null -eq $VMDisk14) { $VMDisk14 = 0 } If ($null -eq $VMDisk15) { $VMDisk15 = 0 } If ($null -eq $VMDisk16) { $VMDisk16 = 0 } # Get VMware Cluster # what vcenter says, and what it should be $vCenterCluster = $VM | Get-Cluster $vCenterSharePointClusterItem = $SharePointClusterList | Where-Object Name -EQ $vCenterCluster.Name # what sharepoint currently is $SharePointClusterFieldId = $RecordToUpdate.ClusterId $SharePointClusterFieldName = $SharePointClusterList | Where-Object Id -EQ $SharePointClusterFieldId # Get VMware Datacenter $Datacenter = $VM | Get-Datacenter switch ($Datacenter.Name) { 'DCN Datacenter' { $DatacenterSharePointName = "DCN" } 'Fargo Datacenter' { $DatacenterSharePointName = "Fargo" } 'Grand Forks Vantis' { $DatacenterSharePointName = "Grand Forks" } 'Primary Datacenter' { $DatacenterSharePointName = "Bismarck" } 'Secondary Datacenter' { $DatacenterSharePointName = "Mandan" } 'VDI Datacenter' { $DatacenterSharePointName = "VDI" } } # one sharepoint record and one virtual machine, compare and set params $SetITDVMwareSharePointVMRecordParams = @{ Title = $ComputerName; } [string]$SpecialInstructions = ([string](Get-Date) + " - synchronization from vCenter, the following was changed: ") If ($VM.NumCPU -ne $RecordToUpdate.Processors) { $SetITDVMwareSharePointVMRecordParams += @{CPU = $VM.NumCpu } $SpecialInstructions += ("CPU adjusted from " + $RecordToUpdate.Processors + " to " + $VM.NumCpu + ". ") } If ($VM.MemoryGB -ne $RecordToUpdate.RAM) { $SetITDVMwareSharePointVMRecordParams += @{MemoryGB = $VM.MemoryGB } $SpecialInstructions += ("MemoryGB adjusted from " + $RecordToUpdate.RAM + " to " + $VM.MemoryGB + ". ") } If ($VMDisk1 -ne $RecordToUpdate.Disk_x0020_C_x003a_) { $SetITDVMwareSharePointVMRecordParams += @{Disk1OS = $VMDisk1 } $SpecialInstructions += ("Disk1GB adjusted from " + $RecordToUpdate.Disk_x0020_C_x003a_ + " to " + $VMDisk1 + ". ") } If ($VMDisk2 -ne $RecordToUpdate.Disk2_x002d_SwapDisk) { $SetITDVMwareSharePointVMRecordParams += @{Disk2Swap = $VMDisk2 } $SpecialInstructions += ("Disk2GB adjusted from " + $RecordToUpdate.Disk2_x002d_SwapDisk + " to " + $VMDisk2 + ". ") } If ($VMDisk3 -ne $RecordToUpdate.Disk_x0020_D_x003a_) { $SetITDVMwareSharePointVMRecordParams += @{Disk3 = $VMDisk3 } $SpecialInstructions += ("Disk3GB adjusted from " + $RecordToUpdate.Disk_x0020_D_x003a_ + " to " + $VMDisk3 + ". ") } If ($VMDisk4 -ne $RecordToUpdate.Disk_x0020__x002d__x0020_Other) { $SetITDVMwareSharePointVMRecordParams += @{Disk4 = $VMDisk4 } $SpecialInstructions += ("Disk4GB adjusted from " + $RecordToUpdate.Disk_x0020__x002d__x0020_Other + " to " + $VMDisk4 + ". ") } If ($VMDisk5 -ne $RecordToUpdate.Disk5) { $SetITDVMwareSharePointVMRecordParams += @{Disk5 = $VMDisk5 } $SpecialInstructions += ("Disk5GB adjusted from " + $RecordToUpdate.Disk5 + " to " + $VMDisk5 + ". ") } If ($VMDisk6 -ne $RecordToUpdate.Disk6) { $SetITDVMwareSharePointVMRecordParams += @{Disk6 = $VMDisk6 } $SpecialInstructions += ("Disk6GB adjusted from " + $RecordToUpdate.Disk6 + " to " + $VMDisk6 + ". ") } If ($VMDisk7 -ne $RecordToUpdate.Disk7) { $SetITDVMwareSharePointVMRecordParams += @{Disk7 = $VMDisk7 } $SpecialInstructions += ("Disk7GB adjusted from " + $RecordToUpdate.Disk7 + " to " + $VMDisk7 + ". ") } If ($VMDisk8 -ne $RecordToUpdate.Disk8) { $SetITDVMwareSharePointVMRecordParams += @{Disk8 = $VMDisk8 } $SpecialInstructions += ("Disk8GB adjusted from " + $RecordToUpdate.Disk8 + " to " + $VMDisk8 + ". ") } If ($VMDisk9 -ne $RecordToUpdate.Disk9) { $SetITDVMwareSharePointVMRecordParams += @{Disk9 = $VMDisk9 } $SpecialInstructions += ("Disk9GB adjusted from " + $RecordToUpdate.Disk9 + " to " + $VMDisk9 + ". ") } If ($VMDisk10 -ne $RecordToUpdate.Disk10) { $SetITDVMwareSharePointVMRecordParams += @{Disk10 = $VMDisk10 } $SpecialInstructions += ("Disk10GB adjusted from " + $RecordToUpdate.Disk10 + " to " + $VMDisk10 + ". ") } If ($VMDisk11 -ne $RecordToUpdate.Disk11) { $SetITDVMwareSharePointVMRecordParams += @{Disk11 = $VMDisk11 } $SpecialInstructions += ("Disk11GB adjusted from " + $RecordToUpdate.Disk11 + " to " + $VMDisk11 + ". ") } If ($VMDisk12 -ne $RecordToUpdate.Disk12) { $SetITDVMwareSharePointVMRecordParams += @{Disk12 = $VMDisk12 } $SpecialInstructions += ("Disk12GB adjusted from " + $RecordToUpdate.Disk12 + " to " + $VMDisk12 + ". ") } If ($VMDisk13 -ne $RecordToUpdate.Disk13) { $SetITDVMwareSharePointVMRecordParams += @{Disk13 = $VMDisk13 } $SpecialInstructions += ("Disk13GB adjusted from " + $RecordToUpdate.Disk13 + " to " + $VMDisk13 + ". ") } If ($VMDisk14 -ne $RecordToUpdate.Disk14) { $SetITDVMwareSharePointVMRecordParams += @{Disk14 = $VMDisk14 } $SpecialInstructions += ("Disk14GB adjusted from " + $RecordToUpdate.Disk14 + " to " + $VMDisk14 + ". ") } If ($VMDisk15 -ne $RecordToUpdate.Disk15) { $SetITDVMwareSharePointVMRecordParams += @{Disk15 = $VMDisk15 } $SpecialInstructions += ("Disk15GB adjusted from " + $RecordToUpdate.Disk15 + " to " + $VMDisk15 + ". ") } If ($VMDisk16 -ne $RecordToUpdate.Disk16) { $SetITDVMwareSharePointVMRecordParams += @{Disk16 = $VMDisk16 } $SpecialInstructions += ("Disk16GB adjusted from " + $RecordToUpdate.Disk16 + " to " + $VMDisk16 + ". ") } If ($vCenterCluster.Name -ne $SharePointClusterFieldName.Name) { $SetITDVMwareSharePointVMRecordParams += @{ClusterId = $vCenterSharePointClusterItem.Id } $SpecialInstructions += ("ClusterId adjusted from " + $RecordToUpdate.ClusterId + " to " + $vCenterSharePointClusterItem.Id + ". ") $SpecialInstructions += ("Cluster adjusted to " + $vCenterSharePointClusterItem.Name + ". ") } If ($DatacenterSharePointName -ne $RecordToUpdate.Datacenter) { $SetITDVMwareSharePointVMRecordParams += @{'Datacenter' = $DatacenterSharePointName } $SpecialInstructions += ("Datacenter adjusted from " + $RecordToUpdate.Datacenter + " to " + $DatacenterSharePointName + ". ") } If($PSBoundParameters.ContainsKey('SRMImplemented')){ $SetITDVMwareSharePointVMRecordParams += @{SRM_Status = 'Implemented'} $SpecialInstructions += ("SRM_Status set to Implemented. SRM_RecoveryVMtype set to Reserved. SRM_ConfiguredDate set to " + (Get-Date)) } $SetITDVMwareSharePointVMRecordParams += @{SpecialInstructions = $SpecialInstructions } If ($WhatIf) { Write-Warning -Message ("The following fields in SharePoint record #" + $RecordToUpdate.ID + " for Title " + $RecordToUpdate.Title + " would be changed:") $SetITDVMwareSharePointVMRecordParams } Else { $SetITDVMwareSharePointVMRecordParams Set-ITDVMwareSharePointVMRecord @SetITDVMwareSharePointVMRecordParams #-Verbose } } } } } } } end { $postParams = [PSCustomObject]@{ AutomationName = "Infra-VMware"; Action = 'Change'; Units = 3; Platform = 'ServiceNow-Overhead-SharePointDualEntry'; } Invoke-RestMethod -Uri http://itdnettools.nd.gov/services/automation-tracking.py -Method POST -Body ($postParams | ConvertTo-Json) | Out-Null } }