├── .gitignore
├── .tmp
├── appImg.png
├── deviceImg.png
├── memberImg.png
├── policyImg.png
└── compPolicyImg.png
├── .images
├── copyGroup.png
├── groupView.png
├── startPage.png
├── downloadGitHub.png
├── groupOverview.png
├── migrateGroup.png
├── syncAllDevices.png
└── addConfiguration.png
├── libaries
├── ControlzEx.dll
├── AlertBarWpf.dll
├── MahApps.Metro.dll
└── SimpleDialogs.dll
├── LICENSE
├── xaml
├── message.xaml
└── ui.xaml
├── modules
├── pageMain.psm1
├── utility.psm1
├── pageGroupMgmt.psm1
└── uiHandler.psm1
├── README.md
└── Start-IntuneToolBox.ps1
/.gitignore:
--------------------------------------------------------------------------------
1 | template.ps1
2 |
--------------------------------------------------------------------------------
/.tmp/appImg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.tmp/appImg.png
--------------------------------------------------------------------------------
/.tmp/deviceImg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.tmp/deviceImg.png
--------------------------------------------------------------------------------
/.tmp/memberImg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.tmp/memberImg.png
--------------------------------------------------------------------------------
/.tmp/policyImg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.tmp/policyImg.png
--------------------------------------------------------------------------------
/.images/copyGroup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.images/copyGroup.png
--------------------------------------------------------------------------------
/.images/groupView.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.images/groupView.png
--------------------------------------------------------------------------------
/.images/startPage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.images/startPage.png
--------------------------------------------------------------------------------
/.tmp/compPolicyImg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.tmp/compPolicyImg.png
--------------------------------------------------------------------------------
/libaries/ControlzEx.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/libaries/ControlzEx.dll
--------------------------------------------------------------------------------
/.images/downloadGitHub.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.images/downloadGitHub.png
--------------------------------------------------------------------------------
/.images/groupOverview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.images/groupOverview.png
--------------------------------------------------------------------------------
/.images/migrateGroup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.images/migrateGroup.png
--------------------------------------------------------------------------------
/.images/syncAllDevices.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.images/syncAllDevices.png
--------------------------------------------------------------------------------
/libaries/AlertBarWpf.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/libaries/AlertBarWpf.dll
--------------------------------------------------------------------------------
/libaries/MahApps.Metro.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/libaries/MahApps.Metro.dll
--------------------------------------------------------------------------------
/libaries/SimpleDialogs.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/libaries/SimpleDialogs.dll
--------------------------------------------------------------------------------
/.images/addConfiguration.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JayRHa/IntuneToolBox/HEAD/.images/addConfiguration.png
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Jannik Reinhard
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/xaml/message.xaml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/modules/pageMain.psm1:
--------------------------------------------------------------------------------
1 | <#
2 | .SYNOPSIS
3 | Helper for main page
4 | .DESCRIPTION
5 | Helper for main page
6 | .NOTES
7 | Author: Jannik Reinhard
8 | #>
9 |
10 | ########################################################################################
11 | ###################################### Functions #######################################
12 | ########################################################################################
13 |
14 |
15 | ########################################################################################
16 | ################################### User Interface #####################################
17 | ########################################################################################
18 | function Get-MainFrame{
19 | $deviceManagementOverview = Get-MgDeviceManagementManagedDeviceOverview
20 | $complianceOverview = Get-MgDeviceManagementDeviceCompliancePolicyDeviceStateSummary
21 |
22 | # State
23 | $WPFLabelTotalDevicesState.Content = "$($deviceManagementOverview.EnrolledDeviceCount) Devices in your tenant"
24 | $WPFLabelIntuneOnlyState.Content = "$($deviceManagementOverview.MdmEnrolledCount) Mdm only managed devices"
25 | $WPFLabelHybrideDevicesState.Content = "$($deviceManagementOverview.DualEnrolledDeviceCount) Co-Managed devices"
26 | $WPFLabelComplianteState.Content = "$($complianceOverview.CompliantDeviceCount) Compliant devices"
27 | $WPFLabelUncomplianteState.Content = "$($complianceOverview.NonCompliantDeviceCount) Uncompliante devices"
28 |
29 | # OS
30 | $WPFLabelTotalWindowsDevicesState.Content = "$($deviceManagementOverview.deviceOperatingSystemSummary.windowsCount) devices"
31 | $WPFLabelTotalIosDevicesState.Content = "$($deviceManagementOverview.deviceOperatingSystemSummary.iosCount) devices"
32 | $WPFLabelTotalAndroidDevicesState.Content = "$($deviceManagementOverview.deviceOperatingSystemSummary.androidCount) devices"
33 | $WPFLabelTotalMacOSDevicesState.Content = "$($deviceManagementOverview.deviceOperatingSystemSummary.macOSCount) devices"
34 | $WPFLabelTotalUnknowDevicesState.Content = "$($deviceManagementOverview.deviceOperatingSystemSummary.unknownCount) devices"
35 | $WPFGridHomeFrame.Visibility = 'Visible'
36 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Intune Tool Box - Rebuild of Intune in PowerShell
2 | [Blog Post](https://jannikreinhard.com/2022/07/07/intune-tool-box-rebuild-of-intune-in-powershell/)
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | I think everyone who works with Intune on a daily basis knows the situation that they would like to have a simple feature that would simplify their daily work. In order not to have to do without exactly these small features that would make everyday life easier, I have created the Intune Tool Box. This is a WPF application that is written in PowerShell. The app has the same design as Intune but offers small helpers for the daily work. The good thing is that this app is built in such a way that it can be easily extended at any time. If you have any features in your mind that you are missing in Intune console let me know so I can add them to the app.
14 | 
15 |
16 |
17 | ## How to execute the application
18 | * Download and unzip the whole folder
19 | 
20 | * Execute the Start-IntuneToolBox.ps1
21 | * Have fun
22 |
23 | ## Features
24 | ### Overall Environment View:
25 | On the start page you can get an overview of your complete environment and see how many clients are enrolled per OS.
26 | 
27 |
28 | ### Group View:
29 | In this view you get an overview from all groups in your environment with all the features know from the Portal.
30 | 
31 |
32 | ### Sync all devices:
33 | Sync all devices in a group with one simple click.
34 | 
35 |
36 | ### Group Overview:
37 | I think you have often been in a situation where you wanted to see what is assigned to a group. Now you can easily see this in the overview.
38 | 
39 |
40 | ### Migrate Group:
41 | With this function you can convert a user group into a device group or a device group into a user group. For this it is checked who is the owner of the device or which devices a certain user owns.
42 | 
43 |
44 | ### Duplicate Group:
45 | Create a copy from a existing group. All member will be take over.
46 | 
47 |
48 | ### Assign Items:
49 | You can assign configuration profiles, compliance policies or apps direct in the group view.
50 | 
51 |
--------------------------------------------------------------------------------
/Start-IntuneToolBox.ps1:
--------------------------------------------------------------------------------
1 | <#
2 | Version: 1.0
3 | Author: Jannik Reinhard (jannikreinhard.com)
4 | Script: Create-IntuneToolBox
5 | Description:
6 | Tool box with different intune helper
7 | Release notes:
8 | Version 1.0: Init
9 | Version 1.1:
10 | - Bugfix for dll loading error
11 | - UI optiomization
12 | - IMprove stability
13 | Version 1.1.1:
14 | - Fix loging from accounts withour profile picture
15 | Version 1.1.2:
16 | - Authentication stabilization
17 |
18 | #>
19 | ###########################################################################################################
20 | ############################################ Functions ####################################################
21 | ###########################################################################################################
22 | function Get-MessageScreen{
23 | param (
24 | [Parameter(Mandatory = $true)]
25 | [String]$xamlPath
26 | )
27 |
28 | [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
29 | Add-Type -AssemblyName PresentationFramework
30 | [xml]$xaml = Get-Content $xamlPath
31 | $global:messageScreen = ([Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $xaml)))
32 | $global:messageScreenTitle = $global:messageScreen.FindName("TextMessageHeader")
33 | $global:messageScreenText = $global:messageScreen.FindName("TextMessageBody")
34 | $global:button1 = $global:messageScreen.FindName("ButtonMessage1")
35 | $global:button2 = $global:messageScreen.FindName("ButtonMessage2")
36 |
37 | $global:messageScreenTitle.Text = "Initializing Intune Tool Box"
38 | $global:messageScreenText.Text = "Starting initializing Intune Tool Box"
39 | $global:messageScreen.Show() | Out-Null
40 | [System.Windows.Forms.Application]::DoEvents()
41 | }
42 |
43 | function Import-AllModules
44 | {
45 |
46 | foreach($file in (Get-Item -path "$global:Path\modules\*.psm1"))
47 | {
48 | $fileName = [IO.Path]::GetFileName($file)
49 | if($skipModules -contains $fileName) { Write-Warning "Module $fileName excluded"; continue; }
50 |
51 | $module = Import-Module $file -PassThru -Force -Global -ErrorAction SilentlyContinue
52 | if($module)
53 | {
54 | $global:messageScreenText.Text = "Module $($module.Name) loaded successfully"
55 | }
56 | else
57 | {
58 | $global:messageScreenText.Text = "Failed to load module $file"
59 | }
60 | }
61 | }
62 |
63 | ###########################################################################################################
64 | ############################################## Start ######################################################
65 | ###########################################################################################################
66 | # Variables
67 | [array]$global:AllGroupsObservableCollection = New-Object System.Collections.ObjectModel.ObservableCollection[Object]
68 | [array]$global:AllGroupsCollection = $null
69 | [array]$global:AllGroupsItemObservableCollection = New-Object System.Collections.ObjectModel.ObservableCollection[Object]
70 | [array]$global:AllGroupsItemAddObservableCollection = New-Object System.Collections.ObjectModel.ObservableCollection[Object]
71 | [array]$global:AllGroupsItemAddCollection = $null
72 | [array]$global:AllGroupMember = $null
73 | [array]$global:AllGroupPolicies = $null
74 | [array]$global:AllPolicies = $null
75 | [array]$global:AllGroupCompliancePolicies = $null
76 | [array]$global:AllCompliancePolicies = $null
77 | [array]$global:AllGroupApps = $null
78 | [array]$global:AllApps = $null
79 |
80 | $global:Auth = $false
81 | $global:SelectedGroupId = ""
82 | $global:AllManagedItems = $null
83 | $global:GroupCreationMode = ""
84 | $global:Path = $PSScriptRoot
85 | $global:SelectedIndex = -1
86 | $global:GroupColorSelection = ("#00AAA8", "#1E7045", "#20874D", "#20874D", "#FE0096","#D9532C","#2D88EE","#D30BC4","#ED1111","#00AAA8")
87 | # Start Start Screen
88 | Get-MessageScreen -xamlPath ("$global:Path\xaml\message.xaml")
89 | $global:messageScreenTitle.Text = "Initializing Intune Tool Box"
90 | $global:messageScreenText.Text = "Starting initializing Intune Tool Box"
91 |
92 | # Load custom modules
93 | Import-AllModules
94 |
95 | #Init
96 | if (-not (Start-Init)){
97 | Write-Error "Error while loading the dlls. Exit the script"
98 | Write-Warning "Unblock all dlls and restart the powershell seassion"
99 | $global:messageScreen.Hide()
100 | Exit
101 | }
102 |
103 | # Load main windows
104 | $returnMainForm = New-XamlScreen -xamlPath ("$global:Path\xaml\ui.xaml")
105 | $global:formMainForm = $returnMainForm[0]
106 | $xamlMainForm = $returnMainForm[1]
107 | $xamlMainForm.SelectNodes("//*[@Name]") | % {Set-Variable -Name "WPF$($_.Name)" -Value $formMainForm.FindName($_.Name)}
108 | $global:formMainForm.add_Loaded({
109 | $global:messageScreen.Hide()
110 | $global:formMainForm.Activate()
111 | })
112 |
113 | # Init User interface
114 | $global:messageScreenText.Text = "Load User Interface"
115 | Set-UserInterface
116 |
117 | # Load the click actions
118 | $global:messageScreenText.Text = "Load Actions"
119 | Set-UiAction
120 | Set-UiActionButton
121 |
122 | # Authentication
123 | $global:messageScreenText.Text = "Login to Microsoft Graph (Auth Windows could be in the backround)"
124 | $auth = Set-LoginOrLogout
125 | if($auth -eq $false){
126 | Write-Error "Error during authentication"
127 | Write-Warning "Please try again"
128 | $global:messageScreen.Hide()
129 | Exit
130 | }
131 |
132 | $global:messageScreenText.Text = "Get all managed Items"
133 | Get-AllManagedItems | out-null
134 | $global:messageScreenText.Text = "Get all Configuration Profiles"
135 | Get-AllPolicies | out-null
136 | $global:messageScreenText.Text = "Get all Compliance Policies"
137 | Get-AllCompliancePolicies | out-null
138 | $global:messageScreenText.Text = "Get all Apps"
139 | Get-AllApps | out-null
140 |
141 | # Start Main Windows
142 | $global:formMainForm.ShowDialog() | out-null
--------------------------------------------------------------------------------
/modules/utility.psm1:
--------------------------------------------------------------------------------
1 | <#
2 | .SYNOPSIS
3 | Core functions
4 | .DESCRIPTION
5 | Core functions
6 | .NOTES
7 | Author: Jannik Reinhard
8 | #>
9 |
10 | ##
11 | function Start-Init {
12 | #Load dll
13 | try {
14 | [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | out-null
15 | [System.Reflection.Assembly]::LoadWithPartialName('presentationframework') | out-null
16 | [System.Reflection.Assembly]::LoadFrom("$global:Path\libaries\MahApps.Metro.dll") | out-null
17 | [System.Reflection.Assembly]::LoadFrom("$global:Path\libaries\ControlzEx.dll") | out-null
18 | [System.Reflection.Assembly]::LoadFrom("$global:Path\libaries\SimpleDialogs.dll") | out-null
19 | }catch{
20 | Write-Error "Loading from dll's was not sucessfull:"
21 | return $false
22 | }
23 |
24 | # Create temp folder
25 | if(-not (Test-Path "$global:Path\.tmp")) {
26 | New-Item "$global:Path\.tmp" -Itemtype Directory
27 | }
28 | return $true
29 | }
30 |
31 | function Get-AllManagedItems {
32 | $managedItems = @()
33 | $devices = Get-MgDevice -All
34 | $user = Get-MgUser -All
35 | $groups = Get-MgGroup -All
36 |
37 | $devices | ForEach-Object {
38 | $param = [PSCustomObject]@{
39 | ItemImg = ("$global:Path\.tmp\deviceImg.png")
40 | ImgVisible = "Visible"
41 | GridColor = $null
42 | GroupNameShort = $null
43 | GridVisible = "Collapsed"
44 | ItemName = $_.DisplayName
45 | ItemInfo = $_.DeviceId
46 | Id = $_.Id
47 | Type = "Device"
48 | GroupTypes = $null
49 | }
50 | $managedItems += $param
51 | }
52 |
53 | $user | ForEach-Object {
54 | $param = [PSCustomObject]@{
55 | ItemImg = ("$global:Path\.tmp\memberImg.png")
56 | ImgVisible = "Visible"
57 | GridColor = $null
58 | GroupNameShort = $null
59 | GridVisible = "Collapsed"
60 | ItemName = $_.DisplayName
61 | ItemInfo = $_.UserPrincipalName
62 | Id = $_.Id
63 | Type = "User"
64 | GroupTypes = $null
65 | }
66 | $managedItems += $param
67 | }
68 |
69 | $groups | ForEach-Object {
70 | $colornumber= Get-Random -Maximum 9
71 | if($_.GroupTypes[0] -eq "DynamicMembership") {$groupTypeMemberShip = "Dynamic"}else{$groupTypeMemberShip = "Assigned"}
72 | $param = [PSCustomObject]@{
73 | ItemImg = $null
74 | ImgVisible = "Collapsed"
75 | GridColor = $global:GroupColorSelection[$colornumber]
76 | GroupNameShort = ($($_.DisplayName).Substring(0,2)).ToUpper()
77 | GridVisible = "Visible"
78 | ItemName = $_.DisplayName
79 | ItemInfo = $_.Id
80 | Id = $_.Id
81 | Type = "Group"
82 | GroupTypes = $groupTypeMemberShip
83 | }
84 | $managedItems += $param
85 | }
86 |
87 | $global:AllManagedItems = $managedItems
88 | return $global:AllManagedItems
89 | }
90 |
91 | function Add-XamlEvent{
92 | param(
93 | [Parameter(Mandatory = $true)]
94 | $object,
95 | [Parameter(Mandatory = $true)]
96 | $event,
97 | [Parameter(Mandatory = $true)]
98 | $scriptBlock
99 | )
100 |
101 | try {
102 | if($object)
103 | {
104 | $object."$event"($scriptBlock)
105 | }
106 | else
107 | {
108 | $global:txtSplashText.Text = "Event $($object.Name) loaded successfully"
109 |
110 | }
111 | }
112 | catch
113 | {
114 | Write-Error "Failed load event $($object.Name). Error:" $_.Exception
115 | }
116 | }
117 |
118 | function Get-GraphAuthentication{
119 | $GraphPowershellModulePath = "$global:Path/Microsoft.Graph.psd1"
120 | if (-not (Get-Module -ListAvailable -Name 'Microsoft.Graph')) {
121 |
122 | if (-Not (Test-Path $GraphPowershelModulePath)) {
123 | Write-Error "Microsoft.Graph.Intune.psd1 is not installed on the system check: https://docs.microsoft.com/en-us/powershell/microsoftgraph/installation?view=graph-powershell-1.0"
124 | return $false
125 | }
126 | else {
127 | Import-Module "$GraphPowershellModulePath"
128 | $Success = $?
129 |
130 | if (-not ($Success)) {
131 | Write-Error "Microsoft.Graph.Intune.psd1 is not installed on the system check: https://docs.microsoft.com/en-us/powershell/microsoftgraph/installation?view=graph-powershell-1.0"
132 | return $false
133 | }
134 | }
135 | }
136 |
137 | try
138 | {
139 | Import-Module -Name Microsoft.Graph.Intune -ErrorAction Stop
140 | }
141 | catch
142 | {
143 | Write-Output "Module Microsoft.Graph.Intune was not found, try to installing in for the current user..."
144 | Install-Module -Name Microsoft.Graph.Intune -Scope CurrentUser -Force
145 | Import-Module Microsoft.Graph.Intune -Force
146 | }
147 |
148 | try {
149 | $graphLogin = Connect-MgGraph -Scopes "User.Read.All","User.Read", "Group.ReadWrite.All", "Device.Read.All", "DeviceManagementApps.ReadWrite.All", "DeviceManagementConfiguration.ReadWrite.All", "DeviceManagementManagedDevices.ReadWrite.All"
150 | $connection = $?
151 | } catch {
152 | Write-Error "Failed to connect to MgGraph"
153 | return $false
154 | }
155 | if(-not ($connection)) {return $false}
156 |
157 | try {
158 | $graphLogin = Connect-MSGraph -AdminConsent -ErrorAction Stop
159 | } catch {
160 | Write-Error "Failed to connect to MSGraph"
161 | return $false
162 | }
163 | $graphLogin = Select-MgProfile -Name "beta"
164 |
165 | return $true
166 | }
167 |
168 | function Set-LoginOrLogout{
169 | if($global:auth){
170 | Disconnect-MgGraph
171 |
172 | Set-UserInterface
173 | $global:auth = $false
174 | [System.Windows.MessageBox]::Show('You are logged out')
175 | $WPFGridHomeFrame.Visibility = 'Hidden'
176 | $WPFGridGroupManagement.Visibility = 'Hidden'
177 | Return
178 | }
179 |
180 |
181 | $connectionStatus = Get-GraphAuthentication
182 |
183 | if(-not $connectionStatus) {
184 | [System.Windows.MessageBox]::Show('login Failed')
185 | return $false
186 | }
187 |
188 | $global:auth = $true
189 |
190 |
191 | $user = Get-MgContext
192 | $org = Get-MgOrganization
193 | $upn = $user.Account
194 |
195 | Write-Host "------------------------------------------------------"
196 | Write-Host "Connection to graph success: $Success"
197 | Write-Host "Connected as: $($user.Account)"
198 | Write-Host "TenantId: $($user.TenantId)"
199 | Write-Host "Organizsation Name: $($org.DisplayName)"
200 | Write-Host "------------------------------------------------------"
201 |
202 | $return = Get-ProfilePicture -upn $upn
203 |
204 | #Set Login menue
205 | $WPFLableUPN.Content = $user.Account
206 | $WPFLableTenant.Content = $org.DisplayName
207 |
208 | # Enable tabs
209 | $WPFItemHome.IsEnabled = $true
210 | $WPFItemGroupManagement.IsEnabled = $true
211 | $WPFItemHome.IsSelected = $true
212 | return $true
213 | }
214 |
215 | function Get-DecodeBase64Image {
216 | param (
217 | [Parameter(Mandatory = $true)]
218 | [String]$imageBase64
219 | )
220 | # Parameter help description
221 | $objBitmapImage = New-Object System.Windows.Media.Imaging.BitmapImage
222 | $objBitmapImage.BeginInit()
223 | $objBitmapImage.StreamSource = [System.IO.MemoryStream][System.Convert]::FromBase64String($imageBase64)
224 | $objBitmapImage.EndInit()
225 | $objBitmapImage.Freeze()
226 | return $objBitmapImage
227 | }
228 |
229 |
230 | function Get-ProfilePicture {
231 | param (
232 | [Parameter(Mandatory = $true)]
233 | [String]$upn
234 | )
235 | $path = "$global:Path\.tmp\$upn.png"
236 |
237 | if (-Not (Test-Path $path)) {
238 | Get-MgUserPhotoContent -UserId $upn -OutFile $path -ErrorAction SilentlyContinue
239 | }
240 |
241 | if (Test-Path $path) {
242 | try{
243 | $iconButtonLogIn = [convert]::ToBase64String((get-content $path -encoding byte))
244 | $WPFImgButtonLogIn.source = Get-DecodeBase64Image -ImageBase64 $iconButtonLogIn
245 | }catch{}
246 | } else {
247 | $defaultPicture = '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'
248 | $WPFImgButtonLogIn.source = Get-DecodeBase64Image -ImageBase64 $defaultPicture
249 | }
250 | $WPFImgButtonLogIn.Width="35"
251 | $WPFImgButtonLogIn.Height="35"
252 | }
253 | ########################################################################################
254 | ########################################### UI ########################################
255 | ########################################################################################
256 | function New-XamlScreen{
257 | param (
258 | [Parameter(Mandatory = $true)]
259 | [String]$xamlPath
260 | )
261 | $inputXML = Get-Content $xamlPath
262 | [xml]$xaml = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^
9 |
10 | ########################################################################################
11 | ################################### Search Engine #####################################
12 | ########################################################################################
13 | function Search-Group{
14 | param(
15 | [String]$searchString
16 | )
17 | if($searchString.Length -lt 2) {
18 | Add-InitGroupsGrid -clearGroupList $false
19 | return
20 | }
21 | if($searchString -eq '') {
22 | Add-InitGroupsGrid -clearGroupList $false
23 | return
24 | }
25 |
26 | $global:AllGroupsObservableCollection = @()
27 | $global:AllGroupsObservableCollection = $global:AllGroupsCollection | Where `
28 | { ($_.GroupName -like "*$searchString*") -or `
29 | ($_.GroupObjectId -like "*$searchString*") -or `
30 | ($_.GroupEmail -like "*$searchString*") }
31 |
32 | Add-GroupsToGrid -groups $global:AllGroupsObservableCollection
33 | }
34 |
35 | function Search-InItemListItem{
36 | param(
37 | [String]$searchString
38 | )
39 |
40 | if($searchString.Length -lt 2) {
41 | Add-InitGroupItemGrid
42 | return
43 | }
44 | if($searchString -eq '') {
45 | Add-InitGroupItemGrid
46 | return
47 | }
48 |
49 | $global:AllGroupsItemObservableCollection = @()
50 | $global:AllGroupsItemObservableCollection = $global:AllGroupMember | Where `
51 | { ($_.ItemName -like "*$searchString*") -or `
52 | ($_.ItemType -like "*$searchString*") -or `
53 | ($_.ItemId -like "*$searchString*") -or `
54 | ($_.ItemDetails -like "*$searchString*") }
55 |
56 | $items += $global:AllGroupsItemObservableCollection | Select-Object -First $([int]$($WPFComboboxGridCount.SelectedItem))
57 | $WPFListViewGroupsViewSelection.ItemsSource = @($items)
58 | }
59 |
60 | function Search-InItemAddList{
61 | param(
62 | [String]$searchString
63 | )
64 |
65 | if($searchString.Length -lt 2) {
66 | Add-InitGroupItemAddGrid
67 | return
68 | }
69 | if($searchString -eq '') {
70 | Add-InitGroupItemAddGrid
71 | return
72 | }
73 |
74 | $global:AllGroupsItemAddObservableCollection = @()
75 | $global:AllGroupsItemAddObservableCollection = $global:AllGroupsItemAddCollection | Where `
76 | { ($_.ItemName -like "*$searchString*") -or `
77 | ($_.ItemInfo -like "*$searchString*") }
78 |
79 | $items += $global:AllGroupsItemAddObservableCollection | Select-Object -First $([int]$($WPFComboboxGridCount.SelectedItem))
80 | $WPFListViewGroupsViewAdd.ItemsSource = @($items)
81 | }
82 |
83 | ########################################################################################
84 | ##################################### All Groups #######################################
85 | ########################################################################################
86 |
87 | function Add-InitGroupsGrid{
88 | param (
89 | [boolean]$clearGroupList = $true
90 | )
91 |
92 | if(-not $global:auth) {return}
93 | if(($global:AllGroupsCollection ).Count -eq 0 -or $clearGroupList) {
94 | $global:AllGroupsCollection = @()
95 |
96 | $allGroups = Get-ManagedGroups
97 | $allGroups = $allGroups | Sort-Object -Property DisplayName
98 |
99 | foreach ($group in $allGroups) {
100 | $groupType = "Assigned"
101 | if($group.groupTypes[0] -eq "DynamicMembership") {$groupType = "Dynamic"}
102 | $colornumber= Get-Random -Maximum 9
103 | # Create object
104 | $param = [PSCustomObject]@{
105 | GroupColor = $global:GroupColorSelection[$colornumber]
106 | GroupNameShort = ($($group.displayName).Substring(0,2)).ToUpper()
107 | GroupName = $group.displayName
108 | GroupObjectId = $group.id
109 | GroupMembershipType = $groupType
110 | GroupEmail = $group.mail
111 | GroupSource = "Cloud"
112 | }
113 |
114 | $global:AllGroupsCollection += $param
115 | }
116 |
117 | }
118 | Add-GroupsToGrid -groups $global:AllGroupsCollection
119 | }
120 |
121 | function Add-GroupsToGrid{
122 | param (
123 | $groups
124 | )
125 | $items = @()
126 | $items += $groups | Select-Object -First $([int]$($WPFComboboxGridCount.SelectedItem))
127 | $WPFListViewAllGroups.ItemsSource = $items
128 | $WPFLabelCountGroups.Content = "$($items.count) Groups"
129 | }
130 | ########################################################################################
131 | ################################### Group Creation #####################################
132 | ########################################################################################
133 | function Add-MgtGroup{
134 | param (
135 | [Parameter(Mandatory = $true)]
136 | [String]$groupName,
137 | [String]$groupDescription = $null,
138 | [array]$groupMember = $null
139 | )
140 | $bodyJson = @'
141 | {
142 | "displayName": "",
143 | "groupTypes": [],
144 | "mailEnabled": false,
145 | "mailNickname": "NotSet",
146 | "securityEnabled": true
147 | }
148 | '@ | ConvertFrom-Json
149 |
150 | $bodyJson.displayName = $groupName
151 |
152 | if($groupDescription){
153 | $bodyJson | Add-Member -NotePropertyName description -NotePropertyValue $groupDescription
154 | }
155 |
156 | if($groupMember.Length -gt 0){
157 | $bodyJson | Add-Member -NotePropertyName 'members@odata.bind' -NotePropertyValue @($groupMember.uri)
158 | }
159 |
160 | $bodyJson = $bodyJson | ConvertTo-Json
161 | New-MgGroup -BodyParameter $bodyJson
162 | }
163 |
164 | function Get-MigrateGroupMember{
165 | param (
166 | [String]$migrationType,
167 | [array]$groupMember = $null,
168 | $windows = $true,
169 | $ios = $true,
170 | $macos = $true,
171 | $android = $true
172 | )
173 |
174 | $os = @()
175 | if($windows){$os += 'Windows'}
176 | if($macos){$os += 'MacMDM'}
177 | if($android){$os += 'Android'}
178 | if($ios){$os += 'IOS'}
179 |
180 | $newGroupMember = @()
181 |
182 | if($migrationType -eq 0){
183 | $groupMember | Where-Object {$_.ItemType -eq 'Device'} | Foreach-Object {
184 | $userId = (Get-MgDeviceRegisteredOwner -DeviceId $_.Id).Id
185 | if($userId){
186 | $newGroupMember += [PSCustomObject]@{
187 | Uri = "https://graph.microsoft.com/v1.0/directoryObjects/" + $userId
188 | }
189 | }
190 | }
191 | $groupMember | Where-Object {$_.ItemType -eq 'User'} | Foreach-Object {
192 | $newGroupMember += [PSCustomObject]@{
193 | Uri = $_.Uri
194 | }
195 | }
196 | }elseif($migrationType -eq 1){
197 | $groupMember | Where-Object {$_.ItemType -eq 'User'} | Foreach-Object {
198 | (Get-MgUserOwnedDevice -UserId $_.Id) | ForEach-Object {
199 | $newGroupMember += [PSCustomObject]@{
200 | Uri = "https://graph.microsoft.com/v1.0/directoryObjects/" + $_.Id
201 | OperatinSystem = $_.AdditionalProperties.operatingSystem
202 | }
203 | }
204 | }
205 | $groupMember | Where-Object {$_.ItemType -eq 'Device'} | Foreach-Object {
206 | $newGroupMember += [PSCustomObject]@{
207 | Uri = $_.Uri
208 | OperatinSystem = $_.OperatinSystem
209 | }
210 | }
211 | $newGroupMember = $newGroupMember | Where-Object {$_.OperatinSystem -in $os}
212 | }
213 | $newGroupMember = $newGroupMember | Sort-Object -Property uri -Uniqu
214 | return ,$newGroupMember
215 | }
216 | ########################################################################################
217 | ################################### Group Overview #####################################
218 | ########################################################################################
219 | function Get-ManagedGroups{
220 | $allGroups = Get-MgGroup -All
221 | $global:GroupObjects = $allGroups
222 | return $allGroups
223 | }
224 |
225 | function Open-GroupView{
226 | param (
227 | [Parameter(Mandatory = $true)]
228 | [String]$groupId
229 | )
230 | Hide-All
231 | Hide-GroupViewAll
232 | Get-GroupOverview -groupId $($global:SelectedGroupId).GroupObjectId
233 | Get-NavigationGroupViewPageChange -selectedItem "ItemGroupsOverview"
234 | $WPFListViewGroupMenu.SelectedIndex = 0
235 | $WPFGridGroupViewOverview.Visibility="Visible"
236 | $WPFGridGroupView.Visibility = 'Visible'
237 | Get-AllGroupMember -GroupId $groupId
238 | }
239 |
240 | function Get-GroupOverview{
241 | param (
242 | [Parameter(Mandatory = $true)]
243 | [String]$groupId
244 | )
245 |
246 | $group = Get-MgGroup -GroupId $groupId
247 | $countDevices = 0
248 | $countUser = 0
249 | $countGroup = 0
250 | $groupType = "Microsoft 365"
251 | $groupTypeMemberShip = "Assigned"
252 | if($group.SecurityEnabled -and $group.MailEnabled -eq $false){$groupType = "Security"}
253 | if($group.GroupTypes[0] -eq "DynamicMembership") {$groupTypeMemberShip = "Dynamic"}
254 |
255 | # Set ui info
256 | $colornumber= Get-Random -Maximum 9
257 | $WPFGridGroupPicture.Background = $global:GroupColorSelection[$colornumber]
258 | $WPFGridGroupPicture1.Background = $global:GroupColorSelection[$colornumber]
259 | $WPFTextGroupnameShort.Text = (($group.DisplayName).Substring(0,2)).ToUpper()
260 | $WPFTextGroupnameShort1.Text = (($group.DisplayName).Substring(0,2)).ToUpper()
261 | $WPFLableGroupOverviewName.Content = $group.DisplayName
262 | $WPFLableGroupName.Content = $group.DisplayName
263 | $WPFLabelSourceValue.Content = "Cloud"
264 | $WPFLabelMemberShipTypeValue.Content = $groupTypeMemberShip
265 | $WPFLabelTypeValue.Content = $groupType
266 | $WPFLabelObjectIdValue.Content = $group.Id
267 | $WPFLabelCreatedAtValue.Content = $group.CreatedDateTime
268 | $groupMember = Get-MgGroupMember -GroupId $groupId -All | Foreach-Object {
269 | if ($_.AdditionalProperties["@odata.type"] -eq "#microsoft.graph.device") {$countDevices++}
270 | if ($_.AdditionalProperties["@odata.type"] -eq "#microsoft.graph.user") {$countUser++}
271 | $countGroup++
272 | }
273 |
274 | $WPFLabelTotalGroupMembers.Content = "$countGroup Total"
275 | $WPFLabelGroupMembersUser.Content = "$countUser User(s)"
276 | $WPFLabelGroupMembersDevices.Content = "$countDevices Device(s)"
277 | }
278 |
279 | ########################################################################################
280 | #################################### Group Member ######################################
281 | ########################################################################################
282 | function Get-AllGroupMember {
283 | param(
284 | [Parameter(Mandatory = $true)]
285 | $groupId
286 | )
287 |
288 | $global:AllGroupMember = @()
289 | $groupMembers = Get-MgGroupMember -GroupId $groupId
290 | $groupMembers = $groupMembers | Sort-Object -Property AdditionalProperties.displayName
291 | $items = @()
292 |
293 | $groupMembers | ForEach-Object {
294 | if($_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.user'){
295 | $param = [PSCustomObject]@{
296 | ItemImg = ("$global:Path\.tmp\memberImg.png")
297 | ImgVisible = "Visible"
298 | GridColor = $null
299 | GroupNameShort = $null
300 | GridVisible = "Collapsed"
301 | ItemName = $_.AdditionalProperties.displayName
302 | ItemType = "User"
303 | ItemDetails = $_.AdditionalProperties.mail
304 | ItemId = $_.Id
305 | Id = $_.Id
306 | Uri = "https://graph.microsoft.com/v1.0/directoryObjects/" + $_.Id
307 | OperatinSystem = $null
308 | }
309 | $items += $param
310 | } elseif ($_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.device') {
311 | $param = [PSCustomObject]@{
312 | ItemImg = ("$global:Path\.tmp\deviceImg.png")
313 | ImgVisible = "Visible"
314 | GridColor = $null
315 | GroupNameShort = $null
316 | GridVisible = "Collapsed"
317 | ItemName = $_.AdditionalProperties.displayName
318 | ItemType = "Device"
319 | ItemId = $_.Id
320 | ItemDetails = $_.AdditionalProperties.profileType
321 | Id = $_.Id
322 | Uri = "https://graph.microsoft.com/v1.0/directoryObjects/" + $_.Id
323 | OperatinSystem = $_.AdditionalProperties.operatingSystem
324 | }
325 | $items += $param
326 | } elseif ($_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.group') {
327 | $colornumber= Get-Random -Maximum 9
328 | $param = [PSCustomObject]@{
329 | ItemImg = $null
330 | ImgVisible = "Collapsed"
331 | GridColor = $global:GroupColorSelection[$colornumber]
332 | GroupNameShort = ($($_.AdditionalProperties.displayName).Substring(0,2)).ToUpper()
333 | GridVisible = "Visible"
334 | ItemName = $_.AdditionalProperties.displayName
335 | ItemType = "Group"
336 | ItemId = $_.Id
337 | ItemDetails = $_.AdditionalProperties.securityIdentifier
338 | Id = $_.Id
339 | Uri = "https://graph.microsoft.com/v1.0/directoryObjects/" + $_.Id
340 | OperatinSystem = $null
341 | }
342 | $items += $param
343 | }
344 | }
345 | $global:AllGroupMember = @($items)
346 | }
347 | function Sync-AllDevicesInGroup{
348 | param (
349 | [Parameter(Mandatory = $true)]
350 | [String]$groupId
351 | )
352 |
353 | $groupMember = Get-MgGroupMember -GroupId $groupId -All | Foreach-Object {
354 | if ($_.AdditionalProperties["@odata.type"] -eq "#microsoft.graph.device"){
355 | $device = (Get-MgDevice -Filter "Id eq '$($_.Id)'")
356 | try {
357 | $intuneDeviceId = (Get-IntunemanagedDevice -Filter "azureADDeviceId eq '$($device.DeviceId)'").id
358 | if($intuneDeviceId) {
359 | Invoke-IntuneManagedDeviceSyncDevice -managedDeviceId $intuneDeviceId | Out-Null
360 | }
361 | }
362 | catch {
363 | Write-Error "Sync of devices $($device.DeviceId) did not work."
364 | }
365 | }
366 | }
367 | }
368 |
369 | function Add-InitGroupItemGridMember{
370 | param (
371 | [boolean]$loadNew = $true
372 | )
373 |
374 | if(($global:AllGroupMember).Count -eq 0 -or $loadNew) {
375 | Get-AllGroupMember -groupId $global:SelectedGroupId.GroupObjectId
376 | }
377 |
378 | $allGroupMembers = @()
379 | $allGroupMembers = $global:AllGroupMember
380 |
381 | $items += $allGroupMembers | Select-Object -First $([int]$($WPFComboboxGridCount.SelectedItem))
382 | $WPFListViewGroupsViewSelection.ItemsSource = @($items)
383 | }
384 |
385 | ############## Add ##############
386 | function Add-InitGroupItemAddGrid{
387 | $itemsToAdd = $null
388 |
389 | switch($WPFListViewGroupMenu.SelectedItem.Name){
390 | ItemGroupsMember {
391 | $itemsToAdd = $global:AllManagedItems | Where-Object `
392 | { -not ($_.Id -in $global:AllGroupMember.id) -and `
393 | -not ($_.Id -like $global:SelectedGroupId.GroupObjectId) -and `
394 | -not ($_.GroupTypes -eq 'Dynamic')}
395 | }
396 | ItemGroupsPolicies {
397 | $itemsToAdd = $global:AllPolicies | Where-Object `
398 | { -not ($_.Id -in $global:AllGroupPolicies.id)}
399 | }
400 | ItemGroupsCompliancePolicies {
401 | $itemsToAdd = $global:AllCompliancePolicies | Where-Object `
402 | { -not ($_.Id -in $global:AllGroupCompliancePolicies.id)}
403 | }
404 | ItemGroupsApps {
405 | $itemsToAdd = $global:AllApps | Where-Object `
406 | { -not ($_.Id -in $global:AllGroupApps.id)}
407 | }
408 | }
409 |
410 | $itemsToAdd = $itemsToAdd | Sort-Object -Property ItemName
411 | $global:AllGroupsItemAddCollection = $itemsToAdd
412 | $items += $itemsToAdd | Select-Object -First $([int]$($WPFComboboxGridCount.SelectedItem))
413 | $WPFListViewGroupsViewAdd.ItemsSource = @($items)
414 | }
415 | function Add-DirectoryItemToGroup {
416 | param(
417 | [Parameter(Mandatory = $true)]
418 | $groupId,
419 | [Parameter(Mandatory = $true)]
420 | $item
421 | )
422 |
423 | $params = @{
424 | "@odata.id" = "https://graph.microsoft.com/v1.0/directoryObjects/$item"
425 | }
426 | New-MgGroupMemberByRef -GroupId $groupId -BodyParameter $params
427 | }
428 |
429 | function Remove-DirectoryItemFromGroup{
430 | param(
431 | [Parameter(Mandatory = $true)]
432 | $groupId,
433 | [Parameter(Mandatory = $true)]
434 | $item
435 | )
436 | Invoke-MgGraphRequest -Method DELETE -Uri ("https://graph.microsoft.com/v1.0/groups/$groupId/members/$item/"+'$ref')
437 | }
438 |
439 | ########################################################################################
440 | ##################################### Policies #########################################
441 | ########################################################################################
442 | function Get-AllPolicies{
443 | $items = @()
444 | Get-MgDeviceManagementDeviceConfiguration -All | ForEach-Object{
445 |
446 | $param = [PSCustomObject]@{
447 | ItemImg = ("$global:Path\.tmp\policyImg.png")
448 | ImgVisible = "Visible"
449 | GridColor = $null
450 | GroupNameShort = $null
451 | GridVisible = "Collapsed"
452 | ItemName = $_.DisplayName
453 | ItemType = ($_.AdditionalProperties.'@odata.type').replace("#microsoft.graph.","")
454 | ItemId = $_.Id
455 | ItemDetails = $null
456 | ItemInfo = ($_.AdditionalProperties.'@odata.type').replace("#microsoft.graph.","")
457 | Id = $_.Id
458 | Uri = $null
459 | OperatinSystem = $null
460 | AssignmentId = $null
461 | }
462 | $items += $param
463 | }
464 |
465 | $global:AllPolicies = @($items)
466 | }
467 | function Get-AllGroupPolicies{
468 | param(
469 | [Parameter(Mandatory = $true)]
470 | $groupId
471 | )
472 | $global:AllGroupPolicies = @()
473 |
474 | Get-IntuneDeviceConfigurationPolicy -Expand assignments| Where-Object {$_.assignments -match $groupId} | ForEach-Object {
475 | $id = $_.id
476 | $assignment = $null
477 | $policyAssignment = $null
478 |
479 | $_.assignments | ForEach-Object {
480 | if($_.target.groupId -eq $groupId){
481 | if($_.target.'@odata.type' -eq "#microsoft.graph.exclusionGroupAssignmentTarget"){
482 | $assignment = "Exclude"
483 | }
484 | elseif ($_.target.'@odata.type' -eq "#microsoft.graph.groupAssignmentTarget"){
485 | $assignment = "Include"
486 | }
487 | $policyAssignment = ($global:AllPolicies | Where-Object {$_.Id -eq $id}) | ConvertTo-Json | ConvertFrom-Json
488 | $policyAssignment.ItemDetails = $assignment
489 | $policyAssignment.AssignmentId = $_.id
490 | $global:AllGroupPolicies += $policyAssignment
491 | }
492 | }
493 | }
494 | }
495 | function Add-InitGroupItemGridPolicies{
496 | param (
497 | [boolean]$loadNew = $true,
498 | [boolean]$init = $false,
499 | $groupId
500 | )
501 |
502 | if(($global:AllPolicies).Count -eq 0 -or $init) {
503 | Get-AllPolicies
504 | }
505 |
506 | if(($global:AllGroupPolicies).Count -eq 0 -or $loadNew) {
507 | Get-AllGroupPolicies -groupId $groupId
508 | }
509 |
510 | $groupPolicies = @()
511 | $groupPolicies = $global:AllGroupPolicies
512 |
513 | $items += $groupPolicies | Select-Object -First $([int]$($WPFComboboxGridCount.SelectedItem))
514 | $WPFListViewGroupsViewSelection.ItemsSource = @($items)
515 | }
516 |
517 | function Add-PolicyToGroup {
518 | param(
519 | [Parameter(Mandatory = $true)]
520 | $groupId,
521 | [Parameter(Mandatory = $true)]
522 | $policyId,
523 | [parameter(Mandatory=$true)]
524 | [string]$assignment
525 | )
526 |
527 | $policyObject = $null
528 | $policyObject = New-Object PSObject
529 | if($assignment -eq "Include"){$policyObject | Add-Member NoteProperty '@odata.type' '#microsoft.graph.groupAssignmentTarget'}
530 | else{$policyObject | Add-Member NoteProperty '@odata.type' '#microsoft.graph.exclusionGroupAssignmentTarget'}
531 | $policyObject | Add-Member NoteProperty 'groupId' $groupId
532 |
533 | # Check if all deovices or user assigned
534 | New-DeviceManagement_DeviceConfigurations_Assignments -deviceConfigurationId $policyId -target $policyObject
535 | }
536 |
537 |
538 | function Remove-PolicyFromGroup{
539 | param(
540 | [Parameter(Mandatory = $true)]
541 | $groupId,
542 | [Parameter(Mandatory = $true)]
543 | $policyId
544 | )
545 |
546 | Get-DeviceManagement_DeviceConfigurations_Assignments -deviceConfigurationId $policyId | Foreach-Object {
547 | if($_.target.groupId -eq $groupId) {Remove-DeviceManagement_DeviceConfigurations_Assignments -deviceConfigurationAssignmentId $_.id -deviceConfigurationId $policyId}
548 | }
549 | }
550 |
551 |
552 | ########################################################################################
553 | ############################### Compliance Policies ####################################
554 | ########################################################################################
555 | function Get-AllCompliancePolicies{
556 | $items = @()
557 | Get-MgDeviceManagementDeviceCompliancePolicy -All | ForEach-Object{
558 |
559 | $param = [PSCustomObject]@{
560 | ItemImg = ("$global:Path\.tmp\compPolicyImg.png")
561 | ImgVisible = "Visible"
562 | GridColor = $null
563 | GroupNameShort = $null
564 | GridVisible = "Collapsed"
565 | ItemName = $_.DisplayName
566 | ItemType = ($_.AdditionalProperties.'@odata.type').replace("#microsoft.graph.","")
567 | ItemId = $_.Id
568 | ItemDetails = $null
569 | ItemInfo = ($_.AdditionalProperties.'@odata.type').replace("#microsoft.graph.","")
570 | Id = $_.Id
571 | Uri = $null
572 | OperatinSystem = $null
573 | AssignmentId = $null
574 | }
575 | $items += $param
576 | }
577 |
578 | $global:AllCompliancePolicies = @($items)
579 | }
580 | function Get-AllGroupCompliancePolicies{
581 | param(
582 | [Parameter(Mandatory = $true)]
583 | $groupId
584 | )
585 | $global:AllGroupCompliancePolicies = @()
586 |
587 | Get-IntuneDeviceCompliancePolicy -Expand assignments| Where-Object {$_.assignments -match $groupId} | ForEach-Object {
588 | $id = $_.id
589 | $assignment = $null
590 | $compPolicyAssignment = $null
591 |
592 | $_.assignments | ForEach-Object {
593 | if($_.target.groupId -eq $groupId){
594 | if($_.target.'@odata.type' -eq "#microsoft.graph.exclusionGroupAssignmentTarget"){
595 | $assignment = "Exclude"
596 | }
597 | elseif ($_.target.'@odata.type' -eq "#microsoft.graph.groupAssignmentTarget"){
598 | $assignment = "Include"
599 | }
600 | $compPolicyAssignment = ($global:AllCompliancePolicies | Where-Object {$_.Id -eq $id}) | ConvertTo-Json | ConvertFrom-Json
601 | $compPolicyAssignment.ItemDetails = $assignment
602 | $compPolicyAssignment.AssignmentId = $_.id
603 | $global:AllGroupCompliancePolicies += $compPolicyAssignment
604 | }
605 | }
606 | }
607 | }
608 | function Add-InitGroupItemGridCompliancePolicies{
609 | param (
610 | [boolean]$loadNew = $true,
611 | [boolean]$init = $false,
612 | $groupId
613 | )
614 |
615 | if(($global:AllCompliancePolicies).Count -eq 0 -or $init) {
616 | Get-AllCompliancePolicies
617 | }
618 |
619 | if(($global:AllGroupCompliancePolicies).Count -eq 0 -or $loadNew) {
620 | Get-AllGroupCompliancePolicies -groupId $groupId
621 | }
622 |
623 | $groupCompPolicies = @()
624 | $groupCompPolicies = $global:AllGroupCompliancePolicies
625 |
626 | $items += $groupCompPolicies | Select-Object -First $([int]$($WPFComboboxGridCount.SelectedItem))
627 | $WPFListViewGroupsViewSelection.ItemsSource = @($items)
628 | }
629 |
630 | function Add-CompliancePolicyToGroup {
631 | param(
632 | [Parameter(Mandatory = $true)]
633 | $groupId,
634 | [Parameter(Mandatory = $true)]
635 | $policyId,
636 | [parameter(Mandatory=$true)]
637 | [string]$assignment
638 | )
639 |
640 | $compPolicyObject = $null
641 | $compPolicyObject = New-Object PSObject
642 | if($assignment -eq "Include"){$compPolicyObject | Add-Member NoteProperty '@odata.type' '#microsoft.graph.groupAssignmentTarget'}
643 | else{$compPolicyObject | Add-Member NoteProperty '@odata.type' '#microsoft.graph.exclusionGroupAssignmentTarget'}
644 | $compPolicyObject | Add-Member NoteProperty 'groupId' $groupId
645 |
646 | # Check if all deovices or user assigned
647 | New-DeviceManagement_DeviceCompliancePolicies_Assignments -deviceCompliancePolicyId $policyId -target $compPolicyObject
648 | }
649 |
650 |
651 | function Remove-CompliancePolicyFromGroup{
652 | param(
653 | [Parameter(Mandatory = $true)]
654 | $groupId,
655 | [Parameter(Mandatory = $true)]
656 | $policyId
657 | )
658 |
659 | Get-DeviceManagement_DeviceCompliancePolicies_Assignments -deviceCompliancePolicyId $policyId | Foreach-Object {
660 | if($_.target.groupId -eq $groupId) {Remove-DeviceManagement_DeviceCompliancePolicies_Assignments -deviceCompliancePolicyAssignmentId $_.id -deviceCompliancePolicyId $policyId}
661 | }
662 | }
663 |
664 | ########################################################################################
665 | ####################################### Apps ###########################################
666 | ########################################################################################
667 | function Get-AllApps{
668 | $exclude = "#microsoft.graph.managedAndroidStoreApp", "#microsoft.graph.managedIOSStoreApp"
669 | $items = @()
670 | Get-MgDeviceAppMgtMobileApp -All | Where-Object {-not ($_.AdditionalProperties.'@odata.type' -in $exclude)} | ForEach-Object{
671 | $param = [PSCustomObject]@{
672 | ItemImg = ("$global:Path\.tmp\appImg.png")
673 | ImgVisible = "Visible"
674 | GridColor = $null
675 | GroupNameShort = $null
676 | GridVisible = "Collapsed"
677 | ItemName = $_.DisplayName
678 | ItemType = ($_.AdditionalProperties.'@odata.type').replace("#microsoft.graph.","")
679 | ItemId = $_.Id
680 | ItemDetails = $null
681 | ItemInfo = ($_.AdditionalProperties.'@odata.type').replace("#microsoft.graph.","")
682 | Id = $_.Id
683 | Uri = $null
684 | OperatinSystem = $null
685 | AssignmentId = $null
686 | }
687 | $items += $param
688 | }
689 | $global:AllApps = @($items)
690 | }
691 |
692 | function Add-InitGroupItemGridApps{
693 | param (
694 | [boolean]$loadNew = $true,
695 | [boolean]$init = $false,
696 | $groupId
697 | )
698 |
699 | if(($global:AllApps).Count -eq 0 -or $init) {
700 | Get-AllApps
701 | }
702 |
703 | if(($global:AllGroupApps).Count -eq 0 -or $loadNew) {
704 | Get-AllGroupApps -groupId $groupId
705 | }
706 |
707 | $groupApps = @()
708 | $groupApps = $global:AllGroupApps
709 | $items += $groupApps | Select-Object -First $([int]$($WPFComboboxGridCount.SelectedItem))
710 | $WPFListViewGroupsViewSelection.ItemsSource = @($items)
711 | }
712 |
713 | function Get-AllGroupApps{
714 | param(
715 | [Parameter(Mandatory = $true)]
716 | $groupId
717 | )
718 | $global:AllGroupApps = @()
719 | Get-IntuneMobileApp -Expand assignments | Where-Object {$_.assignments -match $groupId} | ForEach-Object {
720 | $id = $_.id
721 | $assignment = $null
722 | $appAssignment = $null
723 | $_.assignments | ForEach-Object {
724 | if($_.target.groupId -eq $groupId){
725 | if($_.intent -eq "required" -and $_.target.'@odata.type' -eq "#microsoft.graph.exclusionGroupAssignmentTarget"){
726 | $assignment = "Exclude (required)"
727 | }
728 | elseif ($_.intent -eq "available" -and $_.target.'@odata.type' -eq "#microsoft.graph.exclusionGroupAssignmentTarget"){
729 | $assignment = "Exclude (available)"
730 | }
731 | elseif ($_.intent -eq "uninstall" -and $_.target.'@odata.type' -eq "#microsoft.graph.exclusionGroupAssignmentTarget" ){
732 | $assignment = "Exclude (uninstall)"
733 | }
734 | elseif ($_.intent -eq "required" -and $_.target.'@odata.type' -eq "#microsoft.graph.groupAssignmentTarget"){
735 | $assignment = "Include (required)"
736 | }
737 | elseif ($_.intent -eq "available" -and $_.target.'@odata.type' -eq "#microsoft.graph.groupAssignmentTarget"){
738 | $assignment = "Include (available)"
739 | }
740 | elseif ($_.intent -eq "uninstall" -and $_.target.'@odata.type' -eq "#microsoft.graph.groupAssignmentTarget" ){
741 | $assignment = "Include (uninstall)"
742 | }
743 |
744 |
745 | $appAssignment = ($global:AllApps | Where-Object {$_.Id -eq $id}) | ConvertTo-Json | ConvertFrom-Json
746 | $appAssignment.ItemDetails = $assignment
747 | $appAssignment.AssignmentId = $_.id
748 | $global:AllGroupApps += $appAssignment
749 | }
750 | }
751 | }
752 | }
753 | function Add-AppToGroup {
754 | param(
755 | [Parameter(Mandatory = $true)]
756 | $groupId,
757 | [Parameter(Mandatory = $true)]
758 | $appId,
759 | [parameter(Mandatory=$true)]
760 | [string]$assignment,
761 | [parameter(Mandatory=$true)]
762 | [string]$intent
763 | )
764 |
765 | $appObject = $null
766 | $appObject = New-Object PSObject
767 | if($assignment -eq "Include"){$appObject | Add-Member NoteProperty '@odata.type' '#microsoft.graph.groupAssignmentTarget'}
768 | else{$appObject | Add-Member NoteProperty '@odata.type' '#microsoft.graph.exclusionGroupAssignmentTarget'}
769 | $appObject | Add-Member NoteProperty 'groupId' $groupId
770 |
771 | # Check if all deovices or user assigned
772 |
773 | New-IntuneMobileAppAssignment -mobileAppId $appId -intent $intent -target $appObject
774 | }
775 |
776 | function Remove-AppFromGroup{
777 | param(
778 | [Parameter(Mandatory = $true)]
779 | $assignmentId,
780 | [Parameter(Mandatory = $true)]
781 | $appId
782 | )
783 |
784 | Remove-IntuneMobileAppAssignment -mobileAppAssignmentId $assignmentId -mobileAppId $appId
785 | }
--------------------------------------------------------------------------------
/xaml/ui.xaml:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | Get more information about intune tool box in my
52 | blog post
53 | or via the
54 | readme on git.
55 |
56 |
57 |
58 |
64 |
70 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
97 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
254 |
255 |
256 |
257 |
258 |
264 |
265 |
266 |
267 |
268 |
273 |
274 |
275 |
276 |
277 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
378 |
379 |
380 |
381 |
382 |
388 |
389 |
390 |
391 |
392 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 |
534 |
535 |
536 |
537 |
538 |
539 |
540 |
541 |
542 |
543 |
544 |
545 |
546 |
547 |
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
558 |
559 |
560 |
561 |
562 |
563 |
564 |
565 |
566 |
567 |
568 |
569 |
570 |
571 |
572 |
573 |
574 |
575 |
576 |
577 |
578 |
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
587 |
588 |
589 |
590 |
591 |
592 |
593 |
594 |
595 |
596 |
597 |
598 |
599 |
600 |
601 |
602 |
603 |
604 |
605 |
606 |
607 |
608 |
609 |
610 |
611 |
612 |
613 |
614 |
615 |
616 |
617 |
618 |
619 |
620 |
626 |
627 |
628 |
631 |
632 |
633 |
634 |
635 |
640 |
641 |
642 |
643 |
644 |
645 |
646 |
647 |
--------------------------------------------------------------------------------
/modules/uiHandler.psm1:
--------------------------------------------------------------------------------
1 | <#
2 | .SYNOPSIS
3 | Hadeling UI
4 | .DESCRIPTION
5 | Handling of the WPF UI
6 | .NOTES
7 | Author: Jannik Reinhard
8 | #>
9 |
10 | ########################################################################################
11 | ###################################### UI Actions ######################################
12 | ########################################################################################
13 | function Set-UiActionButton{
14 | #Home
15 | Add-XamlEvent -object $WPFButtonHome -event "Add_Click" -scriptBlock {
16 | Hide-All
17 | $WPFListViewMenu.SelectedIndex = 0
18 | $WPFGridHomeFrame.Visibility = 'Visible'
19 | }
20 |
21 | # Start Page
22 | Add-XamlEvent -object $WPFButtonLogIn -event "Add_Click" -scriptBlock {Set-LoginOrLogout}
23 |
24 | # Header
25 | Add-XamlEvent -object $WPFButtonAbout -event "Add_Click" -scriptBlock {
26 | if($WPFGridAbout.Visibility -eq "Visible"){
27 | Hide-All
28 | $WPFListViewMenu.SelectedIndex = 0
29 | $WPFGridHomeFrame.Visibility = 'Visible'
30 | Get-MainFrame
31 | }else{
32 | Hide-All
33 | $WPFListViewMenu.SelectedIndex = -1
34 | $WPFGridAbout.Visibility="Visible"
35 | }
36 | }
37 |
38 | # About
39 | Add-XamlEvent -object $WPFButtonAboutWordpress -event "Add_Click" -scriptBlock {Start-Process "https://www.jannikreinhard.com"}
40 | Add-XamlEvent -object $WPFButtonAboutTwitter -event "Add_Click" -scriptBlock {Start-Process "https://twitter.com/jannik_reinhard"}
41 | Add-XamlEvent -object $WPFButtonAboutLinkedIn -event "Add_Click" -scriptBlock {Start-Process "https://www.linkedin.com/in/jannik-r/"}
42 |
43 | # Side menue
44 | Add-XamlEvent -object $WPFButtonOpenSideMenu -event "Add_Click" -scriptBlock {
45 | $WPFButtonCloseSideMenu.Visibility = "Visible"
46 | $WPFButtonOpenSideMenu.Visibility = "Collapsed"
47 | $WPFGridContentFrame.ColumnDefinitions[0].Width = 150
48 | }
49 |
50 | Add-XamlEvent -object $WPFButtonCloseSideMenu -event "Add_Click" -scriptBlock {
51 | $WPFButtonCloseSideMenu.Visibility = "Collapsed"
52 | $WPFButtonOpenSideMenu.Visibility = "Visible"
53 | $WPFGridContentFrame.ColumnDefinitions[0].Width = 60
54 | }
55 |
56 | ## Groups
57 | Add-XamlEvent -object $WPFCbGroupSyncAllDevices -event "Add_Click" -scriptBlock {
58 | $global:SelectedGroupId = $WPFListViewAllGroups.SelectedItem
59 | Sync-AllDevicesInGroup -groupId $($global:SelectedGroupId).GroupObjectId
60 | }
61 |
62 | Add-XamlEvent -object $WPFCbGroupOpen -event "Add_Click" -scriptBlock {
63 | $global:SelectedGroupId = $WPFListViewAllGroups.SelectedItem
64 | Open-GroupView -groupId $global:SelectedGroupId.GroupObjectId | Out-Null
65 | }
66 |
67 | Add-XamlEvent -object $WPFButtonRefreshGroupOverview -event "Add_Click" -scriptBlock {
68 | $WPFTextboxSearchBoxGroup.Text = ""
69 | Add-InitGroupsGrid
70 | }
71 |
72 | Add-XamlEvent -object $WPFButtonNavigationGroupsBack -event "Add_Click" -scriptBlock {
73 | Hide-All
74 | $WPFGridGroupManagement.Visibility = 'Visible'
75 | $WPFTextboxSearchBoxGroup.Text = ""
76 | Add-InitGroupsGrid
77 | }
78 |
79 | Add-XamlEvent -object $WPFButtonNavigationGroupsBack2 -event "Add_Click" -scriptBlock {
80 | Hide-All
81 | $WPFGridGroupManagement.Visibility = 'Visible'
82 | $WPFTextboxSearchBoxGroup.Text = ""
83 | Add-InitGroupsGrid
84 | }
85 |
86 | # Group Creation
87 | Add-XamlEvent -object $WPFButtonCreateNewGroup -event "Add_Click" -scriptBlock {
88 | $WPFLabelGroupCreationAction.Content = "New Group"
89 | $global:GroupCreationMode = "new"
90 | Get-GroupCreationView -groupCreationType $global:GroupCreationMode
91 | }
92 |
93 | Add-XamlEvent -object $WPFButtonMigrateGroup -event "Add_Click" -scriptBlock {
94 | $WPFLabelGroupCreationAction.Content = "Migrate Group"
95 | $global:GroupCreationMode = "migrate"
96 | Get-GroupCreationView -groupCreationType $global:GroupCreationMode
97 | }
98 |
99 | Add-XamlEvent -object $WPFButtonCopyGroup -event "Add_Click" -scriptBlock {
100 | $WPFLabelGroupCreationAction.Content = "Copy Group"
101 | $global:GroupCreationMode = "copy"
102 | Get-GroupCreationView -groupCreationType $global:GroupCreationMode
103 | }
104 |
105 | Add-XamlEvent -object $WPFButtonGroupCreate -event "Add_Click" -scriptBlock {
106 | switch ($global:GroupCreationMode) {
107 | new {
108 | Add-MgtGroup -groupName $WPFTextboxGroupName.Text -groupDescription $WPFTextboxGroupDescription.Text
109 | }
110 | copy {
111 | Add-MgtGroup -groupName $WPFTextboxGroupName.Text -groupDescription $WPFTextboxGroupDescription.Text -groupMember $global:AllGroupMember
112 | }
113 | migrate {
114 | $groupMember = Get-MigrateGroupMember -groupMember $global:AllGroupMember -migrationType $WPFComboboxMigrationType.SelectedIndex -windows $WPFCbWindows.IsChecked -ios $WPFCbIOS.IsChecked -macos $WPFCbMacOs.IsChecked -android $WPFCbAndroid.IsChecked
115 | Add-MgtGroup -groupName $WPFTextboxGroupName.Text -groupDescription $WPFTextboxGroupDescription.Text -groupMember $groupMember
116 | }
117 | }
118 | Hide-All
119 | $WPFGridGroupManagement.Visibility = 'Visible'
120 | $WPFTextboxSearchBoxGroup.Text = ""
121 | Add-InitGroupsGrid
122 | }
123 |
124 | # Group Overview
125 | Add-XamlEvent -object $WPFButtonDeleteGroup -event "Add_Click" -scriptBlock {
126 | Show-MessageBoxInWindow -text "Are you shure that you want to delete the group?" -button1text "Yes" -button2text "No"
127 | $global:message.Add_ButtonClicked({
128 | $buttonArgs = [SimpleDialogs.Controls.DialogButtonClickedEventArgs]$args[1]
129 | $buttonValues = $buttonArgs.Button
130 | If($buttonValues -eq "FirstButton")
131 | {
132 | Hide-All
133 | $WPFGridGroupManagement.Visibility = 'Visible'
134 | Remove-MgGroup -GroupId $($global:SelectedGroupId).GroupObjectId
135 | $WPFTextboxSearchBoxGroup.Text = ""
136 | Add-InitGroupsGrid
137 | }
138 | })
139 | }
140 |
141 | # Group Member Overview
142 | Add-XamlEvent -object $WPFButtonSyncAllDevices -event "Add_Click" -scriptBlock {
143 | Sync-AllDevicesInGroup -groupId $($global:SelectedGroupId).GroupObjectId
144 | }
145 |
146 | # Group Object
147 | Add-XamlEvent -object $WPFButtonRemoveGroupMember -event "Add_Click" -scriptBlock {
148 | Show-MessageBoxInWindow -text "Are you shure that you want to delete the group assignment?" -button1text "Yes" -button2text "No"
149 | $global:message.Add_ButtonClicked({
150 | Remove-ObjectFromGroup
151 | })
152 | }
153 |
154 | Add-XamlEvent -object $WPFButtonAddGroupMember -event "Add_Click" -scriptBlock {
155 | Add-InitGroupItemAddGrid
156 | $WPFBorderAddItem.Visibility="Visible"
157 | $WPFListViewGroupsViewAdd.SelectedIndex = -1
158 | }
159 |
160 | Add-XamlEvent -object $WPFButtonAddToGroup -event "Add_Click" -scriptBlock {
161 | Add-ObjectToGroup
162 | }
163 |
164 | Add-XamlEvent -object $WPFButtonRefreshGroupMember -event "Add_Click" -scriptBlock {
165 | Get-GroupViewRefreshed
166 | }
167 |
168 | Add-XamlEvent -object $WPFButtonAddToGroupClose -event "Add_Click" -scriptBlock {
169 | $WPFBorderAddItem.Visibility="Collapsed"
170 | }
171 | }
172 | function Set-UiAction{
173 |
174 | Add-XamlEvent -object $WPFListViewMenu -event "Add_SelectionChanged" -scriptBlock {
175 | if(-not $global:auth) {return}
176 | if($WPFListViewMenu.SelectedIndex -eq -1) {return}
177 | Get-NavigationMainPageChange -selectedItem $WPFListViewMenu.SelectedItem.Name
178 | }
179 |
180 | Add-XamlEvent -object $WPFTextboxSearchBoxGroup -event "Add_TextChanged" -scriptBlock {
181 | Search-Group -searchString $($WPFTextboxSearchBoxGroup.Text)
182 | }
183 |
184 | Add-XamlEvent -object $WPFComboboxGridCount -event "Add_SelectionChanged" -scriptBlock {
185 | Add-InitGroupsGrid -clearGroupList $false
186 | $WPFTextboxSearchBoxGroup.Text = ""
187 | }
188 |
189 | Add-XamlEvent -object $WPFListViewAllGroups -event "Add_MouseDoubleClick" -scriptBlock {
190 | $global:SelectedGroupId = $WPFListViewAllGroups.SelectedItem
191 | Open-GroupView -groupId $global:SelectedGroupId.GroupObjectId | Out-Null
192 | }
193 |
194 | Add-XamlEvent -object $WPFTextboxGroupName -event "Add_TextChanged" -scriptBlock {
195 | if($WPFTextboxGroupName.Text -eq ""){$WPFButtonGroupCreate.IsEnabled = $false}else {$WPFButtonGroupCreate.IsEnabled = $true}
196 | }
197 |
198 | Add-XamlEvent -object $WPFListViewGroupMenu -event "Add_SelectionChanged" -scriptBlock {
199 | Get-NavigationGroupViewPageChange
200 | }
201 |
202 | Add-XamlEvent -object $WPFListViewGroupsViewSelection -event "Add_SelectionChanged" -scriptBlock {
203 | if($WPFListViewGroupsViewSelection.SelectedIndex -eq -1) {$WPFButtonRemoveGroupMember.IsEnabled = $false}
204 | else {$WPFButtonRemoveGroupMember.IsEnabled = $true}
205 | }
206 |
207 | Add-XamlEvent -object $WPFTextboxSearchGroupView -event "Add_TextChanged" -scriptBlock {
208 | if($WPFListViewGroupMenu.SelectedItem.Name -eq "ItemGroupsMember"){
209 | Search-InItemListItem -searchString $WPFTextboxSearchGroupView.Text
210 | }
211 | }
212 |
213 | Add-XamlEvent -object $WPFTextboxSearchAddToGroup -event "Add_TextChanged" -scriptBlock {
214 | Search-InItemAddList -searchString $WPFTextboxSearchAddToGroup.Text
215 | }
216 |
217 | Add-XamlEvent -object $WPFComboboxMigrationType -event "Add_SelectionChanged" -scriptBlock {
218 | if($WPFComboboxMigrationType.SelectedIndex -eq 0){
219 | ($WPFStackPanelOsFilter.Visibility = "Collapsed")
220 | }
221 | elseif($WPFComboboxMigrationType.SelectedIndex -eq 1){
222 | $WPFCbWindows.IsChecked = $false
223 | $WPFCbIOS.IsChecked = $false
224 | $WPFCbMacOs.IsChecked = $false
225 | $WPFCbAndroid.IsChecked = $false
226 | ($WPFStackPanelOsFilter.Visibility = "Visible")
227 | }
228 | }
229 |
230 | Add-XamlEvent -object $WPFListViewGroupsViewAdd -event "Add_SelectionChanged" -scriptBlock {
231 | if($WPFListViewGroupsViewAdd.SelectedIndex -eq -1) {$WPFButtonAddToGroup.IsEnabled = $false}
232 | else {$WPFButtonAddToGroup.IsEnabled = $true}
233 | }
234 |
235 | Add-XamlEvent -object $WPFListViewGroupsViewSelection -event "Add_MouseDoubleClick" -scriptBlock {
236 | if($WPFListViewGroupsViewSelection.SelectedItem.ItemType -eq 'Group' -and $WPFListViewGroupMenu.SelectedItem.Name -eq 'ItemGroupsMember'){
237 | $global:SelectedGroupId = ($global:AllGroupsCollection | Where-Object {$_.GroupObjectId -eq $WPFListViewGroupsViewSelection.SelectedItem.Id})[0]
238 | Open-GroupView -groupId $global:SelectedGroupId.GroupObjectId | Out-Null
239 | }
240 | }
241 |
242 | Add-XamlEvent -object $WPFListViewGroupsViewAdd -event "Add_MouseDoubleClick" -scriptBlock {
243 | Add-InitGroupItemAddGrid
244 | $WPFBorderAddItem.Visibility="Visible"
245 | $WPFListViewGroupsViewAdd.SelectedIndex = -1
246 | }
247 |
248 |
249 | }
250 |
251 | ########################################################################################
252 | ###################################### Navigation ######################################
253 | ########################################################################################
254 | function Get-NavigationMainPageChange{
255 | param(
256 | [Parameter(Mandatory = $true)]
257 | $selectedItem
258 | )
259 | Hide-GroupViewAll
260 | switch($selectedItem){
261 | ItemHome {
262 | Hide-All
263 | $WPFGridHomeFrame.Visibility = 'Visible'
264 | Get-MainFrame
265 | }
266 | ItemGroupManagement {
267 | Hide-All
268 | $WPFGridGroupManagement.Visibility = 'Visible'
269 | Add-InitGroupsGrid
270 | }
271 | }
272 | }
273 |
274 | function Get-NavigationGroupViewPageChange{
275 | Hide-GroupViewAll
276 | switch($WPFListViewGroupMenu.SelectedItem.Name){
277 | ItemGroupsOverview {
278 | $WPFGridGroupViewOverview.Visibility="Visible"
279 | }
280 | ItemGroupsMember {
281 | Add-InitGroupItemGridMember -loadNew $false
282 | $WPFGridGroupListView.Visibility="Visible"
283 | $WPFStackSyncAllDevices.Visibility="Visible"
284 | if($global:SelectedGroupId.GroupMembershipType -eq 'Dynamic'){
285 | $WPFButtonRemoveGroupMember.IsEnabled=$false
286 | $WPFButtonAddGroupMember.IsEnabled=$false
287 | }
288 | else{
289 | $WPFButtonRemoveGroupMember.IsEnabled=$true
290 | $WPFButtonAddGroupMember.IsEnabled=$true
291 | }
292 | $WPFComboboxAssignmentTypeApp.Visibility="Collapsed"
293 | }
294 | ItemGroupsPolicies {
295 | Add-InitGroupItemGridPolicies -init $false -loadNew $true -groupId $global:SelectedGroupId.GroupObjectId
296 | $WPFGridGroupListView.Visibility="Visible"
297 | $WPFStackSyncAllDevices.Visibility="Collapsed"
298 | $WPFButtonRemoveGroupMember.IsEnabled=$true
299 | $WPFButtonAddGroupMember.IsEnabled=$true
300 | $WPFComboboxAssignmentType.Visibility="Visible"
301 | $WPFComboboxAssignmentType.SelectedIndex = 0
302 | $WPFComboboxAssignmentTypeApp.Visibility="Collapsed"
303 | }
304 | ItemGroupsCompliancePolicies {
305 | Add-InitGroupItemGridCompliancePolicies -init $false -loadNew $true -groupId $global:SelectedGroupId.GroupObjectId
306 | $WPFGridGroupListView.Visibility="Visible"
307 | $WPFStackSyncAllDevices.Visibility="Collapsed"
308 | $WPFButtonRemoveGroupMember.IsEnabled=$true
309 | $WPFButtonAddGroupMember.IsEnabled=$true
310 | $WPFComboboxAssignmentType.Visibility="Visible"
311 | $WPFComboboxAssignmentType.SelectedIndex = 0
312 | $WPFComboboxAssignmentTypeApp.Visibility="Collapsed"
313 | }
314 | ItemGroupsApps {
315 | Add-InitGroupItemGridApps -loadNew $true -init $false -groupId $global:SelectedGroupId.GroupObjectId
316 | $WPFGridGroupListView.Visibility="Visible"
317 | $WPFStackSyncAllDevices.Visibility="Collapsed"
318 | $WPFButtonRemoveGroupMember.IsEnabled=$true
319 | $WPFButtonAddGroupMember.IsEnabled=$true
320 | $WPFComboboxAssignmentType.Visibility="Visible"
321 | $WPFComboboxAssignmentType.SelectedIndex = 0
322 | $WPFComboboxAssignmentTypeApp.Visibility="Visible"
323 | $WPFComboboxAssignmentTypeApp.SelectedIndex = 0
324 | }
325 | }
326 | }
327 |
328 |
329 | ########################################################################################
330 | ###################################### UI Actions ######################################
331 | ########################################################################################
332 | function Hide-All{
333 | $WPFGridHomeFrame.Visibility = 'Hidden'
334 | $WPFGridGroupManagement.Visibility = 'Hidden'
335 | $WPFGridGroupView.Visibility = 'Hidden'
336 | $WPFGridGroupCreation.Visibility = 'Hidden'
337 | $WPFGridGroupViewOverview.Visibility="Hidden"
338 | $WPFGridAbout.Visibility="Hidden"
339 | }
340 |
341 | function Hide-GroupViewAll{
342 | $WPFGridGroupViewOverview.Visibility="Hidden"
343 | $WPFGridGroupListView.Visibility="Hidden"
344 | $WPFBorderAddItem.Visibility="Collapsed"
345 | $WPFTextboxSearchGroupView.Text = ""
346 | $WPFTextboxSearchAddToGroup.Text = ""
347 | $WPFComboboxAssignmentType.Visibility="Collapsed"
348 | }
349 |
350 | function Get-GroupViewRefreshed {
351 | $WPFTextboxSearchAddToGroup.Text = ""
352 | $WPFListViewGroupsViewSelection.SelectedIndex = -1
353 | switch($WPFListViewGroupMenu.SelectedItem.Name){
354 | ItemGroupsMember {
355 | Get-AllManagedItems
356 | Add-InitGroupItemGridMember -loadNew $true
357 | }
358 | ItemGroupsPolicies {
359 | Add-InitGroupItemGridPolicies -loadNew $true -init $true -groupId $global:SelectedGroupId.GroupObjectId
360 | }
361 | ItemGroupsCompliancePolicies {
362 | Add-InitGroupItemGridCompliancePolicies -loadNew $true -init $true -groupId $global:SelectedGroupId.GroupObjectId
363 | }
364 | ItemGroupsApps {
365 | Add-InitGroupItemGridApps -loadNew $true -init $true -groupId $global:SelectedGroupId.GroupObjectId
366 | }
367 | }
368 | }
369 |
370 | function Add-ObjectToGroup{
371 | switch($WPFListViewGroupMenu.SelectedItem.Name){
372 | ItemGroupsMember {
373 | Add-DirectoryItemToGroup -groupId $global:SelectedGroupId.GroupObjectId -item $($WPFListViewGroupsViewAdd.SelectedItem.Id)
374 | }
375 | ItemGroupsPolicies {
376 | Add-PolicyToGroup -policyId $($WPFListViewGroupsViewAdd.SelectedItem.Id) -groupId $global:SelectedGroupId.GroupObjectId -assignment $WPFComboboxAssignmentType.Text
377 | }
378 | ItemGroupsCompliancePolicies {
379 | Add-CompliancePolicyToGroup -policyId $($WPFListViewGroupsViewAdd.SelectedItem.Id) -groupId $global:SelectedGroupId.GroupObjectId -assignment $WPFComboboxAssignmentType.Text
380 | }
381 | ItemGroupsApps {
382 | Add-AppToGroup -appId $WPFListViewGroupsViewAdd.SelectedItem.Id -groupId $global:SelectedGroupId.GroupObjectId -assignment $WPFComboboxAssignmentType.Text -intent $WPFComboboxAssignmentTypeApp.SelectedItem
383 | }
384 | }
385 | $WPFBorderAddItem.Visibility="Collapsed"
386 | Get-GroupViewRefreshed
387 | }
388 | function Remove-ObjectFromGroup{
389 | switch($WPFListViewGroupMenu.SelectedItem.Name){
390 | ItemGroupsMember {
391 | Remove-DirectoryItemFromGroup -groupId $($global:SelectedGroupId.GroupObjectId) -item $($WPFListViewGroupsViewSelection.SelectedItem.Id)
392 | }
393 | ItemGroupsPolicies {
394 | Remove-PolicyFromGroup -groupId $($global:SelectedGroupId.GroupObjectId) -policyId $($WPFListViewGroupsViewSelection.SelectedItem.Id)
395 | }
396 | ItemGroupsCompliancePolicies {
397 | Remove-CompliancePolicyFromGroup -groupId $($global:SelectedGroupId.GroupObjectId) -policyId $($WPFListViewGroupsViewSelection.SelectedItem.Id)
398 | }
399 | ItemGroupsApps {
400 | Remove-AppFromGroup -assignmentId $($WPFListViewGroupsViewSelection.SelectedItem.AssignmentId) -appId $($WPFListViewGroupsViewSelection.SelectedItem.Id)
401 | }
402 | }
403 | Get-GroupViewRefreshed
404 | }
405 |
406 |
407 |
408 | function Get-GroupCreationView{
409 | param(
410 | [Parameter(Mandatory = $true)]
411 | $groupCreationType
412 | )
413 | Hide-All
414 | $WPFGridGroupCreation.Visibility = 'Visible'
415 | $WPFStackPanelGroupType.Visibility = 'Visible'
416 | $WPFStackPanelGroupName.Visibility = 'Visible'
417 | $WPFStackPanelGroupDescription.Visibility = 'Visible'
418 | $WPFStackPanelOsFilter.Visibility = 'Collapsed'
419 |
420 |
421 | $WPFCbWindows.IsChecked= $false
422 | $WPFCbMacOs.IsChecked= $false
423 | $WPFCbAndroid.IsChecked= $false
424 | $WPFCbIOS.IsChecked= $false
425 |
426 | $WPFComboboxMigrationType.SelectedIndex = 0
427 | $WPFComboboxGroupType.SelectedIndex = 0
428 | $WPFTextboxGroupName.Text = ""
429 | $WPFTextboxGroupDescription.Text = ""
430 | $WPFLabelGroupCreationGroupName.Content = ""
431 | if($groupCreationType -eq 'migrate'){
432 | $WPFStackPanelGroupMigrationType.Visibility = 'Visible'
433 | $WPFLabelGroupCreationGroupName.Content = $global:SelectedGroupId.GroupName
434 | }else{
435 | $WPFStackPanelGroupMigrationType.Visibility = 'Collapsed'
436 | }
437 | if($groupCreationType -eq 'migrate' -or $groupCreationType -eq 'copy'){
438 | $WPFLabelGroupCreationGroupName.Content = $global:SelectedGroupId.GroupName
439 | }
440 | }
441 |
442 | function Set-UserInterface {
443 | #Load images for UI
444 | $iconButtonOpenMenu = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACwElEQVRIie2TXW8UZRiGr+ft7FCLiXgi8i0KMbSmm+7OduqGEJa2iqQhRI85JnDgL/An+BM8kHMTUUiwAbotkLrZmZ1hCzXKkhBFPvRAsym0bndmHg7cElN2t1uPuQ+fzFzXe79vHniVDSLrB0EQ7FTVr+I4PjM6Ovpgbe553gjwhYicdhxnuVeBWT9IkuRLVf3EGDMbBME+AFU1InJeRD4FLvm+P/C/BcBZoAS8myTJdd/33xORpK+v7zPgIVAAflhcXHy9F8FLVwTg+/4bqnpZRD4EHojIsWw2ey8Mw4NxHM8CO1X1um3bJ9Lp9LPNNsBxnLpt25PALLBHVYuVSuXAyMhILY7jAvBIRI40m81v5+fnX9u0ACCdTj9LpVJTQBHYrao3giAYdF337poEmLRt+7tuko6CNQkwparXgLeTJJkpl8tDruveVdVj/5Fc6CTpKgBwHGdZRE6KyFVguzFmxvO8D3K53C8tyWPgI9u2LxSLxf71/7d95Hap1Wpb6vX6N8AU8Ccw4TjObc/z3heRIrADmF5aWjpVKBT+6bnBWur1eh+w5cXJRATAsqyk24F7auD7/oCqfi8i48AfqjqRy+XuVCqVA6o6C+wSkauNRuNkPp9f2ZSgWq1ubTabF/l3wZ4YY8YzmcxPvu/vBeaAd4CbqVTqeLud6CrotHDlcnmPMWYO2C8i8/39/R8PDQ09bcfo+AZhGG4Dplvw34BCNpu9VyqVdhtjisB+Vf1xZWXleCd4xwZhGG6L43gaGAV+jeO44Lru/VKptN2yrCJwCAhs254YHh7+u9stvNRgYWHhzSiKrrTgtSiKDruue79arb5lWdZMC35rdXV1ciN4W0Gj0TgvIg7wszHm6NjY2O8AURR9DQy24OP5fP6vjeBtBZZlfS4il6MoOprJZB69+NCYc6p6EZjsFf4qPeU5CTIuzFdHs9MAAAAASUVORK5CYII="
445 | $iconButtonCloseMenu = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACpklEQVRIie2VTWtUSRSGn1M39IcDZjOgBEz8AD+mISHXm9vQZDTqxBlj3AyCf8CViL/CpX/AhYthlo4MxC8wmDFEm6RTuW0WPYSJoCJGo4wS1KT7kqpykXSQTjrdvfddnlvnOfWew6kL39VA0sphrfUO59yfwNW+vr5iNV4oFPZ4nnddRC76vr/wbY5qBQ7cEZHfReQP55wCiKKoSyn1yDl3xlp7rTavqQL5fD7tnBsBTgCLInJBRKzWutNaOwbsB2biOL5cm9uwRfl8Pp1MJkecc78Ai0qpk77v/xtFUZe19h9gn3NOJ5PJ093d3R9bcjA/P59MJBI3a+HFYnGvtfYRsA94Yow5tRUcwNsOvrS0dAs4C7yrwqempg4C40An8LhcLg/lcrlP9ThbtqhUKiVWVlZuAcPAO2vtyTAMS9PT04dEZAzoACbS6fRQJpP5vF0XNhWoB9daHwYeAh0iMp5KpYYbwaFmBqVSKbG8vPxXFe6cOxWGYWlmZuYIUL35g0qlcqYZ+KYCACKy4crzPLvF92R7e3vd2W06XxtYb9HfwBCwCAwEQTD3bYuAiXK5fLa/v7/ucOs6yGQycRzH51lryS5gVGt9IAiCOWPMCeA18HMqlbo/OTm5s2UHVa0/DXeBAeCVMeZ4Npt9XiwW9xpjxmiwYA0LAMzOzv4Qx/E9ETkGvPQ8b6C3t/fF+hZvPBHGmF+z2ez/WzG23eSenp4vxphzwBTQZYwZjaKow/f9l6y9S8+Ao57njWqtf2zZQVVa63YRGXXO9QH/sTb4N4VCYbdS6iHwEzCrlBr0ff990w6qCoJgqVKp/AY8BQ6KyA2AMAzfKqUGgTmgxxhzoza36f9BLpf7AAw6524rpS5V477vL6yurg6IyP22trYrzfK+a0NfAepxLvgo3BlmAAAAAElFTkSuQmCC"
446 | $iconButtonLogIn = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAA1klEQVRIie2TsQrCMBCGc126dhcXX6Iv5OjkY1R9DPUFHHwQQdzV0lnBST+XBGs90xIpVPGHQHL5Lj+5S4z5q3MCYmAGHO2YAnEopxlMeVUWymkGuZKYh3KR5qHErqGcZjBXYosPuGfZ5k2Agx2Zp8m13A8JSIAhsAZ2wBm42NeyBCIPdwK2NjYGkurhKVAoz85p1JBzKoC0bLCpSRjUcCugp1VGbOLNzd8oEhE8XF9E9j4D7dM8IBEvV913a2P0j9ZduYaUY766Nz7Ut//9JWr9Bq0b3AFSVbeeEsxapQAAAABJRU5ErkJggg=="
447 | $iconIntuneHome = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABPElEQVRIiWNgGFHAYerzYoepz4tJ0cNIlKr//xmdpr5o/8/wvxwqMsn+jWRhQwPjP4otCG24yvZGRHA+AwNDFJrU2v/cP2MOJCr+INsCt+4X3L85/61hYGDwwK7i/z6OfxyB2/OEP5FsgfOEl+L/WP5uZWBgMCbgwsvM//947M6Ve0a0BXaTXyiyMP3b+f8/gyo+w5HAfSaGfx57c2RuoUswoQs4TntmzMz47zgJhjMwMDAo/mNgOuYw6YUFXgucJr9wYvjHsI+BgUGcBMNhQJiR6d8ep8nPPbFa4DD1WfR/xn/bGRgY+MgwHAa4/zP+3+Q45WkSigUOk5/lM/5nWMTAwMBGgeEwwMLAwDjHYcrTcgYGLJHsOOXZf0pM358jhWImRiRTG9DcAhZiFaJ7ndigHPpBNGrBKKAcAAB1CWAtKzJosQAAAABJRU5ErkJggg=="
448 | $iconGroupManagement = "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"
449 | $iconSearch = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAgVBMVEUAAAAknvMnmfUomfUomfUnmfUpmvUjl/MomPYomfUomfYnmPYpmvYomfUpmvUol/Muov8omvcnmfUomfUmmfIomfUpmPQnmfQomPUomfUnmfMomfUnnesrlf8omfUkku0nm/MomfUomPUnmfUomvQpmfUomfUnmvYomfUomfX///+Vwm5wAAAAKXRSTlMAFYLO9M+DFlLx8lRR/bBACz+v/hTwd3WBskHQDQzzDkKAs+95fc2IfxLEHQcAAAABYktHRCpTvtSeAAAAB3RJTUUH5gYUDicDFaCpggAAAJ5JREFUKM+tkNkOgjAQRVs2obILtaDsgt7//0GJpHFq9Enm6eTc5GZmGPtnuGU7jusdPr0f4DXiaPowQpykaZbjZCRFCbnRGYK2KVQac3gksFFrzHAhgcBVY4PWCLp3IIyqXmMClwQDRo0xLHr2hNtGEgGnh8zA2DdNXSHyjSbM0/aSMjQ9GFeL0y6qIP6+evnl33t59vjh15UGtsc8AfKLD4mzmPrPAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTA2LTIwVDE0OjM5OjAzKzAwOjAwYoXoEAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMi0wNi0yMFQxNDozOTowMyswMDowMBPYUKwAAAAASUVORK5CYII="
450 | $iconGroup = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABjklEQVRIie2UzStEURiHn/eORjOXMhsWLNgNNnbWvlbKhuwkxR32kmyEklK23CKZpViwseEfsLIgkxLlo1BYMMPEeS1mxozPubaaZ3X79T7nd+qec6DAv0e8DNWvqv/lLjElaA+gIFFfKDB+0C3JfG6Rl4KX+8SkoCPZREdfb+MKjP2poNZ9bFdwATWCc+TYWwCi2vPFFHozBT95AFauo7AAVAJVorh5NqdePOuz9T0S/SZc8WJ+KDCCA5wrnKHqZHJfKDAOMgNcAhfAtC8UnMjn/Q8EoGpOA6V2fFihU6BEjdUaGwqcNizflT0n/V2qdCFaA1KZ0vQClRMR1or9ybW9vtB9eD5RLZbZVngQWE/4g7OnffIkAOGF+A6izenGgcOIvVjnxhsNugmU59nklTHScTQU3A27jw68n6LtWMRuS/1k0abMdNKYTQCDLnlYHKDCsnQJoMjSjZy8BbKn6P3JOB4suUl/1nlYPEM9wH6/fZ2TCaRvcixiZ9+kyMcBj6RmRTT2yfN40QoU+IU3oc2O2Vns69UAAAAASUVORK5CYII="
451 | $iconGroupRefresh = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACVUlEQVRIid2VQWsTQRTHf283qUkTtXhrUSlSSNLc2i8gqBVPBg89etBKlIpQaAW9NLfWVi8epFv04EkICI1Xix9A7K2lKUUQlfaitEqS1TTZ52G3sk3SJS160P9peDPz/82+nXkP/nVJ0GQ6rx21bTsjOBnUGAA9CSjIZ5QlhYW4RAtLWdnx70ta5VwxG8sFApJzlSuIzgJngs+o66oysXYzVvDMJ4FcMRuT1oCcGqlue1rRCS+yrCJPTeqLoUj8A0DtR6lX1byg6AiQBhRlGuEnkAPYF5CyKjOeeVWEsdWNzjly4rQ8fF7NxJY9KuhDIOyfagnw0vISqKrhXFq7cfRNcHq8ffPl5yhXWwGM3UA6rx1ezhFhrG1zqzzZaO7Xb0Bt287g/tDl1a5Oq21zL+dtLC69SFplTViVO21taFOGbzwAENL64l8CSA8A9fjHPwkINQZqkS+BrztIfY+/HgsdiXwDvhezseOw5wt0AyC0Ezl1WEA43HHaHcnmbswHMN4BOGIOHRaghlwEUHjbBFCh4E7qCHk1D+yeVxPkmmvGqyZAqCu6IPAeSCe37FsH9U9s27eBftD1uEQLTYCVYaki4hU4fdQ/VzrXrnlqvnReVGcBVZFxf/luujEJq/JA0LtAFZXx4onoE4al3sr4bE5Dmz32qGceBpkuZjvv+de0LNeJbnvKgwCsCPIMp/7acNxy7RilXhVzCNHrblpQFZlZ24jeb6y8+975lFXOKMwCffutcbW34TQq8FENWhouqX1ZIIMw6LVMBD6BLDlKoVXL/L/0C7qI6rgG7zcJAAAAAElFTkSuQmCC"
452 | $iconGroupPaging = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAB3UlEQVRIidWVMWtTYRSGn/MlanJvM7fYChXE3jgouLk5OTTaQcHVQUxT/AN1sVpE9BfopX9BESXVwdWtOLjYNIsZQm0Hl9qbREzOcWiE9N5EmljBvtPh/V7OA985Hx8cdUncyIdRwSAEJofsVVehWC3673pNF08ZPB+hOcCUGGHcTACAqRGaAyBw6iCAQ9U/Bxx9JdY0CCP7m4aVeX9fz/96yAq8wZhrkzrT/uFlBE7GQ+kRm9dVuF4t+msx/+thAGqptl2q3B3bCp41p3F6D5gFxoFtYBV1TyoL2RoMP+SO4i5X57MfgnD3CrgXYLlkTL6L6Y310tj7BOAgmllpnha1T2A5jLI6ljMZ73Or1TjnjCWgAOxIyp0faQaiugjkMMqVkn+t52gNuBqEURkooLqYAPzpiizN5MZtf5O9O8fgYb+cqiw7ZwUzZoda007kfeuW4wAnPG+9X06OR7/9iaEAx7zWRLfcBvjZbMwEYfQgAVDvbLfc6geoDwKo6oVu+RrA4CWwtC9kJij3AUR4mwCoUBwEEeMWQKptj4AWMN17ng+ji/mVxitgDtixjnuaGHL3T038TL3qpKUEZOK+wUf2VmQXsZuVhWxtpHcwSEEYbRqs4tzjjTvZLwC/AJiinuCuqDEqAAAAAElFTkSuQmCC"
453 | $iconGroupCount = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAAN0lEQVRIiWNgGAUDDRjhrIor/xkYGBgYOnQwxcgBUHOYyDZgxIDROBgFlIPRVDTwYDQORgHlAADHmRgNDUab0wAAAABJRU5ErkJggg=="
454 | $iconDeleteGroupt = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABBElEQVRIid2TvUpDQRCFv1kJGK+tZTB5qbyDIljedKa9rT6bhRjhoqiNVnpDhCRjEZCQ2WV/SBNPucycb3bPDhy6JKVo2HRT4GantWnrk0kWYNh0mjFcUG1d/fm6fRj+b5mQz5vuTuCqzE5v2/r0evvEZCCqL2XmIIrp9YTsnksB6lwcsHZ2imSAYIYzgN6RLUpVb53wRE+D/pvCMtdcYTkb9d+jAMayEjCFMQm8MpZVHLBRdg4a6AkANDsHEfH2eAGK/W5ReXYgCHBS8ESBBfXfoGCbHf7v7Qd4FiYmdRk3ONb5I/CT4b+o5tUsGfBQn32pcAl8xpwVPhC9uJ/Kd8ZAB6RfZMRSJsaTTHMAAAAASUVORK5CYII="
455 | $iconMigrateGroup = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAADDUlEQVRIid2VT2hcVRTGf+dOmua9mUAJXRgpyUxpXXRw02xc6aIEF4KO3XdVJRQMVWk6obT1UUEzBlHBhaFkY3YFwbhxYS24caOFUkwXVplJC+oqCM17byZ13ufizaTTeZMpXeqBC4/z5/vO+e5998J/3WxYsBxoNBqLK7KkAu446FCjmi88DcHIXoHpWnQyJFoGDqd9aGBesRYOCOjTRrXwzmCCQG7ai5cMLXQ8t8FWk1z7ekuFzSf3/Ah8IEEPeAtxttH0rxJY8mRgAH7sBYe+PZiuRScNfQW0MPdy47z3A6R7Efrx+0inAIGt5WPv8kZgOz0SJYBJvLK5mP+2i+m6H+VAo4aW0yk52wUHCL34CtJ5YBJ4FlQNvfhKryxm9jZgZvqMa8plCKKxuAIcBm43mv7VxyfXqawaXV+qeX3B+xxxB+xoqR6/niFIjyKArT6F5uxqbiZz9gVAAq9mCIAZgCTXvp6FsbWsy77sd7WT9g0AI3mh6+s5RW4ShNdu3u8vzMfe5dCLeSSLreUj773+vPFmYTP0IoRNZgiEzICR+GDmx9kIbAdY7Kw9rTWx5YjHMLEr8a5Ehv4AeFDYnhoGMszUGk1rzf7MTIC5n5Gec0luFrjTdU8tPSgbbs7ghIwpABP3BN+LZOXe4vhGN7et3GyqBT9lJ0hYT9vQaQI5gFItvGTmbpkxj3HMoGBQwDhmxryZu1X6KLwIwDXlkE4DOHWwegn8pvc18DvwfHEsmiOQE5RsyIVoMKKEEoFcqR6fAcqguxMHvCzBRmA7crbQqfykuH/7xUbsv2HYPLA1AH9L4q1G039z2tt+SehjQIaduzlnD3uaeNyKtWgJVAVagnc3S/7Kkb8YediMThh2FECJft3n+zd+e4Z/SvX4TAd8FPiwUc1f6JuyzwK5ohd/0CFB8Ithq4na34030+u6md8utpWb7WheTtNYasT+xf5bYM8XrVgLK4JlgyN75aSmu4adq1fz3wyKDn0yZ1a0b+vv+DWgImNG0qFO0X2Z3XRifeKAt96r+f/P/gWEqEKE0SihaAAAAABJRU5ErkJggg=="
456 | $iconSyncAllDevice = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACL0lEQVRIie2UTUhUYRSGn/ON4nVuKpO6suD6Uy3ctI+kjRBUZBBCWxcSUVvHIvC28Ge2CRFE0C6QWbiIaBEG/UDLWgSFaGPixhghde6M6P1OCzWcaWbuGC19l4fzvc933vudC0eKkEQ1dKY2+y0yKMh50BMgFtVlFT6Afb6UbHrzT4CuicJpG9t5AtJXzUCV1zETu7U44swDeKmcn0m6flVA51S+T8XOAglgVYRpRV/kxZ1valiLbeecbgzXBG4C7cCasVy0hkvAWCbpSkXA7s3Dj0BCIe0QDH1Ltm+Uu0jHxHprfV3sKcpVYAtoADgIqCs9tBdLQiG9NBIfRFytFM/KveYsvl73GoNPQG+5HlMUTWqzfy/zVYdgCJGK5vvyGoP7lcz/AlhkEECE6UqxFJmncj4wVq2n6Bt4qeAr6BlRPft99NjnKEAtKppA0Q6AeMFd+B/mUMOi1aqeh9nmnbzzC2U9M+q27NdNtUOH0XbB6QFAWDlYL3qmXipX7tX4maT7IAogypU9wNuD9agJajLvmlprUbgNoKGdqRXwJZOPj0eZ46ux0vBMoA2RuaW7TXO1ALaAXi8epDsm1lur3dxzgjQwAGRDzHBpT8ke5BTwjeWlNbwCjgM/FR4jzMbs1kK9hLYg8VMCl1W5I9AGZI2agcXRxvdRgD+/2u7JQk9owkdAf6UJdh1kLsQML484ZXcncg+8yY0LGHMDOIdyUgUjyg8M7zS0M6WZH+nQ+g3+T8fG5ZGFPgAAAABJRU5ErkJggg=="
457 | $iconTotalGroupMember = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACUklEQVRIid2Vy08TYRTFf3eQR4vySsQoiZ0CCYnFpe58LEhcsQASjP8GKS1xxc4ZCpiYqPE/IBF3JhI2Ji51LTGgtCQGH4kV7czAotPrgraZdobqFs9q5n7nnnPv94T/GqlF7UBVAIYt56ppux8TtrszkiuNA6AqqUXtaKVhnDSQWPJmnJj3GBEdtoq9FZENYERg1PeNjdFHP3oQUS/mPUnY3vS/G6iKaTsPRXXdEH0O4NOZBi7VOcJQ+bBrDkBF1wV9YVrOaq3bIEKBpO2sKDIHFAvJ+CCAmfe+AOebqN8KyfgQW4gZ874D/SqyvJeJz5/YQdJyJ6vigG4yK34i79yMEAe4YH5ybrAoZdBNAFFNt5qu04n6Gpi2swZyt/Zv+G1ju/e7tk3LfY9wJTJb2SosdKeS9u8xpe1DYGCtkD17DxrWQK415Gr5V7WEvhbl9QNQNg6aBq7XCw1ELwYpbee6a0kDJxpwbBDghrSCBhpklIvhLRwBBTgqh85TJcrga5Ah7W5v9bPYwuAAoP3Q7WmK17UCBvqugXKmUpv7ny0MigAqlf7GsL5tkXPK0LCQpuXcQeTVcfx4L5sPSrcxjNeRyWrcyi/E3gTPkCFM7ma6X0YaACSWvJyopmm87PaBwSZq6LJDZKmQiWeDpNB1vTcfywiyAgyYu+4Es+IrPIto4Cmz4ptxdwLoUyRXmI8tNJPC74GI5rPxNDClIjMA7bGjZWC/RlH43Im3CqAq0yhTe9l4BhEN6bVC8MkcyZXGE7a7Y9rO9mWrlKKq/rcn8/TjD3da3rnEW+IhAAAAAElFTkSuQmCC"
458 | $iconGroupMemberUser = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABUElEQVRIie2TP0tCYRSHn+O9FhoIRVsKkdAQga2NSeQ36Bu0tBooTY0N/pmaoj6AfYIC98aGFsEytNpEcLiZeu9pqMhM7xWVJp/x/M45D+/L+8IMD2SUpmjWijgdzavI3mdFi4KdrqRCpYkF0awVsbt6Byz1RQ3DlNhDMlhzm/d5CZyO5gcsB1i0u5r1mvcU/FzLoJDExAJXBJ2CQIsu2fXEAsFOA40BUd3El5xYUEmFSoYpMeAKpYnSBC2YyFY5FXz2mp/hyfCfXFBj7bG17ficeKdrn70ch+q98Xqmudx2jEMHKVZXA7fsiz2SIJzTgNl5OwA9AiIACmVE0uJ/LwJIe35X0VMg+jVWFZGMWoHzpxNpDRWEc9aK2dYbhA3vw/9F4d6BRC218Ppd+/VMzbZejrscQGDTgIvemq+vY2fc5T3EhwvAPwXBnJtgxv/zAQJ3aVeO+h5sAAAAAElFTkSuQmCC"
459 | $iconGroupMemberDevices = "iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAABMUlEQVQ4ja2UsUoDQRRFz2QnUSNZ1EKNTdIIFvoBgr2VnR8hWNrkF2wEv8De0loEK3sj2ghaiASLKOrGTXbmjUVcCKybHUJuMwx35rz73sDAlKRo3T3Xw3JDl7LmWi2gsaC57QyIEpfxv/rCR8+ecLx5pCuBalwdNidKcf0YcXD+2gTQKLAyEQc3ElIDWFGFly7bfZ7eDAD1mqJagfsO7K+v7M6ddR80gGTbz+gzEt6/hwfTFWCmFMyLY+MvUTHI4LAuv6I3yArTAjlMEUg8hm3cEJYPcmA9hm0EknEgB3QjS1AQKjaWRPJnoGi1b0AtFyXaWgpXF2d1NR/kqe3Tlwsce3m+9gX1Exlb1hsUiyUlKaAcKAYjr/TP55GTyLif2AqxFeqhYqepSfexlZ4vp1C/cTCFm76WjAIAAAAASUVORK5CYII="
460 | $iconGroupNavigationPolicies = "iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAACJ0lEQVQ4jYWST0hUURTGf/e+J07+w5oIF0ZFQdIigv6sIjIXRi6CWRQEUbQcEFq2K1pEi2ohDu5atCwGNxK1KyUKJwsiMSIjsj+QDjJDU43v3XNavDfqqG+8cDb3O+e73/edawAu3i/1q9FDbHKstaMPLnV83AjzAcS4q02eOe170eXetKG92fC9rMz/VgCWQsWpC4G7iUQIXO7dwp7tXqKap++rPJ+uJuJ+zIMqiCbbMmqQZDgicqo4VcIGnU4V1wCPFKkgYhA1DYggbKApUsTm1kShkbeISBSnEVmiIlHCZBgbyVZEogySShRSUmrJ5XIZ1fUZWIBQhJAoh43qx+cPyN8i+93bk6qaHxkZOTM0NHQgl8vtq7MWCjgHskEGqsrc9BtSlTIpOAUgImPWWlT1MTCwSpEiqoiwrlQNrdt2ANDc2l7p6el57XleEL/zst6aarx+6ioMAmYmxih+mwXg3PkLQV9f35FMJvMqnr82PDx8a9laoBJ/yjWbUjB+U2QR8DzjAfi+b+MWUdWlZUXVIPrVa0PGa2L3sX7a0l0Y4NHDvCsUCuP5fP5gTHRncHDwRp2iwtc/zC3WrK8c46p0FH8hxqNSmu+cnJw/sQoeAG6ubE2FJzPlZXRXp8f13jaujJYA2Okd5qfbytmWqYluu3DcWnsUCFS1qzbjA/wLuQf6rHb5ZTG0t8crbVWnZYBPLg3A7FL6RXdqoTubzU7Fre9qM/8BE/86JRnVtJMAAAAASUVORK5CYII="
461 | $iconGroupNavigationCompPolicies = "iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAABv0lEQVQ4jYWSwUtVQRTGfzP3mqYPM3XRqjIICikjaClYBLVxWyurTas2rfoPIgiT2oeL1kGLIooiaiOEq8IIM0gKiQh7+LiK1zdzTou578XLO/cNnM35hh/f980YgJn5jQtq9BRdjrX2yaOrg1/KtBRAjL/Zk5iLaRKWR4YNg32GtYbyO1MAdpzi1TvgXhSEwLWzexkbTaJuXi7lvPuUR/W04KAKovFYRg0SlwPIq+JVcRU3vSq+Qg+OVBAxiJoKELgKT8ER3aOJQlW2ABLFa4BFHYni4vK/jkSqOxAF3y2aE8EReogd1+UxChB4DxK5+OrrDOtuiYmjzE68PjHbqZpnd89/nLYBpIgqIpSP+l3wxKScO3wdW5ixLdvh+Smd/xNbY7k0fhtQpFAtQFOl+JSUDsDpA9OkthdrLJfH7/ArW+HN6sPOjvJmKDJWtgI9SS9XTt4ndxk/s+UOSBvUVGHx+xY/6s1SUCbC+7XHjPQfpC+p7YK0QU6FF58b7eWhoYRbkzVuPN0AYOq4Y/8APF+ZK7fcAm075kDftpardWcfLGzWcq8NgPXNY2e2d4ZG9w18W+7f86feEduYDwB/AYjz/zbCqyVFAAAAAElFTkSuQmCC"
462 | $iconGroupNavigationOverview = "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"
463 | $iconGroupNavigationApplications = "iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAABNklEQVQ4ja2TMU7DQBBF32xyAkQOEKhScxJ6GprkTLihoecQqVObyhdIRA0hO5/CjuRZbxQJMeWz/fx3vhb+aQzg6fWzA5YjuMNoJF7Cy8YGsRY8jHD39nxzPwfI0pIwhgmEIpUNJPA7gLOo8AghTBawzDGs8PQzBzh58efzh2WiKh2Jjq5dcYRW8j3JAse1N0utbKrqRVnNGCbpcCJ/JM0Cd+WPOby7sa2KfrKHdjB2QJN9wjcZX+OhNYCmF7lPovYbKXmNjRJ95+KhGSCYtDnUUPKLIkAG5U5rLIiOJ98EmuyQoZ25As/JtjM44LqtJxLrMXT3FpLShLMHf0yyVeFphqPlsgUkX5jFdiQWZqxg0trlHQ3rvsqC6Ku2bNTfqyusEOXOhlt8/rVRb1/EWILuQsi/zS9LeaMYZFIZsAAAAABJRU5ErkJggg=="
464 | $iconCopyGroup = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAAuklEQVRIidWUyxGCMBRFz2PcUYI60o99pAUsQTqQSmwHB1pg/Vw4aCZDhATEyVll8rn3fZJA6ohvoah6jRFU6FDM45LfAbLYyHwIHESo19Z9U1S92tmvnoHLbhicrv1ZoEbYhwi4NXf5ZCDcQsVfx77XPLM3hopbHCcNfsUsg6bMpSlz75tZbLCE7a6py1hJ7Lm5X8n/MrAjHCKP+QDTb3Jw03z43sl2JVLoFui0kwYoJtKkRdTERJUGT1tnMuEQslpmAAAAAElFTkSuQmCC"
465 | $iconAdd = "iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAAAbUlEQVRoge3Xuw3AIAwAUSdtlmDLzMCWWYKabJBPYXSy7tVI9okGIiRJUr7Wx2x9zOw5e/aAVQyhMYTGEBpDaAyhMYSmTMj25dCKZ/iT6zxe9yxzI+n8WP1kCI0hNIbQGEJjCI0hNGVCJElSRNy7aQ6wukLO8wAAAABJRU5ErkJggg=="
466 | $iconDelete = "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"
467 | $iconAbout = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABZklEQVRIidWVPU7DQBCFn4OSAhEkqCkRByA0cAMoiKMoSsEZOAcEcQQOkdQcgZ86/KTB9EiRaCDio/CEWM6uvQlVnrSytfP2Pc/s7lhadURFQaAmqSWpKWlf0o6F3iU9SupL6kdR9LWwM9AGRpTjFWgtIrwGXAcI53EFVEIMXOJvllHdRgwMHbxeSFlc4tsO7pbF8oh94jXcNW9b/ARIbBzbXMfBfyE9HHMGXQcZoG7xJJuVzW161nSmutlNaXoqNwbQ7IhmseFZ86eVNWh4yHlMJJ3be9fDOZibAcaedPM4M/4h8OnhjJc1uDHuLvBRwHMaPAUY7Bn3toQ3nOpm9+A+oP4jex6V8O5cBoMAgwmApPUS3rwWUCW9JP/FCNdFM5NW0coMz4cf4LQwN9KuuKzBRUnpJKAC9Ioy8Xz5JSHtOmMUE7Ynz4CvzZT+MquSYqW9paFZP0okPSg9LYMoir6Dv3zl8AsKfI8ggolmqwAAAABJRU5ErkJggg=="
468 | $iconLinkedIn = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABJ0lEQVRIie2Sr07DUBSHv9N1YmuxGCAMFG5BIJBYeAhCSOpm2wUMju0FyOawPMEegQSFJYHQsTkUCd34k/UgCKQ0KdDugoHP3T/n9+Wee+CfL5DkYrEVbQl0EeaKhCkMUbx+0+m97VkpXado+Gs58yJ0k3tW+kLR8AQLmYIUV4juCBxNY8sUiGon9N3j63G1ATwXFdhZB2pZu0ut0Y1KtA5SNi5AdUWFk9Sg5SazRSrsh4EjYeC8G+xJPBsGjqiySRxvMK5WEF0Fucgt+Ix+0+k9Pbpn4YE8hL57LqhvVLB8GK2VK6O7Wvt+G6A0iU+NCrREXcBGqQNc7s3cGhUQf//niwly8OOCD0+ttSM1EZoc7d9tkcLQQOYgU4DiTSkZIOpNUf8XeQFjeFM4aqoyewAAAABJRU5ErkJggg=="
469 | $iconTwitter = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACA0lEQVRIie2SP2gTcRTHP+9y1+Qutf4dxCEJHXTUooOtWLqJILqIgrMgAXFqbMUlXUzqqCCosyIu4uBSFBHxz6A4ZQnFFrVasQ62uYsxXp5L06bJ5Uy66NDv+H3vfb7v9/jBhv61pNuBXVl1LNsbFzgDJICPCnd8y8ltXsR3Y95RhH2zY/GJloBk3r1mOU5m+oJU2sF7bO8JcDCg/B7YDiyYyMj0mPMJwFgpqwpC+nfZu79n8tumoADL9sbbwAH6gajC06rqibq5GiCiAovA8QrOu8RV71AzYfksYYqBRHdsdW41zKwqOeleFzjfYL0CvR2pmc8r0eicWfWWgEhIgM5edCKIaN0wG6u9ZeeSa7t7QQ4vW4Mgg77hY1a9vywPIKVGODSeCHBjXqYGE8DLDmgBqn1pdtYEqCH9BvIYGFpfAG9DA3o9Oy3wYp1wFB6FBhSyUpopO8MKZ4HXXfLnq+X4g2bTbDZStncPOADs7IYuIlc+Z6XlJxjNRtX300ARsDumK1MzKftGYHC7mWTOHRBDToNmghZpUKEn4o8UR/sWgoprTrT/plrz35f6TMvcbfh6TNFzoXBlyqByqji67Ue7lpUXpPKlI4jkgIGQbev6IKqXZ37G75KVWlhjy4mSeW9IqJ0UQ4ZVSQBbFL6KMicGb1B96JTjzwpZ+dXBIhv6D/QH8mKgEDaLDDsAAAAASUVORK5CYII="
470 | $iconWordpress = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAD8ElEQVRIid2VX4iUVRjGf+/5Znfn+2azxT/4J9dZKQpUSDKKErUugoLIyXDcQiMCk4T+XLRuRhcDEbVtGHQRtOJVRbUG6yaBN1uURX/MyEgrMXe2VSMoKXd3vtnd+c7Txcza6mxSl3Uun/Oe53nf5z3nPfBfX3apzeUFNZbScU7mc+CuAy2uHTsF/iuT2xeVw31HCzbxrwWyXaUNhrqBH83oRcnBkrvsFEA4OdJqLljjIW/GUjnrGOqI+v6ZQEEuG8bPG369KdiapCq/usS2gt0CtAENiCHBQCrwPYlSc1CyG3N9xVK4k4L56XSuLvMq+Y0Y62TJ3S5x34I9DqwEWoAMxjIzHkm8O2LyeVVsHfI3tUXxcxfzXSBQtcWvD5w2gnujRnypPjlJw5OT0R+VhiQnaUNb11huRouWF9Q4FpaOmdyDiSUNzuweZOdA90ocx9nXJs3CSGr4JiCbCqPwxKM2Xk1w5FZwPXNbomWHt9nkBRWU0nEOOBmV05/91Nk8UNyR2Y40D5hvxgqkuNiZ2VbckdkuNAeYD1hSHlt3PlufGnTY0Nnf4/V1Fsl8zozeUljqvOplNQGYYxBoAhaYeGzxLoW16O+BEECyFygoVWXzD2HqBXJ1AsAqlByUaJ8sx3dWeZK908yclarEdwF47E0gqe1cm02XblteUDNwhyrJR4LrZxBwCxsZP4NZq0n3Awx2zvoB+OZ8iDQOMNyZOYMYOI8Hlo7T5ZVAW1MwfhpYNFMFUywp4ParXzw3F0DQWythhDg6MGWTodemTjR4DsmUq+e6QMD/PEHTIsyGgMbJJNUOECTB3ppF+2kqLwgm4ocBSkGmTzCKOHZiR3haaCNQLJNeDJypFzD3JQrWmvR+NXNtATj5VPo4cARpLy7ZZFbFf+mwMbA+zPYv6Y5vBpYYNmBya2UcqhMwT7+HPFIP4IEblnaduwbAzPYQRwfA2oGVV3aPrABw5l/3xn4nnwe8J9mDs7wT/XUCUTncVx1cQQvQU0WDLQCDbeErFo5kqY4LEh9sruKZgXmXh1+AbZTZLjwLkW+d3RLWCxwt2IScdaBkdwLPgH0g2ExBjrwlImj/q1+6bwr/7ezoauCIl14y53oMe2LqFV/UZBjqiPow1xegtxK02eC9pVF5ddVDmyZAazYcrb5gF5StogccvA30DnZm3p3OWXdNi6VwJ+Y+dfChx78TldKfZ58dW4gwIAZKwHdOdgWAfBIpZZ+Y2cfFOHr6Yr6/nZRtXWM5QbfDhjD1evmDzXHzMMBI8+gSV3FrcJZHvhVZR/HJTP9MPJf8Mle9qoba4MrJWCVVv0yDYZkddqJ/dkvYP93z/9/6E+aHsqs7a3d1AAAAAElFTkSuQmCC"
471 | $iconBlog = "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"
472 |
473 | # Add image to UI
474 | $WPFImgHome.source = Get-DecodeBase64Image -ImageBase64 $iconIntuneHome
475 | $WPFImgButtonCloseMenue.source = Get-DecodeBase64Image -ImageBase64 $iconButtonCloseMenu
476 | $WPFImgButtonOpenMenue.source = Get-DecodeBase64Image -ImageBase64 $iconButtonOpenMenu
477 | $WPFImgButtonLogIn.source = Get-DecodeBase64Image -ImageBase64 $iconButtonLogIn
478 | $WPFImgItemHome.source = Get-DecodeBase64Image -ImageBase64 $iconIntuneHome
479 | $WPFImgItemGroupManagement.source = Get-DecodeBase64Image -ImageBase64 $iconGroupManagement
480 | $WPFImgSearchBoxGroup.source = Get-DecodeBase64Image -ImageBase64 $iconSearch
481 | $WPFImgNewGroup.source = Get-DecodeBase64Image -ImageBase64 $iconGroup
482 | $WPFImgRefresh.source = Get-DecodeBase64Image -ImageBase64 $iconGroupRefresh
483 | $WPFImgMaxGroups.source = Get-DecodeBase64Image -ImageBase64 $iconGroupPaging
484 | $WPFImgGroupCount.source = Get-DecodeBase64Image -ImageBase64 $iconGroupCount
485 | $WPFImgButtonAbout.source = Get-DecodeBase64Image -ImageBase64 $iconAbout
486 |
487 |
488 |
489 | # Group Overview
490 | $WPFImgDeleteGroup.source = Get-DecodeBase64Image -ImageBase64 $iconDeleteGroupt
491 | $WPFImgMigrateGroup.source = Get-DecodeBase64Image -ImageBase64 $iconMigrateGroup
492 | $WPFImgCopyGroup.source = Get-DecodeBase64Image -ImageBase64 $iconCopyGroup
493 | $WPFImgTotalGroupMembers.source = Get-DecodeBase64Image -ImageBase64 $iconTotalGroupMember
494 | $WPFImgTotalGroupMembersUser.source = Get-DecodeBase64Image -ImageBase64 $iconGroupMemberUser
495 | $WPFImgTotalGroupMembersDevices.source = Get-DecodeBase64Image -ImageBase64 $iconGroupMemberDevices
496 | $WPFImgGroupNavigationPolicies.source = Get-DecodeBase64Image -ImageBase64 $iconGroupNavigationPolicies
497 | $WPFImgGroupNavigationCompliancePolicies.source = Get-DecodeBase64Image -ImageBase64 $iconGroupNavigationCompPolicies
498 | $WPFImgGroupNavigationMember.source = Get-DecodeBase64Image -ImageBase64 $iconGroup
499 | $WPFImgGroupNavigationOverview.source = Get-DecodeBase64Image -ImageBase64 $iconGroupNavigationOverview
500 | $WPFImgGroupNavigationApplications.source = Get-DecodeBase64Image -ImageBase64 $iconGroupNavigationApplications
501 | $WPFImgGroupGreation.source = Get-DecodeBase64Image -ImageBase64 $iconGroupNavigationOverview
502 |
503 | #Group Grid view
504 | $WPFImgGroupGreation.source = Get-DecodeBase64Image -ImageBase64 $iconGroupNavigationOverview
505 | $WPFImgSyncAllDevice.source = Get-DecodeBase64Image -ImageBase64 $iconSyncAllDevice
506 | $WPFImgSearchGroupView.source = Get-DecodeBase64Image -ImageBase64 $iconSearch
507 | $WPFImgRefreshGroupMember.source = Get-DecodeBase64Image -ImageBase64 $iconGroupRefresh
508 | $WPFImgAddGroupMember.source = Get-DecodeBase64Image -ImageBase64 $iconAdd
509 | $WPFImgRemoveGroupMember.source = Get-DecodeBase64Image -ImageBase64 $iconDelete
510 | $WPFImgSearchSearchAddToGroup.source = Get-DecodeBase64Image -ImageBase64 $iconSearch
511 |
512 | #About
513 | Add-XamlEvent -object $WPFBlogPost -event "Add_Click" -scriptBlock {Start-Process "https://jannikreinhard.com/2022/07/07/intune-tool-box-rebuild-of-intune-in-powershell/"}
514 | Add-XamlEvent -object $WPFReadme -event "Add_Click" -scriptBlock {Start-Process "https://github.com/JayRHa/IntuneToolBox"}
515 |
516 | $WPFImgTwitter.source = Get-DecodeBase64Image -ImageBase64 $iconTwitter
517 | $WPFImgWordpress.source = Get-DecodeBase64Image -ImageBase64 $iconWordpress
518 | $WPFImgLinkedIn.source = Get-DecodeBase64Image -ImageBase64 $iconLinkedIn
519 | $WPFImgBlog.source = Get-DecodeBase64Image -ImageBase64 $iconBlog
520 |
521 | $iconJannik
522 |
523 | # Fill combo box
524 | $valueGroupCount = "10", "100", "500", "1000", "5000", "10000", "All"
525 | foreach ($value in $valueGroupCount) { $WPFComboboxGridCount.items.Add($value) | Out-Null }
526 | $WPFComboboxGridCount.SelectedIndex = 2
527 |
528 | $valueGroupMigrationType = "Migrate to User group", "Migrate to Device group"
529 | foreach ($value in $valueGroupMigrationType) { $WPFComboboxMigrationType.items.Add($value) | Out-Null }
530 | $WPFComboboxMigrationType.SelectedIndex = 0
531 |
532 | $valueGroupType = "Security" # Add M365
533 | foreach ($value in $valueGroupType) { $WPFComboboxGroupType.items.Add($value) | Out-Null }
534 | $WPFComboboxGroupType.SelectedIndex = 0
535 |
536 | $valueAssignmentType = "Include", "Exclude"
537 | foreach ($value in $valueAssignmentType) { $WPFComboboxAssignmentType.items.Add($value) | Out-Null }
538 | $WPFComboboxAssignmentType.SelectedIndex = 0
539 |
540 | $valueAssignmentTypeApp = "required", "available", "uninstall"
541 | foreach ($value in $valueAssignmentTypeApp) { $WPFComboboxAssignmentTypeApp.items.Add($value) | Out-Null }
542 | $WPFComboboxAssignmentTypeApp.SelectedIndex = 0
543 |
544 |
545 |
546 |
547 |
548 | # Enable icons
549 | $WPFItemHome.IsEnabled = $false
550 | $WPFItemGroupManagement.IsEnabled = $false
551 | $WPFItemHome.IsSelected = $false
552 | $WPFItemGroupManagement.IsSelected = $false
553 |
554 | # Reset lables
555 | $WPFLableUPN.Content = ""
556 | $WPFLableTenant.Content = ""
557 | $WPFImgButtonLogIn.Width="25"
558 | $WPFImgButtonLogIn.Height="25"
559 |
560 | if(-not(Test-Path ("$global:Path\.tmp\deviceImg.png"))) {
561 | $imagePath = ("$global:Path\.tmp\deviceImg.png")
562 | [byte[]]$Bytes = [convert]::FromBase64String($iconGroupMemberDevices)
563 | [System.IO.File]::WriteAllBytes($imagePath,$Bytes)
564 | }
565 |
566 | if(-not(Test-Path ("$global:Path\.tmp\memberImg.png"))) {
567 | $imagePath = ("$global:Path\.tmp\memberImg.png")
568 | [byte[]]$Bytes = [convert]::FromBase64String($iconGroupMemberUser)
569 | [System.IO.File]::WriteAllBytes($imagePath,$Bytes)
570 | }
571 |
572 | if(-not(Test-Path ("$global:Path\.tmp\policyImg.png"))) {
573 | $imagePath = ("$global:Path\.tmp\policyImg.png")
574 | [byte[]]$Bytes = [convert]::FromBase64String($iconGroupNavigationPolicies)
575 | [System.IO.File]::WriteAllBytes($imagePath,$Bytes)
576 | }
577 |
578 | if(-not(Test-Path ("$global:Path\.tmp\compPolicyImg.png"))) {
579 | $imagePath = ("$global:Path\.tmp\compPolicyImg.png")
580 | [byte[]]$Bytes = [convert]::FromBase64String( $iconGroupNavigationCompPolicies)
581 | [System.IO.File]::WriteAllBytes($imagePath,$Bytes)
582 | }
583 |
584 | if(-not(Test-Path ("$global:Path\.tmp\appImg.png"))) {
585 | $imagePath = ("$global:Path\.tmp\appImg.png")
586 | [byte[]]$Bytes = [convert]::FromBase64String($iconGroupNavigationApplications)
587 | [System.IO.File]::WriteAllBytes($imagePath,$Bytes)
588 | }
589 | }
--------------------------------------------------------------------------------