Bulk Compare, Bulk Copy + bug fixes
This commit is contained in:
Mikael Karlsson
2021-07-05 18:25:33 +10:00
parent 1556c447c5
commit e66814055d
40 changed files with 1477 additions and 103 deletions

173
Extensions/Copy.psm1 Normal file
View File

@@ -0,0 +1,173 @@
function Get-ModuleVersion
{
'1.0.0'
}
function Invoke-InitializeModule
{
}
function Invoke-ViewActivated
{
if($global:currentViewObject.ViewInfo.ID -ne "IntuneGraphAPI") { return }
$tmp = $mnuMain.Items | Where Name -eq "EMBulk"
if($tmp)
{
$tmp.AddChild(([System.Windows.Controls.Separator]::new())) | Out-Null
$subItem = [System.Windows.Controls.MenuItem]::new()
$subItem.Header = "Cop_y"
$subItem.Add_Click({Show-CopyBulkForm})
$tmp.AddChild($subItem)
}
}
function Show-CopyBulkForm
{
$script:form = Get-XamlObject ($global:AppRootFolder + "\Xaml\BulkCopy.xaml") -AddVariables
if(-not $script:form) { return }
$global:txtCopyFromPattern.Text = Get-Setting "Copy" "CopyFromPattern"
$global:txtCopyToPattern.Text = Get-Setting "Copy" "CopyToPattern"
$script:copyObjects = @()
foreach($objType in $global:lstMenuItems.ItemsSource)
{
if(-not $objType.Title) { continue }
$script:copyObjects += New-Object PSObject -Property @{
Title = $objType.Title
Selected = $true
ObjectType = $objType
}
}
$column = Get-GridCheckboxColumn "Selected"
$global:dgObjectsToCopy.Columns.Add($column)
$column.Header.IsChecked = $true # All items are checked by default
$column.Header.add_Click({
foreach($item in $global:dgObjectsToCopy.ItemsSource)
{
$item.Selected = $this.IsChecked
}
$global:dgObjectsToCopy.Items.Refresh()
}
)
# Add Object type column
$binding = [System.Windows.Data.Binding]::new("Title")
$column = [System.Windows.Controls.DataGridTextColumn]::new()
$column.Header = "Object type"
$column.IsReadOnly = $true
$column.Binding = $binding
$global:dgObjectsToCopy.Columns.Add($column)
$global:dgObjectsToCopy.ItemsSource = $script:copyObjects
Add-XamlEvent $script:form "btnClose" "add_click" {
$script:form = $null
Show-ModalObject
}
Add-XamlEvent $script:form "btnStartCopy" "add_click" {
Write-Status "Copy objects"
Start-BulkCopyObjects
Write-Status ""
}
Show-ModalForm "Bulk Copy Objects" $script:form -HideButtons
}
function Start-BulkCopyObjects
{
Write-Log "****************************************************************"
Write-Log "Start bulk copy"
Write-Log "****************************************************************"
$copyFrom = $global:txtCopyFromPattern.Text
$copyTo = $global:txtCopyToPattern.Text
if(-not $copyFrom -or -not $copyTo)
{
[System.Windows.MessageBox]::Show("Both name patterns must be specified", "Error", "OK", "Error")
return
}
Save-Setting "Copy" "CopyFromPattern" $global:txtCopyFromPattern.Text
Save-Setting "Copy" "CopyToPattern" $global:txtCopyToPattern.Text
foreach($item in ($global:dgObjectsToCopy.ItemsSource | where Selected -eq $true))
{
Write-Status "Copy $($item.ObjectType.Title) objects" -Force -SkipLog
Write-Log "----------------------------------------------------------------"
Write-Log "Copy $($item.ObjectType.Title) objects"
Write-Log "----------------------------------------------------------------"
$url = $item.ObjectType.API
if($item.ObjectType.QUERYLIST)
{
$url = "$($url.Trim())?$($item.ObjectType.QUERYLIST.Trim())"
}
$graphObjects = @(Get-GraphObjects -Url $url -property $item.ObjectType.ViewProperties -objectType $item.ObjectType)
$nameProp = ?? $item.ObjectType.NameProperty "displayName"
foreach($graphObj in ($graphObjects | Where { $_.Object."$($nameProp)" -imatch [regex]::Escape($copyFrom) }))
{
$sourceName = $graphObj.Object."$($nameProp)"
$copyName = $sourceName -ireplace [regex]::Escape($copyFrom),$copyTo
$copyObj = $graphObjects | Where { $_.Object."$($nameProp)" -eq $copyName -and $_.Object.'@OData.Type' -eq $graphObj.Object.'@OData.Type' }
if(($copyObj | measure).Count -gt 0)
{
Write-Log "Object with name $copyName already exists. $sourceName will not be copied" 2
continue
}
else
{
Write-Status "Create $copyName from $sourceName" -Force
if($graphObj.ObjectType.PreCopyCommand)
{
if((& $graphObj.ObjectType.PreCopyCommand $graphObj.Object $graphObj.ObjectType $copyName))
{
continue
}
}
$copyFromObj = (Get-GraphObject $graphObj.Object $graphObj.ObjectType -SkipAssignments).Object
# Convert to Json and back to clone the object
$obj = ConvertTo-Json $copyFromObj -Depth 10 | ConvertFrom-Json
if($obj)
{
# Import new profile
Set-GraphObjectName $obj $graphObj.ObjectType $copyName
$newObj = Import-GraphObject $obj $graphObj.ObjectType
if($newObj)
{
if($graphObj.ObjectType.PostCopyCommand)
{
& $graphObj.ObjectType.PostCopyCommand $copyFromObj $newObj $graphObj.ObjectType
}
}
else
{
Write-log "Failed to copy $sourceName" 3
}
}
}
}
}
Write-Log "****************************************************************"
Write-Log "Bulk copy finished"
Write-Log "****************************************************************"
Write-Status ""
}