<# .SYNOPSIS Module for listing Intune assignments .DESCRIPTION .NOTES Author: Mikael Karlsson #> function Get-ModuleVersion { '1.0.1' } function Invoke-InitializeModule { Add-EMToolsViewItem (New-Object PSObject -Property @{ Title = "Intune Assignments" Id = "IntuneAssignments" ViewID = "EMTools" Permissons=@("DeviceManagementConfiguration.ReadWrite.All") Icon="DeviceConfiguration" ShowViewItem = { Show-EMToolsIntuneAssignments } }) } function Show-EMToolsIntuneAssignments { if(-not $script:frmIntuneAssignments) { $script:frmIntuneAssignments = Get-XamlObject ($global:AppRootFolder + "\Xaml\EndpointManagerToolsIntuneAssignments.xaml") #-AddVariables if(-not $script:frmIntuneAssignments) { return } Add-XamlEvent $script:frmIntuneAssignments "btnBrowseIntuneAssignmentsExportPath" "add_click" ({ $folder = Get-Folder (Get-XamlProperty $script:frmIntuneAssignments "txtIntuneAssignmentsExportPath" "Text") "Select root folder for exported files" if($folder) { Set-XamlProperty $script:frmIntuneAssignments "txtIntuneAssignmentsExportPath" "Text" $folder } }) Add-XamlEvent $script:frmIntuneAssignments "btnGetIntuneAssignments" "add_click" ({ $folder = Get-XamlProperty $script:frmIntuneAssignments "txtIntuneAssignmentsExportPath" "Text" if($folder) { Write-Status "Get Intune Assignments" Get-EMIntuneAssignments $folder Write-Status "" } }) Add-XamlEvent $script:frmIntuneAssignments "btnIntuneAssignmentsCopy" "add_click" ({ $script:objAssignments | Select Name, Type, IncludedString, ExcludedString | ConvertTo-Csv -NoTypeInformation | Set-Clipboard }) Add-XamlEvent $script:frmIntuneAssignments "btnIntuneAssignmentsSave" "add_click" ({ $dlgSave = New-Object -Typename System.Windows.Forms.SaveFileDialog #$dlgSave.InitialDirectory = Get-SettingValue "IntuneRootFolder" $env:Temp $dlgSave.FileName = $obj.FileName $dlgSave.DefaultExt = "*.csv" $dlgSave.Filter = "CSV (*.csv)|*.csv|All files (*.*)| *.*" if($dlgSave.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK -and $dlgSave.Filename) { $script:objAssignments | Select Name, Type, IncludedString, ExcludedString | ConvertTo-Csv -NoTypeInformation | Out-File -LiteralPath $dlgSave.Filename -Encoding UTF8 -Force } }) } $global:grdToolsMain.Children.Clear() $global:grdToolsMain.Children.Add($frmIntuneAssignments) } function Get-EMIntuneAssignmentInfo { param($rootDir) Write-Status "Gather Export Information" $path = "$rootDir\Groups" $script:htGroups = @{} foreach($file in (Get-Item -path "$path\*.json")) { $graphObj = (ConvertFrom-Json (Get-Content -LiteralPath $file.FullName -Raw)) $htGroups.Add($graphObj.Id, $graphObj) } $script:fileArr = @() foreach($path in [IO.Directory]::EnumerateDirectories($rootDir)) { if($path -eq "$rootDir\Groups") { continue } foreach($file in (Get-Item -path "$path\*.json" -Exclude @("*_settings.json","*_assignments.json"))) { $graphObj = (ConvertFrom-Json (Get-Content -LiteralPath $file.FullName -Raw)) $obj = New-Object PSObject -Property @{ FileName = $file.Name FileInfo = $file Selected = $SelectedStatus Object = $graphObj } $script:fileArr += $obj } } } function Get-EMIntuneAssignments { param($folder) Set-XamlProperty $script:frmIntuneAssignments "dgIntuneAssignments" "ItemsSource" $null $folderDI = [IO.DirectoryInfo]$folder if(-not $folderDI.Exists) { return } Get-EMIntuneAssignmentInfo $folder Write-Status "Collect exported assignments" $intuneViewObj = $global:viewObjects | Where { $_.ViewInfo.ID -eq "IntuneGraphAPI" } $script:objAssignments = @() foreach($fileObj in $script:fileArr) { $objectType = $null $folderName = $fileObj.FileInfo.Directory.Name if($folderName) { $objectType = $intuneViewObj.ViewItems | Where Id -eq $folderName } $obj = New-Object PSObject -Property @{ Object = $fileObj.Object Name = $fileObj.Object."$((?? $objectType.NameProperty "displayName"))" Type = $null Included = $null Excluded = $null IncludedString = "" ExcludedString = "" } $obj.Included = @() $obj.Excluded = @() if($fileObj.Object.'@OData.Type') { $obj.Type = $fileObj.Object.'@OData.Type'.Split('.')[-1] } else { $obj.Type = $file.Directory.Parent.Name } foreach($assignment in $fileObj.Object.assignments) { $assignmentObj = $null $included = $true if($assignment.target.'@odata.type' -eq "#microsoft.graph.groupAssignmentTarget" -or $assignment.target.'@odata.type' -eq "#microsoft.graph.exclusionGroupAssignmentTarget") { if($script:htGroups.ContainsKey($assignment.target.groupId)) { $assignmentObj = $script:htGroups[$assignment.target.groupId].displayName } else { Write-Warning "Could not find a group with ID $($assignment.target.groupId)" } $included = $assignment.target.'@odata.type' -eq "#microsoft.graph.groupAssignmentTarget" } elseif($assignment.target.'@odata.type' -eq "#microsoft.graph.allDevicesAssignmentTarget") { $assignmentObj = "All Devices" } elseif($assignment.target.'@odata.type' -eq "#microsoft.graph.allLicensedUsersAssignmentTarget") { $assignmentObj = "All Users" } if($included) { $obj.Included += $assignmentObj } else { $obj.Excluded += $assignmentObj } } $obj.IncludedString = $obj.Included -join ";" $obj.ExcludedString = $obj.Excluded -join ";" $script:objAssignments += $obj } Add-XamlEvent $script:frmIntuneAssignments "txtIntuneAssignmentsFilter" "Add_LostFocus" ({ Invoke-IntueAssignmentFilterBoxChanged $this }) Add-XamlEvent $script:frmIntuneAssignments "txtIntuneAssignmentsFilter" "Add_GotFocus" ({ if($this.Tag -eq "1" -and $this.Text -eq "Filter") { $this.Text = "" } Invoke-IntueAssignmentFilterBoxChanged $this ($script:frmIntuneAssignments.FindName("dgIntuneAssignments")) }) Add-XamlEvent $script:frmIntuneAssignments "txtIntuneAssignmentsFilter" "Add_TextChanged" ({ Invoke-IntueAssignmentFilterBoxChanged $this ($script:frmIntuneAssignments.FindName("dgIntuneAssignments")) }) Invoke-IntueAssignmentFilterBoxChanged ($script:frmIntuneAssignments.FindName("txtIntuneAssignmentsFilter")) ($script:frmIntuneAssignments.FindName("dgIntuneAssignments")) $ocList = [System.Collections.ObjectModel.ObservableCollection[object]]::new(@($script:objAssignments)) Set-XamlProperty $script:frmIntuneAssignments "dgIntuneAssignments" "ItemsSource" ([System.Windows.Data.CollectionViewSource]::GetDefaultView($ocList)) } function Invoke-IntueAssignmentFilterBoxChanged { param($txtBox, $dgObject) $filter = $null if($txtBox.Text.Trim() -eq "" -and $txtBox.IsFocused -eq $false) { $txtBox.FontStyle = "Italic" $txtBox.Tag = 1 $txtBox.Text = "Filter" $txtBox.Foreground="Lightgray" } else { if($txtBox.Tag -eq "1" -and $txtBox.Text -eq "Filter" -and $txtBox.IsFocused -eq $false) { return } $txtBox.FontStyle = "Normal" $txtBox.Tag = $null $txtBox.Foreground="Black" $txtBox.Background="White" if($txtBox.Text) { $filter = { param ($item) return ( $item.Name -match [regex]::Escape($txtBox.Text) -or $item.IncludedString -match [regex]::Escape($txtBox.Text) -or $item.ExcludedString -match [regex]::Escape($txtBox.Text) ) } } } if($dgObject.ItemsSource -is [System.Windows.Data.ListCollectionView]) { # This causes odd behaviour with focus e.g. and item has to be clicked twice to be selected $dgObject.ItemsSource.Filter = $filter $dgObject.ItemsSource.Refresh() } }