3.5.0
This commit is contained in:
Binary file not shown.
@@ -11,7 +11,40 @@ This module handles the WPF UI
|
|||||||
|
|
||||||
function Get-ModuleVersion
|
function Get-ModuleVersion
|
||||||
{
|
{
|
||||||
'3.4.0'
|
'3.5.0'
|
||||||
|
}
|
||||||
|
|
||||||
|
function Initialize-Window
|
||||||
|
{
|
||||||
|
param($xamlFile)
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
[xml]$xaml = Get-Content $xamlFile
|
||||||
|
[xml]$styles = Get-Content ($global:AppRootFolder + "\Themes\Styles.xaml")
|
||||||
|
|
||||||
|
### Update relative path to full path for ResourceDictionary
|
||||||
|
[System.Xml.XmlNamespaceManager] $nsm = $xaml.NameTable;
|
||||||
|
$nsm.AddNamespace("s", 'http://schemas.microsoft.com/winfx/2006/xaml/presentation');
|
||||||
|
foreach($rsdNode in ($xaml.SelectNodes("//s:ResourceDictionary[@Source]", $nsm)))
|
||||||
|
{
|
||||||
|
$rsdNode.Source = (Join-Path ($global:AppRootFolder) ($rsdNode.Source)).ToString()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add Styles
|
||||||
|
foreach($node in $styles.DocumentElement.ChildNodes)
|
||||||
|
{
|
||||||
|
$tmpNode = $xaml.CreateElement("Temp")
|
||||||
|
$tmpNode.InnerXml = $node.OuterXml
|
||||||
|
$xaml.Window.'Window.Resources'.ResourceDictionary.AppendChild($tmpNode.Style) | Out-Null
|
||||||
|
}
|
||||||
|
return ([Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $xaml)))
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Write-LogError "Failed to initialize window" $_.Exception
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Start-CoreApp
|
function Start-CoreApp
|
||||||
@@ -51,6 +84,23 @@ function Start-CoreApp
|
|||||||
Write-Log "Application started"
|
Write-Log "Application started"
|
||||||
Write-Log "#####################################################################################"
|
Write-Log "#####################################################################################"
|
||||||
|
|
||||||
|
Write-Log "PowerShell version: $($PSVersionTable.PSVersion.ToString())"
|
||||||
|
Write-Log "PowerShell build: $($PSVersionTable.BuildVersion.ToString())"
|
||||||
|
Write-Log "PowerShell CLR: $($PSVersionTable.CLRVersion.ToString())"
|
||||||
|
Write-Log "PowerShell edition: $($PSVersionTable.PSEdition)"
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$osName = Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name "ProductName" -ErrorAction Stop
|
||||||
|
$patchLevel = Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name "UBR" -ErrorAction Stop
|
||||||
|
$ver = [Version]::new([Environment]::OSVersion.Version.Major,[Environment]::OSVersion.Version.Minor, [Environment]::OSVersion.Version.Build, $patchLevel)
|
||||||
|
Write-Log "OS: $osName $ver"
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Write-Log "OS version: $([environment]::OSVersion.VersionString)"
|
||||||
|
}
|
||||||
|
|
||||||
if(Test-Path $global:modulesPath)
|
if(Test-Path $global:modulesPath)
|
||||||
{
|
{
|
||||||
Import-AllModules
|
Import-AllModules
|
||||||
@@ -98,6 +148,8 @@ function Start-CoreApp
|
|||||||
|
|
||||||
Show-View $View
|
Show-View $View
|
||||||
|
|
||||||
|
if((Get-SettingValue "CheckForUpdates") -eq $true) { Get-IsLatestVersion }
|
||||||
|
|
||||||
Invoke-ModuleFunction "Invoke-ShowMainWindow"
|
Invoke-ModuleFunction "Invoke-ShowMainWindow"
|
||||||
|
|
||||||
$global:txtSplashText.Text = "Open main window"
|
$global:txtSplashText.Text = "Open main window"
|
||||||
@@ -600,7 +652,6 @@ function Show-UpdatesDialog
|
|||||||
Show-ModalObject
|
Show-ModalObject
|
||||||
}
|
}
|
||||||
|
|
||||||
#Get-Module | Where Name -eq "Core"
|
|
||||||
$fileContent = Get-Content -Raw -Path ($global:AppRootFolder + "\ReleaseNotes.md")
|
$fileContent = Get-Content -Raw -Path ($global:AppRootFolder + "\ReleaseNotes.md")
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -614,14 +665,6 @@ function Show-UpdatesDialog
|
|||||||
if($mystream) { $mystream.Dispose() }
|
if($mystream) { $mystream.Dispose() }
|
||||||
}
|
}
|
||||||
|
|
||||||
<#
|
|
||||||
$latest = Invoke-RestMethod "https://api.github.com/repos/Micke-K/IntuneManagement/releases/latest"
|
|
||||||
if($latest)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
#>
|
|
||||||
|
|
||||||
$content = Invoke-RestMethod "https://api.github.com/repos/Micke-K/IntuneManagement/contents/ReleaseNotes.md"
|
$content = Invoke-RestMethod "https://api.github.com/repos/Micke-K/IntuneManagement/contents/ReleaseNotes.md"
|
||||||
if($content)
|
if($content)
|
||||||
{
|
{
|
||||||
@@ -647,6 +690,102 @@ function Show-UpdatesDialog
|
|||||||
Show-ModalForm "Release Notes" $script:dlgUpdates -HideButtons
|
Show-ModalForm "Release Notes" $script:dlgUpdates -HideButtons
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Get-IsLatestVersion
|
||||||
|
{
|
||||||
|
if($global:MainAppStarted -ne $true)
|
||||||
|
{
|
||||||
|
$global:txtSplashText.Text = "Check for updates"
|
||||||
|
[System.Windows.Forms.Application]::DoEvents()
|
||||||
|
}
|
||||||
|
|
||||||
|
$gitHubVer = $null
|
||||||
|
|
||||||
|
$content = Invoke-RestMethod "https://api.github.com/repos/Micke-K/IntuneManagement/releases/latest"
|
||||||
|
if($content.Name)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$gitHubVer = [version]$content.Name
|
||||||
|
}
|
||||||
|
catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($null -eq $gitHubVer)
|
||||||
|
{
|
||||||
|
$content = Invoke-RestMethod "https://api.github.com/repos/Micke-K/IntuneManagement/contents/CloudAPIPowerShellManagement.psd1"
|
||||||
|
$gitHubText = [System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($content.content)))
|
||||||
|
$gitHubInfo = Get-ModuleDataTable $gitHubText
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$gitHubVer = [version]$gitHubInfo.ModuleVersion
|
||||||
|
}
|
||||||
|
catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(-not $gitHubVer)
|
||||||
|
{
|
||||||
|
Write-log "Failed to get version info in GitHub" 2
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
$LocalInfo = $null
|
||||||
|
$localVer = $null
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Import-LocalizedData -BindingVariable LocalInfo -BaseDirectory $global:AppRootFolder -FileName "CloudAPIPowerShellManagement.psd1" -ErrorAction Stop
|
||||||
|
$localVer = [version]$LocalInfo.ModuleVersion
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
|
||||||
|
if(-not $localVer)
|
||||||
|
{
|
||||||
|
Write-log "Failed to get version info from local file" 2
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if($localVer -lt $gitHubVer)
|
||||||
|
{
|
||||||
|
Write-Log "Local version and GitHub version does not match" 2
|
||||||
|
Write-Log "Local version: $($localVer.ToString())"
|
||||||
|
Write-Log "GitHub version: $($gitHubVer.ToString())"
|
||||||
|
[System.Windows.MessageBox]::Show("There is a new version available on GitHub $($gitHubVer.ToString())`n`nCurrent version is $($localVer.ToString())", "Old version!", "OK", "Warning")
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Write-Log "Running latest version: $($localVer.ToString())"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Get-ModuleDataTable
|
||||||
|
{
|
||||||
|
param($moduleText)
|
||||||
|
|
||||||
|
$result = $null
|
||||||
|
|
||||||
|
if(-not $moduleText) { return }
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$Path = [IO.path]::ChangeExtension([IO.Path]::GetTempFileName(), "psd1")
|
||||||
|
$FI = [io.FileInfo]$path
|
||||||
|
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
|
||||||
|
[System.IO.File]::WriteAllLines($FI.FullName, $moduleText, $Utf8NoBomEncoding)
|
||||||
|
$Result = $null
|
||||||
|
Import-LocalizedData -BindingVariable Result -BaseDirectory $FI.DirectoryName -FileName $fi.Name
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
try { [IO.File]::Delete(([IO.path]::ChangeExtension($FI.FullName, "tmp"))) } catch {}
|
||||||
|
try { $FI.Delete() } catch{}
|
||||||
|
}
|
||||||
|
|
||||||
|
$Result
|
||||||
|
}
|
||||||
|
|
||||||
function Show-InputDialog
|
function Show-InputDialog
|
||||||
{
|
{
|
||||||
param(
|
param(
|
||||||
@@ -654,7 +793,7 @@ function Show-InputDialog
|
|||||||
$FormText,
|
$FormText,
|
||||||
$DefaultValue)
|
$DefaultValue)
|
||||||
|
|
||||||
$script:inputBox = Get-XamlObject ($global:AppRootFolder + "\Xaml\InputDialog.xaml")
|
$script:inputBox = Initialize-Window ($global:AppRootFolder + "\Xaml\InputDialog.xaml")
|
||||||
if(-not $script:inputBox) { return }
|
if(-not $script:inputBox) { return }
|
||||||
|
|
||||||
$script:inputBox.Title = $FormTitle
|
$script:inputBox.Title = $FormTitle
|
||||||
@@ -672,6 +811,9 @@ function Show-InputDialog
|
|||||||
$script:txtValue.Focus();
|
$script:txtValue.Focus();
|
||||||
})
|
})
|
||||||
|
|
||||||
|
$inputBox.Owner = $global:window
|
||||||
|
$inputBox.Icon = $global:Window.Icon
|
||||||
|
|
||||||
$inputBox.ShowDialog() | Out-null
|
$inputBox.ShowDialog() | Out-null
|
||||||
|
|
||||||
return $script:txtValue.Text
|
return $script:txtValue.Text
|
||||||
@@ -1674,7 +1816,7 @@ function Show-SettingsForm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($section in $global:appSettingSections)
|
foreach($settingObj in $global:appSettingSections)
|
||||||
{
|
{
|
||||||
if(-not ($settingObj | Get-Member -MemberType NoteProperty -Name "Priority"))
|
if(-not ($settingObj | Get-Member -MemberType NoteProperty -Name "Priority"))
|
||||||
{
|
{
|
||||||
@@ -1738,7 +1880,15 @@ function Add-DefaultSettings
|
|||||||
Key = "PreviewFeatures"
|
Key = "PreviewFeatures"
|
||||||
Type = "Boolean"
|
Type = "Boolean"
|
||||||
DefaultValue = $false
|
DefaultValue = $false
|
||||||
Description = "Enable featurs that are marked as Preview. This might require a restart and prompt for consent"
|
Description = "Enable features that are marked as Preview. This might require a restart and prompt for consent"
|
||||||
|
}) "General"
|
||||||
|
|
||||||
|
Add-SettingsObject (New-Object PSObject -Property @{
|
||||||
|
Title = "Check for updates"
|
||||||
|
Key = "CheckForUpdates"
|
||||||
|
Type = "Boolean"
|
||||||
|
DefaultValue = $true
|
||||||
|
Description = "Check GitHub if there is a later version available"
|
||||||
}) "General"
|
}) "General"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1752,7 +1902,12 @@ function Add-SettingsObject
|
|||||||
Write-Log "Could not find section $section" 3
|
Write-Log "Could not find section $section" 3
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
$section.Values += $obj
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$section.Values += $obj
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
function Save-AllSettings
|
function Save-AllSettings
|
||||||
@@ -2187,6 +2342,7 @@ function Get-MainWindow
|
|||||||
})
|
})
|
||||||
$global:mnuViews.AddChild($subItem) | Out-Null
|
$global:mnuViews.AddChild($subItem) | Out-Null
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -2229,7 +2385,12 @@ function Get-JWTtoken
|
|||||||
{
|
{
|
||||||
param($token)
|
param($token)
|
||||||
|
|
||||||
if(-not $token -or -not $token.StartsWith("eyJ")) { Write-Log "Invalid token" 3; return }
|
if(-not $token) { return }
|
||||||
|
|
||||||
|
if(-not $token.StartsWith("eyJ"))
|
||||||
|
{
|
||||||
|
Write-Log "Invalid JWT token" 3; return
|
||||||
|
}
|
||||||
|
|
||||||
# First part is the header. Second part is the payload. Third part is the signature
|
# First part is the header. Second part is the payload. Third part is the signature
|
||||||
$arr = $token.Split(".")
|
$arr = $token.Split(".")
|
||||||
|
|||||||
@@ -413,6 +413,42 @@
|
|||||||
"DeviceRestrictions"
|
"DeviceRestrictions"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"ObjectType": "#microsoft.graph.aospDeviceOwnerEnterpriseWiFiConfiguration",
|
||||||
|
"PolicyType": "AOSPDeviceOwnerWiFi",
|
||||||
|
"PolicyTypeLanguageId": "wiFi",
|
||||||
|
"PlatformLanguageId": "AndroidAOSP",
|
||||||
|
"Categories": [
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ObjectType": "#microsoft.graph.aospDeviceOwnerTrustedRootCertificate",
|
||||||
|
"PolicyType": "AOSPDeviceOwnerTrustedCertificate",
|
||||||
|
"PolicyTypeLanguageId": "trustedCertificate",
|
||||||
|
"PlatformLanguageId": "AndroidAOSP",
|
||||||
|
"Categories": [
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ObjectType": "#microsoft.graph.aospDeviceOwnerPkcsCertificateProfile",
|
||||||
|
"PolicyType": "AOSPDeviceOwnerPKCS",
|
||||||
|
"PolicyTypeLanguageId": "pkcsCertificate",
|
||||||
|
"PlatformLanguageId": "AndroidAOSP",
|
||||||
|
"Categories": [
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ObjectType": "#microsoft.graph.aospDeviceOwnerScepCertificateProfile",
|
||||||
|
"PolicyType": "AOSPDeviceOwnerSCEP",
|
||||||
|
"PolicyTypeLanguageId": "scepCertificate",
|
||||||
|
"PlatformLanguageId": "AndroidAOSP",
|
||||||
|
"Categories": [
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"ObjectType": "#microsoft.graph.editionUpgradeConfiguration",
|
"ObjectType": "#microsoft.graph.editionUpgradeConfiguration",
|
||||||
"PolicyType": "WindowsEditionUpgrade",
|
"PolicyType": "WindowsEditionUpgrade",
|
||||||
@@ -1114,6 +1150,15 @@
|
|||||||
"Win10Wifi"
|
"Win10Wifi"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"ObjectType": "#microsoft.graph.windowsWiredNetworkConfiguration",
|
||||||
|
"PolicyType": "Windows10WiredNetwork",
|
||||||
|
"PolicyTypeLanguageId": "wiredNetwork",
|
||||||
|
"PlatformLanguageId": "Windows10",
|
||||||
|
"Categories": [
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"ObjectType": "#microsoft.graph.windowsWifiEnterpriseEAPConfiguration",
|
"ObjectType": "#microsoft.graph.windowsWifiEnterpriseEAPConfiguration",
|
||||||
"PolicyType": "Windows10WiFi",
|
"PolicyType": "Windows10WiFi",
|
||||||
@@ -1320,5 +1365,23 @@
|
|||||||
"Categories": [
|
"Categories": [
|
||||||
|
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ObjectType": "settingsCatalogLinux",
|
||||||
|
"PolicyType": "SettingsCatalogLinux",
|
||||||
|
"PolicyTypeLanguageId": "settingsCatalog",
|
||||||
|
"PlatformLanguageId": "Linux",
|
||||||
|
"Categories": [
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ObjectType": "settingsCatalogIOS",
|
||||||
|
"PolicyType": "SettingsCatalogIOS",
|
||||||
|
"PolicyTypeLanguageId": "settingsCatalog",
|
||||||
|
"PlatformLanguageId": "Ios",
|
||||||
|
"Categories": [
|
||||||
|
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
+7
-7
@@ -244,7 +244,7 @@
|
|||||||
"enabled": true
|
"enabled": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"entityKey": "frontCameras",
|
"entityKey": "frontCamera",
|
||||||
"booleanActions": 0,
|
"booleanActions": 0,
|
||||||
"defaultValue": "notConfigured",
|
"defaultValue": "notConfigured",
|
||||||
"unconfiguredValue": "notConfigured",
|
"unconfiguredValue": "notConfigured",
|
||||||
@@ -276,7 +276,7 @@
|
|||||||
"enabled": true
|
"enabled": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"entityKey": "rearCameras",
|
"entityKey": "rearCamera",
|
||||||
"booleanActions": 0,
|
"booleanActions": 0,
|
||||||
"defaultValue": "notConfigured",
|
"defaultValue": "notConfigured",
|
||||||
"unconfiguredValue": "notConfigured",
|
"unconfiguredValue": "notConfigured",
|
||||||
@@ -308,7 +308,7 @@
|
|||||||
"enabled": true
|
"enabled": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"entityKey": "infraredCameras",
|
"entityKey": "infraredCamera",
|
||||||
"booleanActions": 0,
|
"booleanActions": 0,
|
||||||
"defaultValue": "notConfigured",
|
"defaultValue": "notConfigured",
|
||||||
"unconfiguredValue": "notConfigured",
|
"unconfiguredValue": "notConfigured",
|
||||||
@@ -372,7 +372,7 @@
|
|||||||
"enabled": true
|
"enabled": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"entityKey": "microphones",
|
"entityKey": "microphone",
|
||||||
"booleanActions": 0,
|
"booleanActions": 0,
|
||||||
"defaultValue": "notConfigured",
|
"defaultValue": "notConfigured",
|
||||||
"unconfiguredValue": "notConfigured",
|
"unconfiguredValue": "notConfigured",
|
||||||
@@ -484,7 +484,7 @@
|
|||||||
"enabled": true
|
"enabled": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"entityKey": "wwan",
|
"entityKey": "wirelessWideAreaNetwork",
|
||||||
"booleanActions": 0,
|
"booleanActions": 0,
|
||||||
"defaultValue": "notConfigured",
|
"defaultValue": "notConfigured",
|
||||||
"unconfiguredValue": "notConfigured",
|
"unconfiguredValue": "notConfigured",
|
||||||
@@ -516,7 +516,7 @@
|
|||||||
"enabled": true
|
"enabled": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"entityKey": "nfc",
|
"entityKey": "nearFieldCommunication",
|
||||||
"booleanActions": 0,
|
"booleanActions": 0,
|
||||||
"defaultValue": "notConfigured",
|
"defaultValue": "notConfigured",
|
||||||
"unconfiguredValue": "notConfigured",
|
"unconfiguredValue": "notConfigured",
|
||||||
@@ -548,7 +548,7 @@
|
|||||||
"enabled": true
|
"enabled": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"entityKey": "wifi",
|
"entityKey": "wiFi",
|
||||||
"booleanActions": 0,
|
"booleanActions": 0,
|
||||||
"defaultValue": "notConfigured",
|
"defaultValue": "notConfigured",
|
||||||
"unconfiguredValue": "notConfigured",
|
"unconfiguredValue": "notConfigured",
|
||||||
|
|||||||
@@ -198,6 +198,32 @@
|
|||||||
"policyType": 9,
|
"policyType": 9,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dataType": 19,
|
||||||
|
"category": 41,
|
||||||
|
"nameResourceKey": "wiFiPolicyConnectAutomaticallyName",
|
||||||
|
"descriptionResourceKey": "wiFiPolicyConnectAutomaticallyDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "enableOption",
|
||||||
|
"value": true,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "disableOption",
|
||||||
|
"value": false,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "connectAutomatically",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"defaultValue": false,
|
||||||
|
"policyType": 9,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dataType": 19,
|
"dataType": 19,
|
||||||
"category": 41,
|
"category": 41,
|
||||||
|
|||||||
@@ -0,0 +1,471 @@
|
|||||||
|
{
|
||||||
|
"pkcs_aospdeviceownerpkcs": [
|
||||||
|
{
|
||||||
|
"dataType": 14,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "sCEPPolicyRenewalThresholdName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyRenewalThresholdDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "renewalThresholdPercentage",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"scaleOptions": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "days",
|
||||||
|
"value": "days",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "months",
|
||||||
|
"value": "months",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "years",
|
||||||
|
"value": "years",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"scaleEntityKey": "certificateValidityPeriodScale",
|
||||||
|
"defaultScale": "years",
|
||||||
|
"dataType": 22,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "sCEPPolicyCertificateValidityPeriodName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyCertificateValidityPeriodDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "certificateValidityPeriodValue",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "pKCSPolicyCertificationAuthorityName",
|
||||||
|
"descriptionResourceKey": "pKCSPolicyCertificationAuthorityNameDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "certificationAuthority",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"defaultValue": "",
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "pKCSPolicyCertificationAuthorityNameName",
|
||||||
|
"descriptionResourceKey": "pKCSPolicyCertificationAuthorityNameNameDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "certificationAuthorityName",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"defaultValue": "",
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "pKCSPolicyCertificateTemplateNameName",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "certificateTemplateName",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"defaultValue": "",
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 16,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "pKCSPolicyCertificationAuthorityType",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"emptyValueResourceKey": "1",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "MicrosoftCA",
|
||||||
|
"value": "Microsoft",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "DigiCertCA",
|
||||||
|
"value": "DigiCert",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "certificationAuthorityType",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 16,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "SCEPPolicyWindowsCertificateStoreName",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "SCEPPolicyWindowsCertificateStoreUser",
|
||||||
|
"value": "user",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"value": "custom",
|
||||||
|
"dataType": 9,
|
||||||
|
"category": 88,
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "subjectNameFormat",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "SCEPPolicySubjectNameFormatName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyCustomSubjectNameWithAadFormatDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "subjectNameFormatString",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"defaultValue": "CN={{UserName}},E={{EmailAddress}}",
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 16,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "attribute",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyEmailAddress",
|
||||||
|
"value": "emailAddress",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyUserPrincipalName",
|
||||||
|
"value": "userPrincipalName",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyDomainNameService",
|
||||||
|
"value": "domainNameService",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyUniversalResourceIdentifier",
|
||||||
|
"value": "universalResourceIdentifier",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "SCEPPolicyCustomAADAttribute",
|
||||||
|
"value": "customAzureADAttribute",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "sanType",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "value",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "name",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataType": 21,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "PolicySubjectAlternativeName",
|
||||||
|
"descriptionResourceKey": "PolicySubjectAlternativeNameDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "customSubjectAlternativeNames",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "SCEPPolicyWindowsCertificateStoreMachine",
|
||||||
|
"value": "machine",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"value": "custom",
|
||||||
|
"dataType": 9,
|
||||||
|
"category": 88,
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "subjectNameFormat",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "sCEPPolicySubjectNameFormatName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicySubjectNameFormatDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "subjectNameFormatString",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"defaultValue": "CN={{AAD_Device_ID}}",
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 16,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "attribute",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyEmailAddress",
|
||||||
|
"value": "emailAddress",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyUserPrincipalName",
|
||||||
|
"value": "userPrincipalName",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyDomainNameService",
|
||||||
|
"value": "domainNameService",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyUniversalResourceIdentifier",
|
||||||
|
"value": "universalResourceIdentifier",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "SCEPPolicyCustomAADAttribute",
|
||||||
|
"value": "customAzureADAttribute",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "sanType",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "value",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "name",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataType": 21,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "PolicySubjectAlternativeName",
|
||||||
|
"descriptionResourceKey": "PolicySubjectAlternativeNameDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "customSubjectAlternativeNames",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "certificateStore",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"defaultValue": "user",
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "eDPPolicyAppsListNameName",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "name",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "sCEPPolicyObjectIdentifierColumnName",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "objectIdentifier",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataType": 21,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "sCEPPolicyExtendedKeyUsageName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyExtendedKeyUsageDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "extendedKeyUsages",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"complexOptions": [
|
||||||
|
{
|
||||||
|
"dataType": 4,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "sCEPPolicySelectRootCertificateName",
|
||||||
|
"descriptionResourceKey": "SCEPPolicySelectRootCertificateName",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "rootCertificate",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"unconfiguredValue": "notConfigured",
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataType": 5,
|
||||||
|
"category": 88,
|
||||||
|
"nameResourceKey": "sCEPPolicySelectRootCertificateName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicySelectRootCertificateDescription",
|
||||||
|
"emptyValueResourceKey": "selectCertificate",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 121,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,612 @@
|
|||||||
|
{
|
||||||
|
"scepproperties_aospdeviceownerscep": [
|
||||||
|
{
|
||||||
|
"dataType": 16,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "SCEPPolicyWindowsCertificateStoreName",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "SCEPPolicyWindowsCertificateStoreUser",
|
||||||
|
"value": "user",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"value": "custom",
|
||||||
|
"dataType": 9,
|
||||||
|
"category": 96,
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "subjectNameFormat",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicySubjectNameFormatName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicySubjectNameFormatDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "subjectNameFormatString",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"defaultValue": "CN={{UserName}},E={{EmailAddress}}",
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 16,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "attribute",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyEmailAddress",
|
||||||
|
"value": "emailAddress",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyUserPrincipalName",
|
||||||
|
"value": "userPrincipalName",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyDomainNameService",
|
||||||
|
"value": "domainNameService",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyUniversalResourceIdentifier",
|
||||||
|
"value": "universalResourceIdentifier",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "sanType",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "value",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "name",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataType": 21,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "PolicySubjectAlternativeName",
|
||||||
|
"descriptionResourceKey": "PolicySubjectAlternativeNameDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "customSubjectAlternativeNames",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "SCEPPolicyWindowsCertificateStoreMachine",
|
||||||
|
"value": "machine",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"value": "custom",
|
||||||
|
"dataType": 9,
|
||||||
|
"category": 96,
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "subjectNameFormat",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicySubjectNameFormatName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicySubjectNameFormatDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "subjectNameFormatString",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"defaultValue": "CN={{AAD_Device_ID}}",
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 16,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "attribute",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyEmailAddress",
|
||||||
|
"value": "emailAddress",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyUserPrincipalName",
|
||||||
|
"value": "userPrincipalName",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyDomainNameService",
|
||||||
|
"value": "domainNameService",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyUniversalResourceIdentifier",
|
||||||
|
"value": "universalResourceIdentifier",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "sanType",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "value",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "name",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataType": 21,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "PolicySubjectAlternativeName",
|
||||||
|
"descriptionResourceKey": "PolicySubjectAlternativeNameDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "customSubjectAlternativeNames",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "certificateStore",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"defaultValue": "user",
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"scaleOptions": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "days",
|
||||||
|
"value": "days",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "months",
|
||||||
|
"value": "months",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "years",
|
||||||
|
"value": "years",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"scaleEntityKey": "certificateValidityPeriodScale",
|
||||||
|
"defaultScale": "years",
|
||||||
|
"dataType": 22,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicyCertificateValidityPeriodName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyCertificateValidityPeriodDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "certificateValidityPeriodValue",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 16,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicySubjectNameFormatName",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "notConfigured",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "sCEPPolicySubjectNameFormatCommonName",
|
||||||
|
"value": "commonName",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "sCEPPolicySubjectNameFormatCommonNameAndEmailAddress",
|
||||||
|
"value": "commonNameIncludingEmail",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "sCEPPolicySubjectNameFormatCommonNameAsEmail",
|
||||||
|
"value": "commonNameAsEmail",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "sCEPPolicySubjectNameFormatCommonNameAsIMEI",
|
||||||
|
"value": "commonNameAsIMEI",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "sCEPPolicySubjectNameFormatCommonNameAsSerialNumber",
|
||||||
|
"value": "commonNameAsSerialNumber",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "sCEPPolicySubjectNameFormatCustom",
|
||||||
|
"value": "custom",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicySubjectNameFormatCustom",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyCustomSubjectNameWithAadFormatDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "subjectNameFormatString",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"defaultValue": "CN={{UserName}},E={{EmailAddress}}",
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "subjectNameFormat",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 13,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "PolicySubjectAlternativeName",
|
||||||
|
"descriptionResourceKey": "PolicySubjectAlternativeNameDescription",
|
||||||
|
"emptyValueResourceKey": "notConfigured",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyEmailAddress",
|
||||||
|
"value": "emailAddress",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "PolicyUserPrincipalName",
|
||||||
|
"value": "userPrincipalName",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "subjectAlternativeNameType",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 13,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicyKeyUsageName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyKeyUsageDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "sCEPPolicyUseAsDigitialSignature",
|
||||||
|
"value": "digitalSignature",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "sCEPPolicyUseForKeyEncipherment",
|
||||||
|
"value": "keyEncipherment",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "keyUsage",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 16,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicyKeySizeName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyKeySizeDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "notConfigured",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "",
|
||||||
|
"displayText": "1024",
|
||||||
|
"value": "size1024",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "",
|
||||||
|
"displayText": "2048",
|
||||||
|
"value": "size2048",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "keySize",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 13,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicyHashAlgorithmName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyHashAlgorithmDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"nameResourceKey": "sCEPPPolicySHA1",
|
||||||
|
"value": "sha1",
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nameResourceKey": "sCEPPPolicySHA2",
|
||||||
|
"value": "sha2",
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"entityKey": "hashAlgorithm",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"complexOptions": [
|
||||||
|
{
|
||||||
|
"dataType": 4,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicySelectRootCertificateName",
|
||||||
|
"descriptionResourceKey": "SCEPPolicySelectRootCertificateName",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "rootCertificate",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"unconfiguredValue": "notConfigured",
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataType": 5,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicySelectRootCertificateName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicySelectRootCertificateDescription",
|
||||||
|
"emptyValueResourceKey": "selectCertificate",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "eDPPolicyAppsListNameName",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "name",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicyObjectIdentifierColumnName",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "objectIdentifier",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataType": 21,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicyExtendedKeyUsageName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyExtendedKeyUsageDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "extendedKeyUsages",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isSettingDescription": false,
|
||||||
|
"showAsSectionHeader": false,
|
||||||
|
"dataType": 8,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "enrollmentSettingsHeading",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dataType": 14,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicyRenewalThresholdName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyRenewalThresholdDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "renewalThresholdPercentage",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"dataType": 20,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicyServerURLName",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"emptyValueResourceKey": "sCEPPolicyServerURLSExample",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "sCEPPolicyServerURLName",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dataType": 21,
|
||||||
|
"category": 96,
|
||||||
|
"nameResourceKey": "sCEPPolicyServerURLSName",
|
||||||
|
"descriptionResourceKey": "sCEPPolicyServerURLSDescription",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "scepServerUrls",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 122,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -31,57 +31,57 @@
|
|||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "Never timeout",
|
"nameResourceKey": "timeoutNever",
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "1 minute",
|
"nameResourceKey": "timeoutOneMinute",
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "2 minutes",
|
"nameResourceKey": "timeoutTwoMinutes",
|
||||||
"value": 2,
|
"value": 2,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "3 minutes",
|
"nameResourceKey": "timeoutThreeMinutes",
|
||||||
"value": 3,
|
"value": 3,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "5 minutes",
|
"nameResourceKey": "timeoutFiveMinutes",
|
||||||
"value": 5,
|
"value": 5,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "10 minutes",
|
"nameResourceKey": "timeoutTenMinutes",
|
||||||
"value": 10,
|
"value": 10,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "15 minutes",
|
"nameResourceKey": "timeoutFifteenMinutes",
|
||||||
"value": 15,
|
"value": 15,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "30 minutes",
|
"nameResourceKey": "timeoutThirtyMinutes",
|
||||||
"value": 30,
|
"value": 30,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "1 hour",
|
"nameResourceKey": "timeoutOneHour",
|
||||||
"value": 60,
|
"value": 60,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "2 hours",
|
"nameResourceKey": "timeoutTwoHours",
|
||||||
"value": 120,
|
"value": 120,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "4 hours",
|
"nameResourceKey": "timeoutFourHours",
|
||||||
"value": 240,
|
"value": 240,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
}
|
}
|
||||||
@@ -105,57 +105,57 @@
|
|||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "Never timeout",
|
"nameResourceKey": "timeoutNever",
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "1 minute",
|
"nameResourceKey": "timeoutOneMinute",
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "2 minutes",
|
"nameResourceKey": "timeoutTwoMinutes",
|
||||||
"value": 2,
|
"value": 2,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "3 minutes",
|
"nameResourceKey": "timeoutThreeMinutes",
|
||||||
"value": 3,
|
"value": 3,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "5 minutes",
|
"nameResourceKey": "timeoutFiveMinutes",
|
||||||
"value": 5,
|
"value": 5,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "10 minutes",
|
"nameResourceKey": "timeoutTenMinutes",
|
||||||
"value": 10,
|
"value": 10,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "15 minutes",
|
"nameResourceKey": "timeoutFifteenMinutes",
|
||||||
"value": 15,
|
"value": 15,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "30 minutes",
|
"nameResourceKey": "timeoutThirtyMinutes",
|
||||||
"value": 30,
|
"value": 30,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "1 hour",
|
"nameResourceKey": "timeoutOneHour",
|
||||||
"value": 60,
|
"value": 60,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "2 hours",
|
"nameResourceKey": "timeoutTwoHours",
|
||||||
"value": 120,
|
"value": 120,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "4 hours",
|
"nameResourceKey": "timeoutFourHours",
|
||||||
"value": 240,
|
"value": 240,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
}
|
}
|
||||||
@@ -179,57 +179,57 @@
|
|||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "Never timeout",
|
"nameResourceKey": "timeoutNever",
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "1 minute",
|
"nameResourceKey": "timeoutOneMinute",
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "2 minutes",
|
"nameResourceKey": "timeoutTwoMinutes",
|
||||||
"value": 2,
|
"value": 2,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "3 minutes",
|
"nameResourceKey": "timeoutThreeMinutes",
|
||||||
"value": 3,
|
"value": 3,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "5 minutes",
|
"nameResourceKey": "timeoutFiveMinutes",
|
||||||
"value": 5,
|
"value": 5,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "10 minutes",
|
"nameResourceKey": "timeoutTenMinutes",
|
||||||
"value": 10,
|
"value": 10,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "15 minutes",
|
"nameResourceKey": "timeoutFifteenMinutes",
|
||||||
"value": 15,
|
"value": 15,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "30 minutes",
|
"nameResourceKey": "timeoutThirtyMinutes",
|
||||||
"value": 30,
|
"value": 30,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "1 hour",
|
"nameResourceKey": "timeoutOneHour",
|
||||||
"value": 60,
|
"value": 60,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "2 hours",
|
"nameResourceKey": "timeoutTwoHours",
|
||||||
"value": 120,
|
"value": 120,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"displayText": "4 hours",
|
"nameResourceKey": "timeoutFourHours",
|
||||||
"value": 240,
|
"value": 240,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"trustedcert_aospdeviceownertrustedcertificate": {
|
||||||
|
"dataEntityKey": "trustedRootCertificate",
|
||||||
|
"filenameEntityKey": "certFileName",
|
||||||
|
"dataType": 1,
|
||||||
|
"category": 108,
|
||||||
|
"nameResourceKey": "trustedCertPolicySelectCertificateName",
|
||||||
|
"descriptionResourceKey": "empty",
|
||||||
|
"childSettings": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"options": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"entityKey": "trustedRootCertificate",
|
||||||
|
"booleanActions": 0,
|
||||||
|
"policyType": 123,
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -167,7 +167,7 @@
|
|||||||
"dataType": 20,
|
"dataType": 20,
|
||||||
"category": 121,
|
"category": 121,
|
||||||
"nameResourceKey": "domainsInList",
|
"nameResourceKey": "domainsInList",
|
||||||
"descriptionResourceKey": "empty",
|
"descriptionResourceKey": "searchDomainsDescriptionWithHint",
|
||||||
"emptyValueResourceKey": "vPNPolicyTrustedNetworkDomainExample",
|
"emptyValueResourceKey": "vPNPolicyTrustedNetworkDomainExample",
|
||||||
"childSettings": [
|
"childSettings": [
|
||||||
|
|
||||||
@@ -350,7 +350,7 @@
|
|||||||
"dataType": 20,
|
"dataType": 20,
|
||||||
"category": 121,
|
"category": 121,
|
||||||
"nameResourceKey": "domainsInList",
|
"nameResourceKey": "domainsInList",
|
||||||
"descriptionResourceKey": "empty",
|
"descriptionResourceKey": "searchDomainsDescription",
|
||||||
"emptyValueResourceKey": "vPNPolicyTrustedNetworkDomainExample",
|
"emptyValueResourceKey": "vPNPolicyTrustedNetworkDomainExample",
|
||||||
"childSettings": [
|
"childSettings": [
|
||||||
|
|
||||||
@@ -474,7 +474,7 @@
|
|||||||
"dataType": 20,
|
"dataType": 20,
|
||||||
"category": 121,
|
"category": 121,
|
||||||
"nameResourceKey": "domainsOptional",
|
"nameResourceKey": "domainsOptional",
|
||||||
"descriptionResourceKey": "empty",
|
"descriptionResourceKey": "connectIfNeededDomainsDescription",
|
||||||
"emptyValueResourceKey": "vPNPolicyTrustedNetworkDomainExample",
|
"emptyValueResourceKey": "vPNPolicyTrustedNetworkDomainExample",
|
||||||
"childSettings": [
|
"childSettings": [
|
||||||
|
|
||||||
@@ -508,8 +508,8 @@
|
|||||||
"metadata": {
|
"metadata": {
|
||||||
"dataType": 20,
|
"dataType": 20,
|
||||||
"category": 121,
|
"category": 121,
|
||||||
"nameResourceKey": "dNSSearchDomainsName",
|
"nameResourceKey": "anyDNSAddressesInList",
|
||||||
"descriptionResourceKey": "empty",
|
"descriptionResourceKey": "connectIfNeededDNSListDescription",
|
||||||
"emptyValueResourceKey": "proxyAddressExample",
|
"emptyValueResourceKey": "proxyAddressExample",
|
||||||
"childSettings": [
|
"childSettings": [
|
||||||
|
|
||||||
@@ -540,7 +540,7 @@
|
|||||||
{
|
{
|
||||||
"dataType": 20,
|
"dataType": 20,
|
||||||
"category": 121,
|
"category": 121,
|
||||||
"nameResourceKey": "probeUrlOptionalDescription",
|
"nameResourceKey": "probeUrlOptionalName",
|
||||||
"descriptionResourceKey": "probeUrlOptionalDescription",
|
"descriptionResourceKey": "probeUrlOptionalDescription",
|
||||||
"emptyValueResourceKey": "probeUrlOptionalExample",
|
"emptyValueResourceKey": "probeUrlOptionalExample",
|
||||||
"childSettings": [
|
"childSettings": [
|
||||||
@@ -695,7 +695,7 @@
|
|||||||
"dataType": 20,
|
"dataType": 20,
|
||||||
"category": 121,
|
"category": 121,
|
||||||
"nameResourceKey": "domainsInList",
|
"nameResourceKey": "domainsInList",
|
||||||
"descriptionResourceKey": "empty",
|
"descriptionResourceKey": "searchDomainsDescription",
|
||||||
"emptyValueResourceKey": "vPNPolicyTrustedNetworkDomainExample",
|
"emptyValueResourceKey": "vPNPolicyTrustedNetworkDomainExample",
|
||||||
"childSettings": [
|
"childSettings": [
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+4655
-3911
File diff suppressed because it is too large
Load Diff
+259
-40
@@ -20,11 +20,13 @@ $global:documentationProviders = @()
|
|||||||
|
|
||||||
function Get-ModuleVersion
|
function Get-ModuleVersion
|
||||||
{
|
{
|
||||||
'1.1.0'
|
'1.2.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
function Invoke-InitializeModule
|
function Invoke-InitializeModule
|
||||||
{
|
{
|
||||||
|
$script:alwaysUseMigTableForTranslation = $false
|
||||||
|
|
||||||
# Make sure we add the default Output types
|
# Make sure we add the default Output types
|
||||||
Add-OutputType
|
Add-OutputType
|
||||||
|
|
||||||
@@ -43,14 +45,20 @@ function Invoke-InitializeModule
|
|||||||
Schedule="ScheduledAction.List.schedule"
|
Schedule="ScheduledAction.List.schedule"
|
||||||
MessageTemplate="ScheduledAction.Notification.messageTemplate"
|
MessageTemplate="ScheduledAction.Notification.messageTemplate"
|
||||||
EmailCC="ScheduledAction.Notification.additionalRecipients"
|
EmailCC="ScheduledAction.Notification.additionalRecipients"
|
||||||
Filter="AssignmentFilters.assignmentFilterColumnHeader"
|
|
||||||
Rule="ApplicabilityRules.GridLabel.Rule"
|
Rule="ApplicabilityRules.GridLabel.Rule"
|
||||||
ValueWithLabel="TableHeaders.value"
|
ValueWithLabel="TableHeaders.value"
|
||||||
Status="TableHeaders.status"
|
Status="TableHeaders.status"
|
||||||
CombinedValueWithLabel="TableHeaders.value"
|
CombinedValueWithLabel="TableHeaders.value"
|
||||||
CombinedValue="TableHeaders.value"
|
CombinedValue="TableHeaders.value"
|
||||||
useDeviceLicensing="TableHeaders.licenseType"
|
useDeviceLicensing="TableHeaders.licenseType"
|
||||||
#filterMode="Filter mode" # Not in any string file yet
|
Filter="AppResources.AppSettingsUx.assignmentFilterColumnHeader"
|
||||||
|
filterMode="AppResources.AppSettingsUx.assignmentFilterTypeColumnHeader"
|
||||||
|
deliveryOptimizationPriority="AppResources.AppSettingsUx.deliveryOptimizationPriorityHeader"
|
||||||
|
startTimeColumnLabel="AppResources.AppSettingsUx.startTimeColumnLabel"
|
||||||
|
installTimeSettings="AppResources.AppSettingsUx.deadlineTimeColumnLabel"
|
||||||
|
restartSettings="AppResources.AppSettingsUx.restartGracePeriodHeader"
|
||||||
|
notifications="AppResources.AppSettingsUx.assignmentToast"
|
||||||
|
Settings="TableHeaders.settings"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,7 +207,7 @@ function Get-ObjectDocumentation
|
|||||||
$status = $null
|
$status = $null
|
||||||
$inputType = "Settings"
|
$inputType = "Settings"
|
||||||
|
|
||||||
if(-not $script:scopeTags)
|
if(-not $script:scopeTags -and $script:offlineDocumentation -ne $true)
|
||||||
{
|
{
|
||||||
$script:scopeTags = (Invoke-GraphRequest -Url "/deviceManagement/roleScopeTags").Value
|
$script:scopeTags = (Invoke-GraphRequest -Url "/deviceManagement/roleScopeTags").Value
|
||||||
}
|
}
|
||||||
@@ -587,19 +595,68 @@ function Add-BasicAdditionalValues
|
|||||||
|
|
||||||
if($obj.createdDateTime)
|
if($obj.createdDateTime)
|
||||||
{
|
{
|
||||||
$tmpDate = ([DateTime]::Parse($obj.createdDateTime))
|
try
|
||||||
Add-BasicPropertyValue (Get-LanguageString "Inputs.createdDateTime") "$($tmpDate.ToLongDateString()) $($tmpDate.ToLongTimeString())"
|
{
|
||||||
|
if($obj.createdDateTime -is [DateTime])
|
||||||
|
{
|
||||||
|
$tmpDate = $obj.createdDateTime
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$tmpDate = ([DateTime]::Parse($obj.createdDateTime))
|
||||||
|
}
|
||||||
|
$tmpDateStr = "$($tmpDate.ToLongDateString()) $($tmpDate.ToLongTimeString())"
|
||||||
|
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Write-Log "Failed to parse date from $($obj.createdDateTime) (Object type: $($obj.createdDateTime.GetType().Name))" 2
|
||||||
|
$tmpDateStr = $obj.createdDateTime
|
||||||
|
}
|
||||||
|
Add-BasicPropertyValue (Get-LanguageString "Inputs.createdDateTime") $tmpDateStr
|
||||||
}
|
}
|
||||||
|
|
||||||
if($obj.lastModifiedDateTime)
|
if($obj.lastModifiedDateTime)
|
||||||
{
|
{
|
||||||
$tmpDate = ([DateTime]::Parse($obj.lastModifiedDateTime))
|
try
|
||||||
Add-BasicPropertyValue (Get-LanguageString "TableHeaders.lastModified") "$($tmpDate.ToLongDateString()) $($tmpDate.ToLongTimeString())"
|
{
|
||||||
|
if($obj.lastModifiedDateTime -is [DateTime])
|
||||||
|
{
|
||||||
|
$tmpDate = $obj.lastModifiedDateTime
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$tmpDate = ([DateTime]::Parse($obj.lastModifiedDateTime))
|
||||||
|
}
|
||||||
|
$tmpDateStr = "$($tmpDate.ToLongDateString()) $($tmpDate.ToLongTimeString())"
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Write-Log "Failed to parse date from $($obj.lastModifiedDateTime) (Object type: $($obj.lastModifiedDateTime.GetType().Name))" 2
|
||||||
|
$tmpDateStr = $obj.lastModifiedDateTime
|
||||||
|
}
|
||||||
|
Add-BasicPropertyValue (Get-LanguageString "TableHeaders.lastModified") $tmpDateStr
|
||||||
}
|
}
|
||||||
elseif($obj.modifiedDateTime)
|
elseif($obj.modifiedDateTime)
|
||||||
{
|
{
|
||||||
$tmpDate = ([DateTime]::Parse($obj.modifiedDateTime))
|
try
|
||||||
Add-BasicPropertyValue (Get-LanguageString "TableHeaders.lastModified") "$($tmpDate.ToLongDateString()) $($tmpDate.ToLongTimeString())"
|
{
|
||||||
|
if($obj.modifiedDateTime -is [DateTime])
|
||||||
|
{
|
||||||
|
$tmpDate = $obj.modifiedDateTime
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$tmpDate = ([DateTime]::Parse($obj.modifiedDateTime))
|
||||||
|
}
|
||||||
|
$tmpDateStr = "$($tmpDate.ToLongDateString()) $($tmpDate.ToLongTimeString())"
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Write-Log "Failed to parse date from $($obj.modifiedDateTime) (Object type: $($obj.modifiedDateTime.GetType().Name))" 2
|
||||||
|
$tmpDateStr = $obj.modifiedDateTime
|
||||||
|
}
|
||||||
|
Add-BasicPropertyValue (Get-LanguageString "TableHeaders.lastModified") $tmpDateStr
|
||||||
}
|
}
|
||||||
|
|
||||||
if($obj.version)
|
if($obj.version)
|
||||||
@@ -1829,7 +1886,11 @@ function Invoke-TranslateSection
|
|||||||
$useParentProp = $true
|
$useParentProp = $true
|
||||||
# Use $script:currentObject since $obj could be a property on the original object
|
# Use $script:currentObject since $obj could be a property on the original object
|
||||||
# Cert links are always specified on the main object
|
# Cert links are always specified on the main object
|
||||||
$cert = Invoke-GraphRequest -URL $script:currentObject."$($prop.entityKey)@odata.navigationLink" -ODataMetadata "minimal" -NoError
|
$cert = $null
|
||||||
|
if($script:offlineDocumentation -ne $true)
|
||||||
|
{
|
||||||
|
$cert = Invoke-GraphRequest -URL $script:currentObject."$($prop.entityKey)@odata.navigationLink" -ODataMetadata "minimal" -NoError
|
||||||
|
}
|
||||||
if($cert)
|
if($cert)
|
||||||
{
|
{
|
||||||
if($cert.value -is [Object[]])
|
if($cert.value -is [Object[]])
|
||||||
@@ -1849,7 +1910,22 @@ function Invoke-TranslateSection
|
|||||||
}
|
}
|
||||||
elseif($script:currentObject.'@ObjectFromFile' -eq $true)
|
elseif($script:currentObject.'@ObjectFromFile' -eq $true)
|
||||||
{
|
{
|
||||||
$value = "##TBD - Linked Certificate"
|
if($script:currentObject."#CustomRef_$($prop.entityKey)")
|
||||||
|
{
|
||||||
|
$idx = $script:currentObject."#CustomRef_$($prop.entityKey)".IndexOf("|:|")
|
||||||
|
if($idx -gt -1)
|
||||||
|
{
|
||||||
|
$value = $script:currentObject."#CustomRef_$($prop.entityKey)".SubString(0,$idx)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$value = $script:currentObject."#CustomRef_$($prop.entityKey)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$value = "##TBD - Linked Certificate"
|
||||||
|
}
|
||||||
$rawValue = $value
|
$rawValue = $value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2242,6 +2318,17 @@ function Get-CustomChildObject
|
|||||||
return $obj
|
return $obj
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Invoke-InitDocumentation
|
||||||
|
{
|
||||||
|
foreach($docProvider in ($global:documentationProviders | Sort -Property Priority))
|
||||||
|
{
|
||||||
|
if($docProvider.InitializeDocumentation)
|
||||||
|
{
|
||||||
|
& $docProvider.InitializeDocumentation
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Add-CustomProfileProperties
|
function Add-CustomProfileProperties
|
||||||
{
|
{
|
||||||
param($obj)
|
param($obj)
|
||||||
@@ -2900,7 +2987,7 @@ function Invoke-TranslateAssignments
|
|||||||
|
|
||||||
$groupInfo = $null
|
$groupInfo = $null
|
||||||
|
|
||||||
if($groupIds.Count -gt 0)
|
if($groupIds.Count -gt 0 -and $script:offlineDocumentation -ne $true)
|
||||||
{
|
{
|
||||||
$ht = @{}
|
$ht = @{}
|
||||||
$ht.Add("ids", @($groupIds | Unique))
|
$ht.Add("ids", @($groupIds | Unique))
|
||||||
@@ -2918,21 +3005,35 @@ function Invoke-TranslateAssignments
|
|||||||
|
|
||||||
if($filterIds.Count -gt 0)
|
if($filterIds.Count -gt 0)
|
||||||
{
|
{
|
||||||
$batchInfo = @{}
|
if($script:offlineDocumentation -eq $true)
|
||||||
$requests = @()
|
|
||||||
#{"requests":[{"id":"<FilterID>","method":"GET","url":"deviceManagement/assignmentFilters/<FilterID>?$select=displayName"}]}
|
|
||||||
foreach($filterId in $filterIds)
|
|
||||||
{
|
{
|
||||||
$requests += [PSCustomObject]@{
|
if($script:offlineObjects["AssignmentFilters"])
|
||||||
id = $filterIds
|
{
|
||||||
method = "GET"
|
$filtersInfo = $script:offlineObjects["AssignmentFilters"] | Where { $_.Id -in $filterIds }
|
||||||
"url" = "deviceManagement/assignmentFilters/$($filterId)?`$select=displayName"
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Write-Log "No assignment filters loaded for Offline documentation. Check export folder" 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$batchInfo = @{"requests"=$requests}
|
else
|
||||||
$jsonBody = $batchInfo | ConvertTo-Json
|
{
|
||||||
|
$batchInfo = @{}
|
||||||
|
$requests = @()
|
||||||
|
#{"requests":[{"id":"<FilterID>","method":"GET","url":"deviceManagement/assignmentFilters/<FilterID>?$select=displayName"}]}
|
||||||
|
foreach($filterId in $filterIds)
|
||||||
|
{
|
||||||
|
$requests += [PSCustomObject]@{
|
||||||
|
id = $filterId
|
||||||
|
method = "GET"
|
||||||
|
"url" = "deviceManagement/assignmentFilters/$($filterId)?`$select=displayName"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$batchInfo = @{"requests"=$requests}
|
||||||
|
$jsonBody = $batchInfo | ConvertTo-Json
|
||||||
|
|
||||||
$filtersInfo = Invoke-GraphRequest -Url "/`$batch" -Content $jsonBody -Method "Post"
|
$filtersInfo = (Invoke-GraphRequest -Url "/`$batch" -Content $jsonBody -Method "Post").responses.body
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($assignment in $obj.assignments)
|
foreach($assignment in $obj.assignments)
|
||||||
@@ -2987,12 +3088,12 @@ function Invoke-TranslateAssignments
|
|||||||
$filterName = $noFilter
|
$filterName = $noFilter
|
||||||
$filterMode = $noFilter
|
$filterMode = $noFilter
|
||||||
|
|
||||||
if($assignment.target.deviceAndAppManagementAssignmentFilterId -and $filtersInfo.responses)
|
if($assignment.target.deviceAndAppManagementAssignmentFilterId -and $filtersInfo)
|
||||||
{
|
{
|
||||||
$filtersObj = $filtersInfo.responses | Where Id -eq $assignment.target.deviceAndAppManagementAssignmentFilterId
|
$filtersObj = $filtersInfo | Where Id -eq $assignment.target.deviceAndAppManagementAssignmentFilterId
|
||||||
if($filtersObj.body.displayName)
|
if($filtersObj.displayName)
|
||||||
{
|
{
|
||||||
$filterName = $filtersObj.body.displayName
|
$filterName = $filtersObj.displayName
|
||||||
}
|
}
|
||||||
|
|
||||||
if($assignment.target.deviceAndAppManagementAssignmentFilterType -eq "include")
|
if($assignment.target.deviceAndAppManagementAssignmentFilterType -eq "include")
|
||||||
@@ -3037,6 +3138,66 @@ function Invoke-TranslateAssignments
|
|||||||
$value = Get-LanguageString "SettingDetails.licenseTypeUser"
|
$value = Get-LanguageString "SettingDetails.licenseTypeUser"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
elseif($settingProp -eq "restartSettings" -and $null -eq $assignment.settings.$settingProp)
|
||||||
|
{
|
||||||
|
$value = Get-LanguageString "SettingDetails.disabledOption"
|
||||||
|
}
|
||||||
|
elseif($settingProp -eq "notifications")
|
||||||
|
{
|
||||||
|
$value = ?? (Get-LanguageString "AppResources.AssignmentToast.$($assignment.settings.$settingProp)") $assignment.settings.$settingProp
|
||||||
|
}
|
||||||
|
elseif($settingProp -eq "installTimeSettings")
|
||||||
|
{
|
||||||
|
$asap = Get-LanguageString "Assignment.SoftwareInstallationTime.defaultTime"
|
||||||
|
$startValue = $asap
|
||||||
|
$value = $asap
|
||||||
|
|
||||||
|
if($assignment.settings.installTimeSettings)
|
||||||
|
{
|
||||||
|
if($assignment.settings.installTimeSettings.startDateTime)
|
||||||
|
{
|
||||||
|
$instTime = Get-Date $assignment.settings.installTimeSettings.startDateTime
|
||||||
|
|
||||||
|
if($assignment.settings.installTimeSettings.useLocalTime -eq $false)
|
||||||
|
{
|
||||||
|
$hours = ($instTime.ToUniversalTime() - $instTime).Hours
|
||||||
|
$instTime = $instTime.AddHours($hours)
|
||||||
|
}
|
||||||
|
$startValue = "$($instTime.ToShortDateString()) $($instTime.ToShortTimeString())"
|
||||||
|
}
|
||||||
|
|
||||||
|
if($assignment.settings.installTimeSettings.deadlineDateTime)
|
||||||
|
{
|
||||||
|
$endTime = Get-Date $assignment.settings.installTimeSettings.deadlineDateTime
|
||||||
|
|
||||||
|
if($assignment.settings.installTimeSettings.useLocalTime -eq $false)
|
||||||
|
{
|
||||||
|
$hours = ($endTime.ToUniversalTime() - $endTime).Hours
|
||||||
|
$endTime = $endTime.AddHours($hours)
|
||||||
|
}
|
||||||
|
$value = "$($instTime.ToShortDateString()) $($instTime.ToShortTimeString())"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$assignmentSettingProps.Add("startTimeColumnLabel", $startValue)
|
||||||
|
}
|
||||||
|
elseif($settingProp -eq "deliveryOptimizationPriority")
|
||||||
|
{
|
||||||
|
$tmpStr = Get-LanguageString "AppResources.DeliveryOptimizationPriority.displayText"
|
||||||
|
if($assignment.settings.$settingProp -ne "foreground")
|
||||||
|
{
|
||||||
|
$tmpType = Get-LanguageString "AppResources.DeliveryOptimizationPriority.backgroundNormal"
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$tmpType = Get-LanguageString "AppResources.DeliveryOptimizationPriority.foreground"
|
||||||
|
}
|
||||||
|
$value = $tmpStr -f $tmpType
|
||||||
|
}
|
||||||
|
elseif($assignment.settings.$settingProp -eq "notConfigured")
|
||||||
|
{
|
||||||
|
$value = Get-LanguageString "BooleanActions.notConfigured"
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$value = $assignment.settings.$settingProp
|
$value = $assignment.settings.$settingProp
|
||||||
@@ -3389,6 +3550,9 @@ function Show-DocumentationForm
|
|||||||
|
|
||||||
$txtDocumentationRawData.Text = ""
|
$txtDocumentationRawData.Text = ""
|
||||||
|
|
||||||
|
$script:offlineDocumentation = $false
|
||||||
|
$script:offlineObjects = @{}
|
||||||
|
|
||||||
$loadExportedInfo = $true
|
$loadExportedInfo = $true
|
||||||
$script:migTable = $null
|
$script:migTable = $null
|
||||||
$script:scopeTags = $null
|
$script:scopeTags = $null
|
||||||
@@ -3421,6 +3585,8 @@ function Show-DocumentationForm
|
|||||||
|
|
||||||
Get-CustomIgnoredCategories $obj
|
Get-CustomIgnoredCategories $obj
|
||||||
|
|
||||||
|
Invoke-InitDocumentation
|
||||||
|
|
||||||
if($global:grdDocumentObjects.Tag -eq "Objects")
|
if($global:grdDocumentObjects.Tag -eq "Objects")
|
||||||
{
|
{
|
||||||
$sourceList = @()
|
$sourceList = @()
|
||||||
@@ -3532,20 +3698,19 @@ function Show-DocumentationForm
|
|||||||
$script:migTable = ConvertFrom-Json (Get-Content $migFileName -Raw)
|
$script:migTable = ConvertFrom-Json (Get-Content $migFileName -Raw)
|
||||||
}
|
}
|
||||||
|
|
||||||
$scopeTagObjectType = $global:currentViewObject.ViewItems | Where Id -eq "ScopeTags"
|
if($script:migTable.TenantId -and $script:migTable.TenantId -ne $global:organization.id)
|
||||||
|
|
||||||
if($scopeTagObjectType)
|
|
||||||
{
|
{
|
||||||
$scopePath = [IO.Path]::Combine($diSource.FullName,$scopeTagObjectType.Id)
|
$script:offlineDocumentation = $true
|
||||||
if([IO.Directory]::Exists($scopePath) -eq $false)
|
}
|
||||||
{
|
|
||||||
Write-Log "Object path for Scope (Tags) ($($scopePath)) not found" 2
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
$scopeTagObjects = Get-GraphFileObjects $scopePath -ObjectType $scopeTagObjectType
|
if($script:offlineDocumentation -eq $true)
|
||||||
$script:scopeTags = @(($scopeTagObjects | Select Object))
|
{
|
||||||
|
Add-DocOfflineDependecies "ScopeTags" $diSource.FullName
|
||||||
|
Add-DocOfflineDependecies "AssignmentFilters" $diSource.FullName
|
||||||
|
Add-DocOfflineObjectTypeDependecies $diSource.FullName
|
||||||
|
if($script:offlineObjects.ContainsKey("ScopeTags"))
|
||||||
|
{
|
||||||
|
$script:scopeTags = @($script:offlineObjects["ScopeTags"])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3746,6 +3911,12 @@ function Show-DocumentationForm
|
|||||||
& $global:cbDocumentationType.SelectedItem.PostProcess
|
& $global:cbDocumentationType.SelectedItem.PostProcess
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($script:offlineDocumentation -eq $true)
|
||||||
|
{
|
||||||
|
# Clear the dependecy objects loaded for Offline documentation
|
||||||
|
$global:LoadedDependencyObjects = $null
|
||||||
|
}
|
||||||
|
$script:offlineDocumentation = $false
|
||||||
Write-Status ""
|
Write-Status ""
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3797,6 +3968,18 @@ function Show-DocumentationForm
|
|||||||
Show-ModalForm "Intune Documentation" $script:docForm -HideButtons
|
Show-ModalForm "Intune Documentation" $script:docForm -HideButtons
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Get-DocOfflineObjects
|
||||||
|
{
|
||||||
|
param($objectName)
|
||||||
|
|
||||||
|
if($script:offlineDocumentation -eq $false) { return }
|
||||||
|
|
||||||
|
if($script:offlineObjects.ContainsKey($objectName))
|
||||||
|
{
|
||||||
|
$script:offlineObjects[$objectName]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Set-OutputOptionsTabStatus
|
function Set-OutputOptionsTabStatus
|
||||||
{
|
{
|
||||||
param($control)
|
param($control)
|
||||||
@@ -3828,6 +4011,42 @@ function Invoke-DocumentSelectedObjects
|
|||||||
Show-DocumentationForm -objects $script:selectedObjects -SelectedDocuments
|
Show-DocumentationForm -objects $script:selectedObjects -SelectedDocuments
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Add-DocOfflineObjectTypeDependecies
|
||||||
|
{
|
||||||
|
param($fromFolder)
|
||||||
|
|
||||||
|
foreacH($viewItem in $global:currentViewObject.ViewItems)
|
||||||
|
{
|
||||||
|
foreach($dep in $viewItem.Dependencies)
|
||||||
|
{
|
||||||
|
Add-DocOfflineDependecies $dep $fromFolder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Add-DocOfflineDependecies
|
||||||
|
{
|
||||||
|
param($objectTypeName, $fromFolder)
|
||||||
|
|
||||||
|
if($script:offlineObjects.ContainsKey($objectTypeName)) { return }
|
||||||
|
|
||||||
|
$tmpObjType = $global:currentViewObject.ViewItems | Where Id -eq $objectTypeName
|
||||||
|
|
||||||
|
if($tmpObjType)
|
||||||
|
{
|
||||||
|
$objPath = [IO.Path]::Combine($fromFolder,$tmpObjType.Id)
|
||||||
|
if([IO.Directory]::Exists($objPath) -eq $false)
|
||||||
|
{
|
||||||
|
Write-Log "Object path for $($tmpObjType.Title) ($($objPath)) not found" 2
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$tmpObjects = Get-GraphFileObjects $objPath -ObjectType $tmpObjType
|
||||||
|
$script:offlineObjects.Add($tmpObjType.Id, @(($tmpObjects | Select Object).Object))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Add-DocumentationObjects
|
function Add-DocumentationObjects
|
||||||
{
|
{
|
||||||
param($objects)
|
param($objects)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ This module will also document some objects based on PowerShell functions
|
|||||||
|
|
||||||
function Get-ModuleVersion
|
function Get-ModuleVersion
|
||||||
{
|
{
|
||||||
'1.1.0'
|
'1.2.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
function Invoke-InitializeModule
|
function Invoke-InitializeModule
|
||||||
@@ -18,6 +18,7 @@ function Invoke-InitializeModule
|
|||||||
Add-DocumentationProvicer ([PSCustomObject]@{
|
Add-DocumentationProvicer ([PSCustomObject]@{
|
||||||
Name="Custom"
|
Name="Custom"
|
||||||
Priority = 1000 # The priority of the Provider. Lower number has higher priority.
|
Priority = 1000 # The priority of the Provider. Lower number has higher priority.
|
||||||
|
InitializeDocumentation = { Initialize-CDDocumentation @args }
|
||||||
DocumentObject = { Invoke-CDDocumentObject @args }
|
DocumentObject = { Invoke-CDDocumentObject @args }
|
||||||
GetCustomProfileValue = { Add-CDDocumentCustomProfileValue @args }
|
GetCustomProfileValue = { Add-CDDocumentCustomProfileValue @args }
|
||||||
GetCustomChildObject = { Get-CDDocumentCustomChildObjet @args }
|
GetCustomChildObject = { Get-CDDocumentCustomChildObjet @args }
|
||||||
@@ -27,6 +28,12 @@ function Invoke-InitializeModule
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Initialize-CDDocumentation
|
||||||
|
{
|
||||||
|
$script:allTenantApps = $null
|
||||||
|
$script:allTermsOfUse = $null
|
||||||
|
}
|
||||||
|
|
||||||
function Invoke-CDDocumentObject
|
function Invoke-CDDocumentObject
|
||||||
{
|
{
|
||||||
param($documentationObj)
|
param($documentationObj)
|
||||||
@@ -42,6 +49,13 @@ function Invoke-CDDocumentObject
|
|||||||
Properties = @("Name","Value","Category","SubCategory") #,"RawValue","Description"
|
Properties = @("Name","Value","Category","SubCategory") #,"RawValue","Description"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
elseif($type -eq '#microsoft.graph.agreement')
|
||||||
|
{
|
||||||
|
Invoke-CDDocumentTermsOfUse $documentationObj
|
||||||
|
return [PSCustomObject]@{
|
||||||
|
Properties = @("Name","Value") #,"RawValue","Description"
|
||||||
|
}
|
||||||
|
}
|
||||||
elseif($type -eq '#microsoft.graph.countryNamedLocation')
|
elseif($type -eq '#microsoft.graph.countryNamedLocation')
|
||||||
{
|
{
|
||||||
Invoke-CDDocumentCountryNamedLocation $documentationObj
|
Invoke-CDDocumentCountryNamedLocation $documentationObj
|
||||||
@@ -116,7 +130,7 @@ function Get-CDAllCloudApps
|
|||||||
{
|
{
|
||||||
if(-not $script:allCloudApps)
|
if(-not $script:allCloudApps)
|
||||||
{
|
{
|
||||||
$script:allCloudApps =(Invoke-GraphRequest -url "/servicePrincipals?`$select=displayName,appId&top=999" -ODataMetadata "minimal").value
|
$script:allCloudApps = (Invoke-GraphRequest -url "/servicePrincipals?`$select=displayName,appId&top=999" -ODataMetadata "minimal").value
|
||||||
}
|
}
|
||||||
$script:allCloudApps
|
$script:allCloudApps
|
||||||
}
|
}
|
||||||
@@ -125,7 +139,11 @@ function Get-CDAllTenantApps
|
|||||||
{
|
{
|
||||||
if(-not $script:allTenantApps)
|
if(-not $script:allTenantApps)
|
||||||
{
|
{
|
||||||
$script:allTenantApps =(Invoke-GraphRequest -url "/deviceAppManagement/mobileApps?`$select=displayName,id&top=999" -ODataMetadata "minimal").value
|
$script:allTenantApps = Get-DocOfflineObjects "Applications"
|
||||||
|
if(-not $script:allTenantApps)
|
||||||
|
{
|
||||||
|
$script:allTenantApps =(Invoke-GraphRequest -url "/deviceAppManagement/mobileApps?`$select=displayName,id&top=999" -ODataMetadata "minimal").value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$script:allTenantApps
|
$script:allTenantApps
|
||||||
}
|
}
|
||||||
@@ -750,13 +768,26 @@ function Add-CDDocumentCustomProfileProperty
|
|||||||
{
|
{
|
||||||
if($obj.authenticationMethod -ne "derivedCredential")
|
if($obj.authenticationMethod -ne "derivedCredential")
|
||||||
{
|
{
|
||||||
$idCert = Invoke-GraphRequest -URL $obj."identityCertificateForClientAuthentication@odata.navigationLink" -ODataMetadata "minimal" -NoError
|
if($obj."#CustomRef_identityCertificateForClientAuthentication" -and $obj.'@ObjectFromFile' -eq $true)
|
||||||
|
{
|
||||||
|
$idCert = $obj."#CustomRef_identityCertificateForClientAuthentication"
|
||||||
|
$idx = $idCert.IndexOf("|:|")
|
||||||
|
if($idx -gt -1)
|
||||||
|
{
|
||||||
|
$idCertType = $idCert.SubString($idx + 3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$idCert = Invoke-GraphRequest -URL $obj."identityCertificateForClientAuthentication@odata.navigationLink" -ODataMetadata "minimal" -NoError
|
||||||
|
$idCertType = $idCert.'@OData.Type'
|
||||||
|
}
|
||||||
|
|
||||||
if($idCert.'@OData.Type' -like "*Pkcs*")
|
if($idCertType -like "*Pkcs*")
|
||||||
{
|
{
|
||||||
$clientCertType = "PKCS certificate"
|
$clientCertType = "PKCS certificate"
|
||||||
}
|
}
|
||||||
elseif($idCert.'@OData.Type' -like "*SCEP*")
|
elseif($idCertType -like "*SCEP*")
|
||||||
{
|
{
|
||||||
$clientCertType = "SCEP certificate"
|
$clientCertType = "SCEP certificate"
|
||||||
}
|
}
|
||||||
@@ -1102,6 +1133,7 @@ function Add-CDDocumentCustomProfileProperty
|
|||||||
$supersededApps = @()
|
$supersededApps = @()
|
||||||
if($obj.dependentAppCount -gt 0 -or $obj.supersededAppCount -gt 0)
|
if($obj.dependentAppCount -gt 0 -or $obj.supersededAppCount -gt 0)
|
||||||
{
|
{
|
||||||
|
# ToDo: Add support for Offline documentation
|
||||||
$relationships = (Invoke-GraphRequest -Url "/deviceAppManagement/mobileApps/$($obj.Id)/relationships?`$filter=targetType%20eq%20microsoft.graph.mobileAppRelationshipType%27child%27").value
|
$relationships = (Invoke-GraphRequest -Url "/deviceAppManagement/mobileApps/$($obj.Id)/relationships?`$filter=targetType%20eq%20microsoft.graph.mobileAppRelationshipType%27child%27").value
|
||||||
foreach($rel in $relationships)
|
foreach($rel in $relationships)
|
||||||
{
|
{
|
||||||
@@ -1187,6 +1219,11 @@ function Add-CDDocumentCustomProfileProperty
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
elseif($obj.'@OData.Type' -eq "#microsoft.graph.windows10TeamGeneralConfiguration")
|
||||||
|
{
|
||||||
|
$obj | Add-Member Noteproperty -Name "syntheticAzureOperationalInsightsEnabled" -Value ($obj.azureOperationalInsightsBlockTelemetry -eq $false)
|
||||||
|
$obj | Add-Member Noteproperty -Name "syntheticMaintenanceWindowEnabled" -Value ($obj.maintenanceWindowBlocked -eq $false)
|
||||||
|
}
|
||||||
|
|
||||||
if(($obj.PSObject.Properties | where Name -eq "securityRequireSafetyNetAttestationBasicIntegrity") -and
|
if(($obj.PSObject.Properties | where Name -eq "securityRequireSafetyNetAttestationBasicIntegrity") -and
|
||||||
($obj.PSObject.Properties | where Name -eq "securityRequireSafetyNetAttestationCertifiedDevice"))
|
($obj.PSObject.Properties | where Name -eq "securityRequireSafetyNetAttestationCertifiedDevice"))
|
||||||
@@ -1478,7 +1515,7 @@ function Invoke-CDDocumentCountryNamedLocation
|
|||||||
$countryList = @()
|
$countryList = @()
|
||||||
foreach($country in $obj.countriesAndRegions)
|
foreach($country in $obj.countriesAndRegions)
|
||||||
{
|
{
|
||||||
$countryList += Get-LanguageString "Countries.$($country.ToLower())"
|
$countryList += Get-LanguageString "AzureIAMCommon.CountryNames.countryName$($country.ToLower())"
|
||||||
}
|
}
|
||||||
|
|
||||||
Add-CustomSettingObject ([PSCustomObject]@{
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
@@ -1525,6 +1562,117 @@ function Invoke-CDDocumentIPNamedLocation
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Document Terms of Use
|
||||||
|
function Invoke-CDDocumentTermsOfUse
|
||||||
|
{
|
||||||
|
param($documentationObj)
|
||||||
|
|
||||||
|
$obj = $documentationObj.Object
|
||||||
|
$objectType = $documentationObj.ObjectType
|
||||||
|
|
||||||
|
$script:objectSeparator = ?? $global:cbDocumentationObjectSeparator.SelectedValue ([System.Environment]::NewLine)
|
||||||
|
$script:propertySeparator = ?? $global:cbDocumentationPropertySeparator.SelectedValue ","
|
||||||
|
|
||||||
|
$offLabel = Get-LanguageString "SettingDetails.offOption"
|
||||||
|
$onLabel = Get-LanguageString "SettingDetails.onOption"
|
||||||
|
|
||||||
|
###################################################
|
||||||
|
# Basic info
|
||||||
|
###################################################
|
||||||
|
|
||||||
|
Add-BasicPropertyValue (Get-LanguageString "SettingDetails.nameName") $obj.displayName
|
||||||
|
Add-BasicPropertyValue (Get-LanguageString "TableHeaders.configurationType") (Get-LanguageString "AzureIAM.menuItemTermsOfUse")
|
||||||
|
|
||||||
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
|
Name = Get-LanguageString "TermsOfUse.Wizard.agreementIsViewingBeforeAcceptanceRequiredLabel"
|
||||||
|
Value = ?: $obj.isViewingBeforeAcceptanceRequired $onLabel $offLabel
|
||||||
|
Category = $null
|
||||||
|
SubCategory = $null
|
||||||
|
EntityKey = "isViewingBeforeAcceptanceRequired"
|
||||||
|
})
|
||||||
|
|
||||||
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
|
Name = Get-LanguageString "TermsOfUse.Wizard.agreementIsPerDeviceAcceptanceRequiredLabel"
|
||||||
|
Value = ?: $obj.isPerDeviceAcceptanceRequired $onLabel $offLabel
|
||||||
|
Category = $null
|
||||||
|
SubCategory = $null
|
||||||
|
EntityKey = "isPerDeviceAcceptanceRequired"
|
||||||
|
})
|
||||||
|
|
||||||
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
|
Name = Get-LanguageString "TermsOfUse.Wizard.isAcceptanceExpirationEnabledLabel"
|
||||||
|
Value = ?: $obj.termsExpiration $onLabel $offLabel
|
||||||
|
Category = $null
|
||||||
|
SubCategory = $null
|
||||||
|
EntityKey = "isAcceptanceExpirationEnabledLabel"
|
||||||
|
})
|
||||||
|
|
||||||
|
if($obj.termsExpiration.startDateTime)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if($obj.termsExpiration.startDateTime -is [DateTime])
|
||||||
|
{
|
||||||
|
$tmpDate = $obj.termsExpiration.startDateTime
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$tmpDate = ([DateTime]::Parse($obj.termsExpiration.startDateTime))
|
||||||
|
}
|
||||||
|
$tmpDateStr = ($tmpDate).ToShortDateString()
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Write-Log "Failed to parse date from string $($obj.termsExpiration.startDateTime)" 2
|
||||||
|
$tmpDateStr = $obj.termsExpiration.startDateTime
|
||||||
|
}
|
||||||
|
|
||||||
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
|
Name = Get-LanguageString "TermsOfUse.Wizard.acceptanceExpirationStartDateTimeLabel"
|
||||||
|
Value = $tmpDateStr
|
||||||
|
Category = $null
|
||||||
|
SubCategory = $null
|
||||||
|
EntityKey = "startDateTime"
|
||||||
|
})
|
||||||
|
|
||||||
|
if($obj.termsExpiration.frequency -eq "P365D")
|
||||||
|
{
|
||||||
|
$value = Get-LanguageString "TermsOfUse.AcceptanceExpirationFrequency.annually"
|
||||||
|
}
|
||||||
|
elseif($obj.termsExpiration.frequency -eq "P180D")
|
||||||
|
{
|
||||||
|
$value = Get-LanguageString "TermsOfUse.AcceptanceExpirationFrequency.biannually"
|
||||||
|
}
|
||||||
|
elseif($obj.termsExpiration.frequency -eq "P30D")
|
||||||
|
{
|
||||||
|
$value = Get-LanguageString "TermsOfUse.AcceptanceExpirationFrequency.monthly"
|
||||||
|
}
|
||||||
|
elseif($obj.termsExpiration.frequency -eq "P90D")
|
||||||
|
{
|
||||||
|
$value = Get-LanguageString "TermsOfUse.AcceptanceExpirationFrequency.quarterly"
|
||||||
|
}
|
||||||
|
|
||||||
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
|
Name = Get-LanguageString "TermsOfUse.Wizard.acceptanceExpirationFrequencyLabel"
|
||||||
|
Value = $value
|
||||||
|
Category = $null
|
||||||
|
SubCategory = $null
|
||||||
|
EntityKey = "frequency"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if($null -ne $obj.userReacceptRequiredFrequency)
|
||||||
|
{
|
||||||
|
$days = Get-DurationValue $obj.userReacceptRequiredFrequency
|
||||||
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
|
Name = Get-LanguageString "TermsOfUse.Wizard.acceptanceDurationLabel"
|
||||||
|
Value = $days
|
||||||
|
Category = $null
|
||||||
|
SubCategory = $null
|
||||||
|
EntityKey = "userReacceptRequiredFrequency"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Document Conditional Access policy
|
# Document Conditional Access policy
|
||||||
function Invoke-CDDocumentConditionalAccess
|
function Invoke-CDDocumentConditionalAccess
|
||||||
{
|
{
|
||||||
@@ -1540,7 +1688,9 @@ function Invoke-CDDocumentConditionalAccess
|
|||||||
# Basic info
|
# Basic info
|
||||||
###################################################
|
###################################################
|
||||||
|
|
||||||
Add-BasicDefaultValues $obj $objectType
|
#Add-BasicDefaultValues $obj $objectType
|
||||||
|
Add-BasicPropertyValue (Get-LanguageString "SettingDetails.nameName") $obj.displayName
|
||||||
|
Add-BasicPropertyValue (Get-LanguageString "TableHeaders.configurationType") (Get-LanguageString "AzureIAM.conditionalAccessBladeTitle")
|
||||||
|
|
||||||
if($obj.state -eq "enabledForReportingButNotEnforced")
|
if($obj.state -eq "enabledForReportingButNotEnforced")
|
||||||
{
|
{
|
||||||
@@ -1590,6 +1740,7 @@ function Invoke-CDDocumentConditionalAccess
|
|||||||
|
|
||||||
$body = $ht | ConvertTo-Json
|
$body = $ht | ConvertTo-Json
|
||||||
|
|
||||||
|
# ToDo: Get from MigFile for Offline
|
||||||
$idInfo = (Invoke-GraphRequest -Url "/directoryObjects/getByIds?`$select=displayName,id" -Content $body -Method "Post").Value
|
$idInfo = (Invoke-GraphRequest -Url "/directoryObjects/getByIds?`$select=displayName,id" -Content $body -Method "Post").Value
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1719,6 +1870,7 @@ function Invoke-CDDocumentConditionalAccess
|
|||||||
$idObj = $idInfo | Where Id -eq $id
|
$idObj = $idInfo | Where Id -eq $id
|
||||||
$tmpObjs += ?? $idObj.displayName $id
|
$tmpObjs += ?? $idObj.displayName $id
|
||||||
}
|
}
|
||||||
|
|
||||||
Add-CustomSettingObject ([PSCustomObject]@{
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
Name = $category
|
Name = $category
|
||||||
Value = $tmpObjs -join $script:objectSeparator
|
Value = $tmpObjs -join $script:objectSeparator
|
||||||
@@ -1916,8 +2068,12 @@ function Invoke-CDDocumentConditionalAccess
|
|||||||
|
|
||||||
if(-not $script:allNamedLocations -and ($obj.conditions.locations.includeLocations.Count -gt 0 -or $obj.conditions.locations.excludeLocations.Count))
|
if(-not $script:allNamedLocations -and ($obj.conditions.locations.includeLocations.Count -gt 0 -or $obj.conditions.locations.excludeLocations.Count))
|
||||||
{
|
{
|
||||||
# Might be better to get them one by one
|
$script:allNamedLocations = Get-DocOfflineObjects "NamedLocations"
|
||||||
$script:allNamedLocations = (Invoke-GraphRequest -url "/identity/conditionalAccess/namedLocations?`$select=displayName,Id&top=999" -ODataMetadata "minimal").value
|
if(-not $script:allNamedLocations)
|
||||||
|
{
|
||||||
|
# Might be better to get them one by one
|
||||||
|
$script:allNamedLocations = (Invoke-GraphRequest -url "/identity/conditionalAccess/namedLocations?`$select=displayName,Id&top=999" -ODataMetadata "minimal").value
|
||||||
|
}
|
||||||
if(-not $script:allNamedLocations) { $script:allNamedLocations = @()}
|
if(-not $script:allNamedLocations) { $script:allNamedLocations = @()}
|
||||||
elseif($script:allNamedLocations -isnot [Object[]]) { $script:allNamedLocations = @($script:allNamedLocations) }
|
elseif($script:allNamedLocations -isnot [Object[]]) { $script:allNamedLocations = @($script:allNamedLocations) }
|
||||||
|
|
||||||
@@ -1927,6 +2083,17 @@ function Invoke-CDDocumentConditionalAccess
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(-not $script:allTermsOfUse -and (($obj.grantControls.termsOfUse | measure).Count -gt 0))
|
||||||
|
{
|
||||||
|
$script:allTermsOfUse = Get-DocOfflineObjects "TermsOfUse"
|
||||||
|
if(-not $script:allTermsOfUse)
|
||||||
|
{
|
||||||
|
$script:allTermsOfUse = (Invoke-GraphRequest -url "/identityGovernance/termsOfUse/agreements?`$select=displayName,Id&top=999" -ODataMetadata "minimal").value
|
||||||
|
}
|
||||||
|
if(-not $script:allTermsOfUse ) { $script:allTermsOfUse = @()}
|
||||||
|
elseif($script:allTermsOfUse -isnot [Object[]]) { $script:allTermsOfUse = @($script:allTermsOfUse ) }
|
||||||
|
}
|
||||||
|
|
||||||
if($obj.conditions.locations.includeLocations.Count -gt 0)
|
if($obj.conditions.locations.includeLocations.Count -gt 0)
|
||||||
{
|
{
|
||||||
$tmpObjs = @()
|
$tmpObjs = @()
|
||||||
@@ -2056,71 +2223,92 @@ function Invoke-CDDocumentConditionalAccess
|
|||||||
EntityKey = "policyControl"
|
EntityKey = "policyControl"
|
||||||
})
|
})
|
||||||
|
|
||||||
if(($obj.grantControls.builtInControls | Where { $_ -eq "block"}))
|
if($null -eq (($obj.grantControls.builtInControls | Where { $_ -eq "block"}) ))
|
||||||
{
|
{
|
||||||
if(($obj.grantControls.builtInControls | Where { $_ -eq "mfa"}))
|
if(($obj.grantControls.builtInControls | measure).Count -gt 0)
|
||||||
{
|
{
|
||||||
Add-CustomSettingObject ([PSCustomObject]@{
|
if(($obj.grantControls.builtInControls | Where { $_ -eq "mfa"}))
|
||||||
Name = Get-LanguageString "AzureIAM.policyControlMfaChallengeDisplayedName"
|
{
|
||||||
Value = Get-LanguageString "Inputs.enabled"
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
Category = $category
|
Name = Get-LanguageString "AzureIAM.policyControlMfaChallengeDisplayedName"
|
||||||
SubCategory = ""
|
Value = Get-LanguageString "Inputs.enabled"
|
||||||
EntityKey = "mfa"
|
Category = $category
|
||||||
})
|
SubCategory = ""
|
||||||
|
EntityKey = "mfa"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if(($obj.grantControls.builtInControls | Where { $_ -eq "compliantDevice"}))
|
||||||
|
{
|
||||||
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
|
Name = Get-LanguageString "AzureIAM.policyControlCompliantDeviceDisplayedName"
|
||||||
|
Value = Get-LanguageString "Inputs.enabled"
|
||||||
|
Category = $category
|
||||||
|
SubCategory = ""
|
||||||
|
EntityKey = "compliantDevice"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if(($obj.grantControls.builtInControls | Where { $_ -eq "domainJoinedDevice"}))
|
||||||
|
{
|
||||||
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
|
Name = Get-LanguageString "AzureIAM.policyControlRequireDomainJoinedDisplayedName"
|
||||||
|
Value = Get-LanguageString "Inputs.enabled"
|
||||||
|
Category = $category
|
||||||
|
SubCategory = ""
|
||||||
|
EntityKey = "domainJoinedDevice"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if(($obj.grantControls.builtInControls | Where { $_ -eq "approvedApplication"}))
|
||||||
|
{
|
||||||
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
|
Name = Get-LanguageString "AzureIAM.policyControlRequireMamDisplayedName"
|
||||||
|
Value = Get-LanguageString "Inputs.enabled"
|
||||||
|
Category = $category
|
||||||
|
SubCategory = ""
|
||||||
|
EntityKey = "approvedApplication"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if(($obj.grantControls.builtInControls | Where { $_ -eq "compliantApplication"}))
|
||||||
|
{
|
||||||
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
|
Name = Get-LanguageString "AzureIAM.policyControlRequireCompliantAppDisplayedName"
|
||||||
|
Value = Get-LanguageString "Inputs.enabled"
|
||||||
|
Category = $category
|
||||||
|
SubCategory = ""
|
||||||
|
EntityKey = "compliantApplication"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if(($obj.grantControls.builtInControls | Where { $_ -eq "passwordChange"}))
|
||||||
|
{
|
||||||
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
|
Name = Get-LanguageString "AzureIAM.policyControlRequiredPasswordChangeDisplayedName"
|
||||||
|
Value = Get-LanguageString "Inputs.enabled"
|
||||||
|
Category = $category
|
||||||
|
SubCategory = ""
|
||||||
|
EntityKey = "passwordChange"
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(($obj.grantControls.builtInControls | Where { $_ -eq "compliantDevice"}))
|
if(($obj.grantControls.termsOfUse | measure).Count -gt 0)
|
||||||
{
|
{
|
||||||
Add-CustomSettingObject ([PSCustomObject]@{
|
$termsOfUse = @()
|
||||||
Name = Get-LanguageString "AzureIAM.policyControlCompliantDeviceDisplayedName"
|
foreach($tmpId in $obj.grantControls.termsOfUse)
|
||||||
Value = Get-LanguageString "Inputs.enabled"
|
{
|
||||||
Category = $category
|
$touObj = $script:allTermsOfUse | Where Id -eq $tmpId
|
||||||
SubCategory = ""
|
$termsOfUse += ?? $touObj.displayName $tmpId
|
||||||
EntityKey = "compliantDevice"
|
}
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if(($obj.grantControls.builtInControls | Where { $_ -eq "domainJoinedDevice"}))
|
|
||||||
{
|
|
||||||
Add-CustomSettingObject ([PSCustomObject]@{
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
Name = Get-LanguageString "AzureIAM.policyControlRequireDomainJoinedDisplayedName"
|
Name = Get-LanguageString "AzureIAM.menuItemTermsOfUse"
|
||||||
Value = Get-LanguageString "Inputs.enabled"
|
Value = $termsOfUse -join $script:objectSeparator
|
||||||
Category = $category
|
Category = $category
|
||||||
SubCategory = ""
|
SubCategory = ""
|
||||||
EntityKey = "domainJoinedDevice"
|
EntityKey = "termsOfUse"
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if(($obj.grantControls.builtInControls | Where { $_ -eq "approvedApplication"}))
|
|
||||||
{
|
|
||||||
Add-CustomSettingObject ([PSCustomObject]@{
|
|
||||||
Name = Get-LanguageString "AzureIAM.policyControlRequireMamDisplayedName"
|
|
||||||
Value = Get-LanguageString "Inputs.enabled"
|
|
||||||
Category = $category
|
|
||||||
SubCategory = ""
|
|
||||||
EntityKey = "approvedApplication"
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if(($obj.grantControls.builtInControls | Where { $_ -eq "compliantApplication"}))
|
|
||||||
{
|
|
||||||
Add-CustomSettingObject ([PSCustomObject]@{
|
|
||||||
Name = Get-LanguageString "AzureIAM.policyControlRequireCompliantAppDisplayedName"
|
|
||||||
Value = Get-LanguageString "Inputs.enabled"
|
|
||||||
Category = $category
|
|
||||||
SubCategory = ""
|
|
||||||
EntityKey = "compliantApplication"
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if(($obj.grantControls.builtInControls | Where { $_ -eq "passwordChange"}))
|
|
||||||
{
|
|
||||||
Add-CustomSettingObject ([PSCustomObject]@{
|
|
||||||
Name = Get-LanguageString "AzureIAM.policyControlRequiredPasswordChangeDisplayedName"
|
|
||||||
Value = Get-LanguageString "Inputs.enabled"
|
|
||||||
Category = $category
|
|
||||||
SubCategory = ""
|
|
||||||
EntityKey = "passwordChange"
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2131,7 +2319,7 @@ function Invoke-CDDocumentConditionalAccess
|
|||||||
SubCategory = ""
|
SubCategory = ""
|
||||||
EntityKey = "grantOperator"
|
EntityKey = "grantOperator"
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
###################################################
|
###################################################
|
||||||
# Session
|
# Session
|
||||||
@@ -2644,8 +2832,7 @@ function Invoke-CDDocumentAssignmentFilter
|
|||||||
|
|
||||||
$label = Get-LanguageString "ApplicabilityRules.GridLabel.rule"
|
$label = Get-LanguageString "ApplicabilityRules.GridLabel.rule"
|
||||||
|
|
||||||
# "Rules" is not in the translation file
|
$category = Get-LanguageString "SettingDetails.rules"
|
||||||
$category = "Rules"
|
|
||||||
|
|
||||||
Add-CustomSettingObject ([PSCustomObject]@{
|
Add-CustomSettingObject ([PSCustomObject]@{
|
||||||
Name = $label
|
Name = $label
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#https://docs.microsoft.com/en-us/office/vba/api/overview/word
|
#https://docs.microsoft.com/en-us/office/vba/api/overview/word
|
||||||
function Get-ModuleVersion
|
function Get-ModuleVersion
|
||||||
{
|
{
|
||||||
'1.1.0'
|
'1.2.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
function Invoke-InitializeModule
|
function Invoke-InitializeModule
|
||||||
@@ -32,31 +32,6 @@ function Invoke-InitializeModule
|
|||||||
PostProcess = { Invoke-WordPostProcessItems @args }
|
PostProcess = { Invoke-WordPostProcessItems @args }
|
||||||
ProcessAllObjects = { Invoke-WordProcessAllObjects @args }
|
ProcessAllObjects = { Invoke-WordProcessAllObjects @args }
|
||||||
})
|
})
|
||||||
|
|
||||||
$script:columnHeaders = @{
|
|
||||||
Name="Inputs.displayNameLabel"
|
|
||||||
Value="TableHeaders.value"
|
|
||||||
Description="TableHeaders.description"
|
|
||||||
GroupMode="SettingDetails.modeTableHeader" #assignmentTypeSelectionLabel?
|
|
||||||
Group="TableHeaders.assignedGroups"
|
|
||||||
Groups="TableHeaders.groups"
|
|
||||||
useDeviceContext="SettingDetails.installContextLabel"
|
|
||||||
uninstallOnDeviceRemoval="SettingDetails.UninstallOnRemoval"
|
|
||||||
isRemovable="SettingDetails.installAsRemovable"
|
|
||||||
vpnConfigurationId="PolicyType.vpn"
|
|
||||||
Action="SettingDetails.actionColumnName"
|
|
||||||
Schedule="ScheduledAction.List.schedule"
|
|
||||||
MessageTemplate="ScheduledAction.Notification.messageTemplate"
|
|
||||||
EmailCC="ScheduledAction.Notification.additionalRecipients"
|
|
||||||
Filter="AssignmentFilters.assignmentFilterColumnHeader"
|
|
||||||
Rule="ApplicabilityRules.GridLabel.Rule"
|
|
||||||
ValueWithLabel="TableHeaders.value"
|
|
||||||
Status="TableHeaders.status"
|
|
||||||
CombinedValueWithLabel="TableHeaders.value"
|
|
||||||
CombinedValue="TableHeaders.value"
|
|
||||||
useDeviceLicensing="TableHeaders.licenseType"
|
|
||||||
#filterMode="Filter mode" # Not in any string file yet
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Add-WordOptionsControl
|
function Add-WordOptionsControl
|
||||||
@@ -90,6 +65,11 @@ function Add-WordOptionsControl
|
|||||||
$global:txtWordTableHeaderStyle.Text = Get-Setting "Documentation" "WordTableHeaderStyle" ""
|
$global:txtWordTableHeaderStyle.Text = Get-Setting "Documentation" "WordTableHeaderStyle" ""
|
||||||
$global:txtWordCategoryHeaderStyle.Text = Get-Setting "Documentation" "WordCategoryHeaderStyle" ""
|
$global:txtWordCategoryHeaderStyle.Text = Get-Setting "Documentation" "WordCategoryHeaderStyle" ""
|
||||||
$global:txtWordSubCategoryHeaderStyle.Text = Get-Setting "Documentation" "WordSubCategoryHeaderStyle" ""
|
$global:txtWordSubCategoryHeaderStyle.Text = Get-Setting "Documentation" "WordSubCategoryHeaderStyle" ""
|
||||||
|
$global:txtWordTableTextStyle.Text = Get-Setting "Documentation" "WordTableTextStyle" ""
|
||||||
|
|
||||||
|
$global:cbWordTableCaptionPosition.ItemsSource = ("[ { Name: `"Above`",Value: `"above`" }, { Name: `"Below`",Value: `"below`" }]" | ConvertFrom-Json)
|
||||||
|
$global:cbWordTableCaptionPosition.SelectedValue = (Get-Setting "Documentation" "WordTableCaptionPosition" "below")
|
||||||
|
|
||||||
$global:txtWordContentControls.Text = Get-Setting "Documentation" "WordContentControls" "Year=;Address="
|
$global:txtWordContentControls.Text = Get-Setting "Documentation" "WordContentControls" "Year=;Address="
|
||||||
$global:txtWordTitleProperty.Text = Get-Setting "Documentation" "WordTitleProperty" "Intune documentation"
|
$global:txtWordTitleProperty.Text = Get-Setting "Documentation" "WordTitleProperty" "Intune documentation"
|
||||||
$global:txtWordSubjectProperty.Text = Get-Setting "Documentation" "WordSubjectProperty" "Intune documentation"
|
$global:txtWordSubjectProperty.Text = Get-Setting "Documentation" "WordSubjectProperty" "Intune documentation"
|
||||||
@@ -152,6 +132,9 @@ function Invoke-WordPreProcessItems
|
|||||||
Save-Setting "Documentation" "WordTableHeaderStyle" $global:txtWordTableHeaderStyle.Text
|
Save-Setting "Documentation" "WordTableHeaderStyle" $global:txtWordTableHeaderStyle.Text
|
||||||
Save-Setting "Documentation" "WordCategoryHeaderStyle" $global:txtWordCategoryHeaderStyle.Text
|
Save-Setting "Documentation" "WordCategoryHeaderStyle" $global:txtWordCategoryHeaderStyle.Text
|
||||||
Save-Setting "Documentation" "WordSubCategoryHeaderStyle" $global:txtWordSubCategoryHeaderStyle.Text
|
Save-Setting "Documentation" "WordSubCategoryHeaderStyle" $global:txtWordSubCategoryHeaderStyle.Text
|
||||||
|
Save-Setting "Documentation" "WordTableTextStyle" $global:txtWordTableTextStyle.Text
|
||||||
|
Save-Setting "Documentation" "WordTableCaptionPosition" $global:cbWordTableCaptionPosition.SelectedValue
|
||||||
|
|
||||||
Save-Setting "Documentation" "WordContentControls" $global:txtWordContentControls.Text
|
Save-Setting "Documentation" "WordContentControls" $global:txtWordContentControls.Text
|
||||||
Save-Setting "Documentation" "WordTitleProperty" $global:txtWordTitleProperty.Text
|
Save-Setting "Documentation" "WordTitleProperty" $global:txtWordTitleProperty.Text
|
||||||
Save-Setting "Documentation" "WordSubjectProperty" $global:txtWordSubjectProperty.Text
|
Save-Setting "Documentation" "WordSubjectProperty" $global:txtWordSubjectProperty.Text
|
||||||
@@ -470,7 +453,7 @@ function Set-WordContentControlText
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Write-Log "No ContentControl found with name $controlName" 2
|
#Write-Log "No ContentControl found with name $controlName" 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
@@ -521,12 +504,12 @@ function Invoke-WordProcessItem
|
|||||||
|
|
||||||
foreach($prop in $global:txtWordCustomProperties.Text.Split(","))
|
foreach($prop in $global:txtWordCustomProperties.Text.Split(","))
|
||||||
{
|
{
|
||||||
# This will add language support for custom columens (or replacing existing header)
|
# This will add language support for custom columns (or replacing existing header)
|
||||||
$propInfo = $prop.Split('=')
|
$propInfo = $prop.Split('=')
|
||||||
if(($propInfo | measure).Count -gt 1)
|
if(($propInfo | measure).Count -gt 1)
|
||||||
{
|
{
|
||||||
$properties += $propInfo[0]
|
$properties += $propInfo[0]
|
||||||
Set-WordColumnHeaderLanguageId $propInfo[0] $propInfo[1]
|
Set-DocColumnHeaderLanguageId $propInfo[0] $propInfo[1]
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -574,10 +557,13 @@ function Invoke-WordProcessItem
|
|||||||
if(($documentedObj.Assignments | measure).Count -gt 0)
|
if(($documentedObj.Assignments | measure).Count -gt 0)
|
||||||
{
|
{
|
||||||
$params = @{}
|
$params = @{}
|
||||||
|
$settingProps = $null
|
||||||
if($documentedObj.Assignments[0].RawIntent)
|
if($documentedObj.Assignments[0].RawIntent)
|
||||||
{
|
{
|
||||||
$properties = @("GroupMode","Group","Filter","FilterMode")
|
$properties = @("GroupMode","Group","Filter","FilterMode")
|
||||||
|
|
||||||
|
$settingProps = @("Filter","FilterMode")
|
||||||
|
|
||||||
$settingsObj = $documentedObj.Assignments | Where { $_.Settings -ne $null } | Select -First 1
|
$settingsObj = $documentedObj.Assignments | Where { $_.Settings -ne $null } | Select -First 1
|
||||||
|
|
||||||
if($settingsObj)
|
if($settingsObj)
|
||||||
@@ -586,7 +572,7 @@ function Invoke-WordProcessItem
|
|||||||
{
|
{
|
||||||
if($objProp -in $properties) { continue }
|
if($objProp -in $properties) { continue }
|
||||||
if($objProp -in @("Category","RawIntent")) { continue }
|
if($objProp -in @("Category","RawIntent")) { continue }
|
||||||
$properties += ("Settings." + $objProp)
|
$settingProps += ("Settings." + $objProp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -609,7 +595,14 @@ function Invoke-WordProcessItem
|
|||||||
$params.Add("AddCategories", $true)
|
$params.Add("AddCategories", $true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Creates a standard assignments table
|
||||||
Add-DocTableItems $obj $objectType $documentedObj.Assignments $properties "TableHeaders.assignments" @params
|
Add-DocTableItems $obj $objectType $documentedObj.Assignments $properties "TableHeaders.assignments" @params
|
||||||
|
|
||||||
|
if($null -ne $settingProps)
|
||||||
|
{
|
||||||
|
# Adds additional values to the assignments table for Apps assignments
|
||||||
|
Set-DocTableSettingsItems $obj $objectType $documentedObj.Assignments $settingProps 3
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($global:chkWordAttatchJsonFile.IsChecked -eq $true)
|
if($global:chkWordAttatchJsonFile.IsChecked -eq $true)
|
||||||
@@ -632,6 +625,44 @@ function Invoke-WordProcessItem
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Set-DocTableSettingsItems
|
||||||
|
{
|
||||||
|
param($obj, $objectType, $items, $properties, $firstColumn)
|
||||||
|
|
||||||
|
$secondColumn = $firstColumn + 1
|
||||||
|
|
||||||
|
$script:docTable.Cell(1, $firstColumn).Range.Text = (Invoke-WordTranslateColumnHeader "Settings")
|
||||||
|
$script:docTable.Cell(1, $secondColumn).Range.Text = ""
|
||||||
|
|
||||||
|
$row = 2
|
||||||
|
foreach($itemObj in $items)
|
||||||
|
{
|
||||||
|
$script:docTable.Cell($row, $firstColumn).Range.Text = ""
|
||||||
|
$script:docTable.Cell($row, $secondColumn).Range.Text = ""
|
||||||
|
$script:docTable.Cell($row, $firstColumn).Split($properties.Count,1)
|
||||||
|
$script:docTable.Cell($row, $secondColumn).Split($properties.Count,1)
|
||||||
|
|
||||||
|
$cellRow = $row
|
||||||
|
foreach($settingProp in $properties)
|
||||||
|
{
|
||||||
|
$script:docTable.Cell($cellRow, $firstColumn).Range.Text = (Invoke-WordTranslateColumnHeader ($settingProp.Split('.')[-1]))
|
||||||
|
|
||||||
|
$propArr = $settingProp.Split('.')
|
||||||
|
$tmpObj = $itemObj
|
||||||
|
$propName = $propArr[-1]
|
||||||
|
for($x = 0; $x -lt ($propArr.Count - 1);$x++)
|
||||||
|
{
|
||||||
|
$tmpObj = $tmpObj."$($propArr[$x])"
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:docTable.Cell($cellRow, $secondColumn).Column.Cells($cellRow).Range.Text = "$($tmpObj.$propName)"
|
||||||
|
|
||||||
|
$cellRow++
|
||||||
|
}
|
||||||
|
$row = $row + $properties.Count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Invoke-WordProcessAllObjects
|
function Invoke-WordProcessAllObjects
|
||||||
{
|
{
|
||||||
param($allObjectTypeObjects)
|
param($allObjectTypeObjects)
|
||||||
@@ -671,54 +702,32 @@ function Invoke-WordProcessAllObjects
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Invoke-WordTranslateColumnHeader
|
|
||||||
{
|
|
||||||
param($columnName)
|
|
||||||
|
|
||||||
$lngText = ""
|
|
||||||
if($script:columnHeaders.ContainsKey($columnName))
|
|
||||||
{
|
|
||||||
$lngText = Get-LanguageString $script:columnHeaders[$columnName]
|
|
||||||
}
|
|
||||||
|
|
||||||
(?? $lngText $columnName)
|
|
||||||
}
|
|
||||||
|
|
||||||
function Invoke-WordCustomProcessItems
|
function Invoke-WordCustomProcessItems
|
||||||
{
|
{
|
||||||
param($obj, $documentedObj)
|
param($obj, $documentedObj)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Set-WordColumnHeaderLanguageId
|
|
||||||
{
|
|
||||||
param($columnName, $lngId)
|
|
||||||
|
|
||||||
if(-not $script:columnHeaders -or -not $lngId) { return }
|
|
||||||
|
|
||||||
if($script:columnHeaders.ContainsKey($columnName))
|
|
||||||
{
|
|
||||||
$script:columnHeaders[$columnName] = $lngId
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$script:columnHeaders.Add($columnName, $lngId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Add-DocTableItems
|
function Add-DocTableItems
|
||||||
{
|
{
|
||||||
param($obj, $objectType, $items, $properties, $lngId, [switch]$AddCategories, [switch]$AddSubcategories, $captionOverride, [switch]$forceFullValue)
|
param($obj, $objectType, $items, $properties, $lngId, [switch]$AddCategories, [switch]$AddSubcategories, $captionOverride, [switch]$forceFullValue)
|
||||||
|
|
||||||
|
if(($items | measure).Count -eq 0)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
$tblHeaderStyle = $global:txtWordTableHeaderStyle.Text
|
$tblHeaderStyle = $global:txtWordTableHeaderStyle.Text
|
||||||
$tblCategoryStyle = $global:txtWordCategoryHeaderStyle.Text
|
$tblCategoryStyle = $global:txtWordCategoryHeaderStyle.Text
|
||||||
$tblSubCategoryStyle = $global:txtWordSubCategoryHeaderStyle.Text
|
$tblSubCategoryStyle = $global:txtWordSubCategoryHeaderStyle.Text
|
||||||
|
$tblTextStyle = $global:txtWordTableTextStyle.Text
|
||||||
|
$txtTableCaptionPosition = $global:cbWordTableCaptionPosition.SelectedValue
|
||||||
|
|
||||||
$range = $script:doc.application.selection.range
|
$range = $script:doc.application.selection.range
|
||||||
|
|
||||||
$script:docTable = $script:doc.Tables.Add($range, ($items.Count + 1), $properties.Count, [Microsoft.Office.Interop.Word.WdDefaultTableBehavior]::wdWord9TableBehavior, [Microsoft.Office.Interop.Word.WdAutoFitBehavior]::wdAutoFitWindow)
|
$script:docTable = $script:doc.Tables.Add($range, ($items.Count + 1), $properties.Count, [Microsoft.Office.Interop.Word.WdDefaultTableBehavior]::wdWord9TableBehavior, [Microsoft.Office.Interop.Word.WdAutoFitBehavior]::wdAutoFitWindow)
|
||||||
$script:docTable.ApplyStyleHeadingRows = $true
|
$script:docTable.ApplyStyleHeadingRows = $true
|
||||||
Set-DocObjectStyle $script:docTable $global:txtWordTableStyle.Text
|
Set-DocObjectStyle $script:docTable $global:txtWordTableStyle.Text | Out-null
|
||||||
|
|
||||||
if($captionOverride)
|
if($captionOverride)
|
||||||
{
|
{
|
||||||
@@ -736,7 +745,7 @@ function Add-DocTableItems
|
|||||||
$i = 1
|
$i = 1
|
||||||
foreach($prop in $properties)
|
foreach($prop in $properties)
|
||||||
{
|
{
|
||||||
$script:docTable.Cell(1, $i).Range.Text = (Invoke-WordTranslateColumnHeader ($prop.Split(".")[-1]))
|
$script:docTable.Cell(1, $i).Range.Text = (Invoke-DocTranslateColumnHeader ($prop.Split(".")[-1]))
|
||||||
$i++
|
$i++
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -817,6 +826,8 @@ function Add-DocTableItems
|
|||||||
$i++
|
$i++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Set-DocObjectStyle $script:docTable.Rows($row).Range $tblTextStyle
|
||||||
|
|
||||||
if($itemObj.Category -and $curCategory -ne $itemObj.Category -and $AddCategories -eq $true)
|
if($itemObj.Category -and $curCategory -ne $itemObj.Category -and $AddCategories -eq $true)
|
||||||
{
|
{
|
||||||
# Insert row for the Category above the new row
|
# Insert row for the Category above the new row
|
||||||
@@ -857,13 +868,22 @@ function Add-DocTableItems
|
|||||||
$row++
|
$row++
|
||||||
}
|
}
|
||||||
|
|
||||||
# -2 = Table, 1 = Below
|
# -2 = Table caption, 1 = Below / 0 = Above
|
||||||
$script:docTable.Application.Selection.InsertCaption(-2, ". $caption", $null, 1)
|
if($txtTableCaptionPosition -eq "above")
|
||||||
|
{
|
||||||
|
$capPos = 0
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$capPos = 1
|
||||||
|
}
|
||||||
|
$script:docTable.Application.Selection.InsertCaption(-2, ". $caption", $null, $capPos)
|
||||||
|
|
||||||
|
Invoke-DocGoToEnd
|
||||||
|
|
||||||
# Add new row after the table
|
# Add new row after the table
|
||||||
#$script:doc.Application.Selection.InsertParagraphAfter()
|
#$script:doc.Application.Selection.InsertParagraphAfter()
|
||||||
$script:doc.Application.Selection.TypeParagraph()
|
$script:doc.Application.Selection.TypeParagraph()
|
||||||
#$script:doc.Application.Selection.TypeParagraph()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Add-DocTableScript
|
function Add-DocTableScript
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ This module is for the Endpoint Manager/Intune View. It manages Export/Import/Co
|
|||||||
#>
|
#>
|
||||||
function Get-ModuleVersion
|
function Get-ModuleVersion
|
||||||
{
|
{
|
||||||
'3.4.0'
|
'3.5.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
function Invoke-InitializeModule
|
function Invoke-InitializeModule
|
||||||
@@ -86,7 +86,7 @@ function Invoke-InitializeModule
|
|||||||
ID="IntuneGraphAPI"
|
ID="IntuneGraphAPI"
|
||||||
ViewPanel = $viewPanel
|
ViewPanel = $viewPanel
|
||||||
AuthenticationID = "MSAL"
|
AuthenticationID = "MSAL"
|
||||||
ItemChanged = { Show-GraphObjects; Invoke-ModuleFunction "Invoke-GraphObjectsChanged"; Write-Status ""}
|
ItemChanged = { Show-GraphObjects -ObjectTypeChanged; Invoke-ModuleFunction "Invoke-GraphObjectsChanged"; Write-Status ""}
|
||||||
Deactivating = { Invoke-EMDeactivateView }
|
Deactivating = { Invoke-EMDeactivateView }
|
||||||
Activating = { Invoke-EMActivatingView }
|
Activating = { Invoke-EMActivatingView }
|
||||||
Authentication = (Get-MSALAuthenticationObject)
|
Authentication = (Get-MSALAuthenticationObject)
|
||||||
@@ -112,6 +112,7 @@ function Invoke-InitializeModule
|
|||||||
PostCopyCommand = { Start-PostCopyDeviceConfiguration @args }
|
PostCopyCommand = { Start-PostCopyDeviceConfiguration @args }
|
||||||
PostGetCommand = { Start-PostGetDeviceConfiguration @args }
|
PostGetCommand = { Start-PostGetDeviceConfiguration @args }
|
||||||
GroupId = "DeviceConfiguration"
|
GroupId = "DeviceConfiguration"
|
||||||
|
NavigationProperties=$true
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -124,6 +125,8 @@ function Invoke-InitializeModule
|
|||||||
GroupId = "ConditionalAccess"
|
GroupId = "ConditionalAccess"
|
||||||
ImportExtension = { Add-ConditionalAccessImportExtensions @args }
|
ImportExtension = { Add-ConditionalAccessImportExtensions @args }
|
||||||
PreImportCommand = { Start-PreImportConditionalAccess @args }
|
PreImportCommand = { Start-PreImportConditionalAccess @args }
|
||||||
|
PostExportCommand = { Start-PostExportConditionalAccess @args }
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
if((Get-SettingValue "PreviewFeatures" $false) -eq $true)
|
if((Get-SettingValue "PreviewFeatures" $false) -eq $true)
|
||||||
@@ -150,6 +153,7 @@ function Invoke-InitializeModule
|
|||||||
Permissons=@("Policy.ReadWrite.ConditionalAccess")
|
Permissons=@("Policy.ReadWrite.ConditionalAccess")
|
||||||
ImportOrder = 50
|
ImportOrder = 50
|
||||||
GroupId = "ConditionalAccess"
|
GroupId = "ConditionalAccess"
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -226,6 +230,7 @@ function Invoke-InitializeModule
|
|||||||
SkipRemoveProperties = @('Id')
|
SkipRemoveProperties = @('Id')
|
||||||
GroupId = "Azure"
|
GroupId = "Azure"
|
||||||
SkipAddIDOnExport = $true
|
SkipAddIDOnExport = $true
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -340,6 +345,7 @@ function Invoke-InitializeModule
|
|||||||
PostExportCommand = { Start-PostExportTermsAndConditions @args }
|
PostExportCommand = { Start-PostExportTermsAndConditions @args }
|
||||||
PreImportAssignmentsCommand = { Start-PreImportAssignmentsTermsAndConditions @args }
|
PreImportAssignmentsCommand = { Start-PreImportAssignmentsTermsAndConditions @args }
|
||||||
GroupId = "TenantAdmin"
|
GroupId = "TenantAdmin"
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -359,6 +365,7 @@ function Invoke-InitializeModule
|
|||||||
Permissons=@("DeviceManagementApps.ReadWrite.All")
|
Permissons=@("DeviceManagementApps.ReadWrite.All")
|
||||||
Dependencies = @("Applications")
|
Dependencies = @("Applications")
|
||||||
GroupId = "AppProtection"
|
GroupId = "AppProtection"
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
# These are also included in the managedAppPolicies API
|
# These are also included in the managedAppPolicies API
|
||||||
@@ -377,6 +384,7 @@ function Invoke-InitializeModule
|
|||||||
Dependencies = @("Applications")
|
Dependencies = @("Applications")
|
||||||
Icon = "AppConfiguration"
|
Icon = "AppConfiguration"
|
||||||
GroupId = "AppConfiguration"
|
GroupId = "AppConfiguration"
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -400,6 +408,7 @@ function Invoke-InitializeModule
|
|||||||
ViewID = "IntuneGraphAPI"
|
ViewID = "IntuneGraphAPI"
|
||||||
PropertiesToRemove = @('uploadState','publishingState','isAssigned','dependentAppCount','supersedingAppCount','supersededAppCount','committedContentVersion','isFeatured','size','categories')
|
PropertiesToRemove = @('uploadState','publishingState','isAssigned','dependentAppCount','supersedingAppCount','supersededAppCount','committedContentVersion','isFeatured','size','categories')
|
||||||
QUERYLIST = "`$filter=(microsoft.graph.managedApp/appAvailability%20eq%20null%20or%20microsoft.graph.managedApp/appAvailability%20eq%20%27lineOfBusiness%27%20or%20isAssigned%20eq%20true)&`$orderby=displayName"
|
QUERYLIST = "`$filter=(microsoft.graph.managedApp/appAvailability%20eq%20null%20or%20microsoft.graph.managedApp/appAvailability%20eq%20%27lineOfBusiness%27%20or%20isAssigned%20eq%20true)&`$orderby=displayName"
|
||||||
|
QuerySearch=$true
|
||||||
Permissons=@("DeviceManagementApps.ReadWrite.All")
|
Permissons=@("DeviceManagementApps.ReadWrite.All")
|
||||||
AssignmentsType="mobileAppAssignments"
|
AssignmentsType="mobileAppAssignments"
|
||||||
AssignmentProperties = @("@odata.type","target","settings","intent")
|
AssignmentProperties = @("@odata.type","target","settings","intent")
|
||||||
@@ -437,10 +446,12 @@ function Invoke-InitializeModule
|
|||||||
PreImportAssignmentsCommand = { Start-PreImportAssignmentsPolicySets @args }
|
PreImportAssignmentsCommand = { Start-PreImportAssignmentsPolicySets @args }
|
||||||
PreImportCommand = { Start-PreImportPolicySets @args }
|
PreImportCommand = { Start-PreImportPolicySets @args }
|
||||||
PreUpdateCommand = { Start-PreUpdatePolicySets @args }
|
PreUpdateCommand = { Start-PreUpdatePolicySets @args }
|
||||||
|
PostListCommand = { Start-PostListPolicySets @args }
|
||||||
Permissons=@("DeviceManagementConfiguration.ReadWrite.All")
|
Permissons=@("DeviceManagementConfiguration.ReadWrite.All")
|
||||||
ImportOrder = 2000 # Policy Sets reference other objects so make sure it is imported last
|
ImportOrder = 2000 # Policy Sets reference other objects so make sure it is imported last
|
||||||
Dependencies = @("Applications","AppConfiguration","AppProtection","AutoPilot","EnrollmentRestrictions","EnrollmentStatusPage","DeviceConfiguration","AdministrativeTemplates","SettingsCatalog","CompliancePolicies")
|
Dependencies = @("Applications","AppConfiguration","AppProtection","AutoPilot","EnrollmentRestrictions","EnrollmentStatusPage","DeviceConfiguration","AdministrativeTemplates","SettingsCatalog","CompliancePolicies")
|
||||||
GroupId = "PolicySets"
|
GroupId = "PolicySets"
|
||||||
|
ExpandAssignmentsList = $false # expand is not allowed, IsAssigned is set in PostListCommand
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -485,6 +496,8 @@ function Invoke-InitializeModule
|
|||||||
# Property that needs to be updated on the Compliance Policy
|
# Property that needs to be updated on the Compliance Policy
|
||||||
# deviceManagement/managementConditionStatements/$obj.conditionStatementId
|
# deviceManagement/managementConditionStatements/$obj.conditionStatementId
|
||||||
|
|
||||||
|
# Location objects support removed from Intune
|
||||||
|
<#
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
Title = "Locations"
|
Title = "Locations"
|
||||||
Id = "Locations"
|
Id = "Locations"
|
||||||
@@ -495,6 +508,7 @@ function Invoke-InitializeModule
|
|||||||
ImportOrder = 30
|
ImportOrder = 30
|
||||||
GroupId = "CompliancePolicies"
|
GroupId = "CompliancePolicies"
|
||||||
})
|
})
|
||||||
|
#>
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
Title = "Settings Catalog"
|
Title = "Settings Catalog"
|
||||||
@@ -526,6 +540,8 @@ function Invoke-InitializeModule
|
|||||||
#expand=roleassignments
|
#expand=roleassignments
|
||||||
PropertiesToRemoveForUpdate = @('isBuiltInRoleDefinition','isBuiltIn','roleAssignments') ### !!! ToDo: Add support for roleAssignments
|
PropertiesToRemoveForUpdate = @('isBuiltInRoleDefinition','isBuiltIn','roleAssignments') ### !!! ToDo: Add support for roleAssignments
|
||||||
GroupId = "TenantAdmin"
|
GroupId = "TenantAdmin"
|
||||||
|
ExpandAssignments = $false
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -539,6 +555,7 @@ function Invoke-InitializeModule
|
|||||||
ImportOrder = 10
|
ImportOrder = 10
|
||||||
DocumentAll = $true
|
DocumentAll = $true
|
||||||
GroupId = "TenantAdmin"
|
GroupId = "TenantAdmin"
|
||||||
|
ExpandAssignmentsList = $false # Adds the assignmnets property but always empty
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -554,6 +571,7 @@ function Invoke-InitializeModule
|
|||||||
PostCopyCommand = { Start-PostCopyNotifications @args }
|
PostCopyCommand = { Start-PostCopyNotifications @args }
|
||||||
PropertiesToRemoveForUpdate = @('defaultLocale','localizedNotificationMessages') ### !!! ToDo: Add support for localizedNotificationMessages
|
PropertiesToRemoveForUpdate = @('defaultLocale','localizedNotificationMessages') ### !!! ToDo: Add support for localizedNotificationMessages
|
||||||
GroupId = "CompliancePolicies"
|
GroupId = "CompliancePolicies"
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
# This has some pre-reqs for working!
|
# This has some pre-reqs for working!
|
||||||
@@ -593,6 +611,7 @@ function Invoke-InitializeModule
|
|||||||
ImportOrder = 15
|
ImportOrder = 15
|
||||||
GroupId = "TenantAdmin"
|
GroupId = "TenantAdmin"
|
||||||
PropertiesToRemoveForUpdate = @('platform')
|
PropertiesToRemoveForUpdate = @('platform')
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -749,19 +768,34 @@ function Set-EMViewPanel
|
|||||||
$btnRefresh.SetValue([System.Windows.Controls.Grid]::ColumnProperty,$grdTitle.ColumnDefinitions.Count - 1)
|
$btnRefresh.SetValue([System.Windows.Controls.Grid]::ColumnProperty,$grdTitle.ColumnDefinitions.Count - 1)
|
||||||
$btnRefresh.Margin = "0,0,5,3"
|
$btnRefresh.Margin = "0,0,5,3"
|
||||||
$btnRefresh.Cursor = "Hand"
|
$btnRefresh.Cursor = "Hand"
|
||||||
|
$btnRefresh.Name = "btnRefresh"
|
||||||
$btnRefresh.Focusable = $false
|
$btnRefresh.Focusable = $false
|
||||||
$grdTitle.Children.Add($btnRefresh) | Out-Null
|
$grdTitle.Children.Add($btnRefresh) | Out-Null
|
||||||
|
|
||||||
$tooltip = [System.Windows.Controls.ToolTip]::new()
|
$tooltip = [System.Windows.Controls.ToolTip]::new()
|
||||||
$tooltip.Content = "Refresh"
|
$tooltip.Content = "Refresh all objects"
|
||||||
|
[System.Windows.Controls.ToolTipService]::SetToolTip($btnRefresh, $tooltip)
|
||||||
|
|
||||||
|
$panel.RegisterName($btnRefresh.Name, $btnRefresh)
|
||||||
|
|
||||||
|
$tooltip = [System.Windows.Controls.ToolTip]::new()
|
||||||
|
$tooltip.Content = "Refresh objects"
|
||||||
|
|
||||||
[System.Windows.Controls.ToolTipService]::SetToolTip($btnRefresh, $tooltip)
|
[System.Windows.Controls.ToolTipService]::SetToolTip($btnRefresh, $tooltip)
|
||||||
|
|
||||||
$btnRefresh.Add_Click({
|
$btnRefresh.Add_Click({
|
||||||
# ToDo: Move this to view view object
|
$txtFilterText = $null
|
||||||
$txtFilter = $this.Parent.FindName("txtFilter")
|
$txtFilter = $this.Parent.FindName("txtFilter")
|
||||||
if($txtFilter) { $txtFilter.Text = "" }
|
if($txtFilter) { $txtFilterText = $txtFilter.Text } #= "" }
|
||||||
|
|
||||||
|
Show-GraphObjects $txtFilterText
|
||||||
|
|
||||||
|
if($txtFilterText -and $txtFilter)
|
||||||
|
{
|
||||||
|
$txtFilter.Text = $txtFilterText
|
||||||
|
Invoke-FilterBoxChanged $txtFilter
|
||||||
|
}
|
||||||
|
|
||||||
Show-GraphObjects
|
|
||||||
Write-Status ""
|
Write-Status ""
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -782,11 +816,29 @@ function Set-EMViewPanel
|
|||||||
$graphObjects | ForEach-Object { $global:dgObjects.ItemsSource.AddNewItem($_) | Out-Null }
|
$graphObjects | ForEach-Object { $global:dgObjects.ItemsSource.AddNewItem($_) | Out-Null }
|
||||||
$global:dgObjects.ItemsSource.CommitNew()
|
$global:dgObjects.ItemsSource.CommitNew()
|
||||||
Set-GraphPagesButtonStatus
|
Set-GraphPagesButtonStatus
|
||||||
Invoke-FilterBoxChanged $global:txtFilter -ForceUpdate
|
Invoke-FilterBoxChanged $global:txtFilter
|
||||||
Write-Status ""
|
Write-Status ""
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Invoke-GraphObjectsChanged
|
||||||
|
{
|
||||||
|
$btnRefresh = $global:EMViewObject.ViewPanel.FindName("btnRefresh")
|
||||||
|
|
||||||
|
if($btnRefresh)
|
||||||
|
{
|
||||||
|
$tooltip = [System.Windows.Controls.ToolTipService]::GetToolTip($btnRefresh)
|
||||||
|
if($global:lstMenuItems.SelectedItem.QuerySearch -eq $true)
|
||||||
|
{
|
||||||
|
$tooltip.Content = "Refresh objects based on filter. Note: Only filtered objects will be returned. Clear filter and press refresh to reload other objects"
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$tooltip.Content = "Refresh all objects"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Invoke-EMSelectedItemsChanged
|
function Invoke-EMSelectedItemsChanged
|
||||||
{
|
{
|
||||||
$hasSelectedItems = ($global:dgObjects.ItemsSource | Where IsSelected -eq $true) -or ($null -ne $global:dgObjects.SelectedItem)
|
$hasSelectedItems = ($global:dgObjects.ItemsSource | Where IsSelected -eq $true) -or ($null -ne $global:dgObjects.SelectedItem)
|
||||||
@@ -2132,6 +2184,16 @@ function Update-EMPolicySetAssignment
|
|||||||
Invoke-GraphRequest -Url $api -HttpMethod "POST" -Content $json
|
Invoke-GraphRequest -Url $api -HttpMethod "POST" -Content $json
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Start-PostListPolicySets
|
||||||
|
{
|
||||||
|
param($objList, $objectType)
|
||||||
|
|
||||||
|
foreach($obj in $objList)
|
||||||
|
{
|
||||||
|
$obj | Add-Member -MemberType NoteProperty -Name "IsAssigned" -Value ($obj.Object.status -ne "notAssigned")
|
||||||
|
}
|
||||||
|
$objList
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#endregion Locations
|
#endregion Locations
|
||||||
@@ -2710,6 +2772,43 @@ function Start-PreImportConditionalAccess
|
|||||||
$obj.state = $global:cbImportCAState.SelectedValue
|
$obj.state = $global:cbImportCAState.SelectedValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Start-PostExportConditionalAccess
|
||||||
|
{
|
||||||
|
param($obj, $objectType, $path)
|
||||||
|
|
||||||
|
$ids = @()
|
||||||
|
foreach($id in ($obj.conditions.users.includeGroups + $obj.conditions.users.excludeGroups))
|
||||||
|
{
|
||||||
|
if($id -in $ids) { continue }
|
||||||
|
elseif($id -eq "GuestsOrExternalUsers") { continue }
|
||||||
|
elseif($id -eq "All") { continue }
|
||||||
|
elseif($id -eq "None") { continue }
|
||||||
|
|
||||||
|
$ids += $id
|
||||||
|
Add-GraphMigrationObject $id "/groups" "Group"
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach($id in ($obj.conditions.users.includeUsers +$obj.conditions.users.excludeUsers))
|
||||||
|
{
|
||||||
|
if($id -in $ids) { continue }
|
||||||
|
elseif($id -eq "GuestsOrExternalUsers") { continue }
|
||||||
|
elseif($id -eq "All") { continue }
|
||||||
|
elseif($id -eq "None") { continue }
|
||||||
|
|
||||||
|
$ids += $id
|
||||||
|
Add-GraphMigrationObject $id "/users" "User"
|
||||||
|
}
|
||||||
|
|
||||||
|
<#
|
||||||
|
$roleIds = @()
|
||||||
|
foreach($id in ($obj.conditions.users.includeRoles + $obj.conditions.users.excludeRoles))
|
||||||
|
{
|
||||||
|
if($id -in $ids) { continue }
|
||||||
|
$roleIds += $id
|
||||||
|
}
|
||||||
|
#>
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Terms of use
|
#region Terms of use
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ This module is for the Endpoint Info View. It shows read-only objects in Intune
|
|||||||
#>
|
#>
|
||||||
function Get-ModuleVersion
|
function Get-ModuleVersion
|
||||||
{
|
{
|
||||||
'3.1.4'
|
'3.5.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
function Invoke-InitializeModule
|
function Invoke-InitializeModule
|
||||||
@@ -22,7 +22,7 @@ function Invoke-InitializeModule
|
|||||||
ID = "EMInfoGraphAPI"
|
ID = "EMInfoGraphAPI"
|
||||||
ViewPanel = $viewPanel
|
ViewPanel = $viewPanel
|
||||||
AuthenticationID = "MSAL"
|
AuthenticationID = "MSAL"
|
||||||
ItemChanged = { Show-GraphObjects; Invoke-ModuleFunction "Invoke-GraphObjectsChanged"; Write-Status ""}
|
ItemChanged = { Show-GraphObjects -ObjectTypeChanged; Invoke-ModuleFunction "Invoke-GraphObjectsChanged"; Write-Status ""}
|
||||||
Activating = { Invoke-EMInfoActivatingView }
|
Activating = { Invoke-EMInfoActivatingView }
|
||||||
Authentication = (Get-MSALAuthenticationObject)
|
Authentication = (Get-MSALAuthenticationObject)
|
||||||
Authenticate = { Invoke-EMInfoAuthenticateToMSAL }
|
Authenticate = { Invoke-EMInfoAuthenticateToMSAL }
|
||||||
@@ -41,6 +41,7 @@ function Invoke-InitializeModule
|
|||||||
ShowButtons = @("Export","View")
|
ShowButtons = @("Export","View")
|
||||||
Permissons=@("DeviceManagementConfiguration.ReadWrite.All")
|
Permissons=@("DeviceManagementConfiguration.ReadWrite.All")
|
||||||
Icon="EndpointSecurity"
|
Icon="EndpointSecurity"
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -51,6 +52,7 @@ function Invoke-InitializeModule
|
|||||||
API = "/deviceManagement/androidManagedStoreAccountEnterpriseSettings"
|
API = "/deviceManagement/androidManagedStoreAccountEnterpriseSettings"
|
||||||
ShowButtons = @("Export","View")
|
ShowButtons = @("Export","View")
|
||||||
Permissons=@("DeviceManagementConfiguration.ReadWrite.All")
|
Permissons=@("DeviceManagementConfiguration.ReadWrite.All")
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -61,6 +63,7 @@ function Invoke-InitializeModule
|
|||||||
ShowButtons = @("Export","View")
|
ShowButtons = @("Export","View")
|
||||||
Permissons=@("DeviceManagementConfiguration.ReadWrite.All")
|
Permissons=@("DeviceManagementConfiguration.ReadWrite.All")
|
||||||
Icon = "AndroidCOWP"
|
Icon = "AndroidCOWP"
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -71,6 +74,7 @@ function Invoke-InitializeModule
|
|||||||
API = "/deviceAppManagement/vppTokens"
|
API = "/deviceAppManagement/vppTokens"
|
||||||
ShowButtons = @("Export","View")
|
ShowButtons = @("Export","View")
|
||||||
Permissons=@("DeviceManagementConfiguration.ReadWrite.All")
|
Permissons=@("DeviceManagementConfiguration.ReadWrite.All")
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
Add-ViewItem (New-Object PSObject -Property @{
|
Add-ViewItem (New-Object PSObject -Property @{
|
||||||
@@ -81,8 +85,8 @@ function Invoke-InitializeModule
|
|||||||
API = "/deviceManagement/depOnboardingSettings/?`$top=100"
|
API = "/deviceManagement/depOnboardingSettings/?`$top=100"
|
||||||
ShowButtons = @("Export","View")
|
ShowButtons = @("Export","View")
|
||||||
Permissons=@("DeviceManagementServiceConfig.ReadWrite.All")
|
Permissons=@("DeviceManagementServiceConfig.ReadWrite.All")
|
||||||
|
ExpandAssignmentsList = $false
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Invoke-EMInfoActivatingView
|
function Invoke-EMInfoActivatingView
|
||||||
|
|||||||
+532
-313
File diff suppressed because it is too large
Load Diff
+434
-59
@@ -10,7 +10,7 @@ This module manages Microsoft Grap fuctions like calling APIs, managing graph ob
|
|||||||
#>
|
#>
|
||||||
function Get-ModuleVersion
|
function Get-ModuleVersion
|
||||||
{
|
{
|
||||||
'3.4.0'
|
'3.5.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
$global:MSGraphGlobalApps = @(
|
$global:MSGraphGlobalApps = @(
|
||||||
@@ -61,6 +61,12 @@ function Invoke-InitializeModule
|
|||||||
Values = @()
|
Values = @()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
$global:appSettingSections += (New-Object PSObject -Property @{
|
||||||
|
Title = "MS Graph General"
|
||||||
|
Id = "GraphGeneral"
|
||||||
|
Values = @()
|
||||||
|
})
|
||||||
|
|
||||||
Add-SettingsObject (New-Object PSObject -Property @{
|
Add-SettingsObject (New-Object PSObject -Property @{
|
||||||
Title = "Root folder"
|
Title = "Root folder"
|
||||||
Key = "RootFolder"
|
Key = "RootFolder"
|
||||||
@@ -132,23 +138,6 @@ function Invoke-InitializeModule
|
|||||||
Description = "Default value for Import Scope (Tags) when importing objects"
|
Description = "Default value for Import Scope (Tags) when importing objects"
|
||||||
}) "ImportExport"
|
}) "ImportExport"
|
||||||
|
|
||||||
Add-SettingsObject (New-Object PSObject -Property @{
|
|
||||||
Title = "Show Delete button"
|
|
||||||
Key = "EMAllowDelete"
|
|
||||||
Type = "Boolean"
|
|
||||||
DefaultValue = $false
|
|
||||||
Description = "Allow deleting individual objectes"
|
|
||||||
}) "ImportExport"
|
|
||||||
|
|
||||||
Add-SettingsObject (New-Object PSObject -Property @{
|
|
||||||
Title = "Show Bulk Delete "
|
|
||||||
Key = "EMAllowBulkDelete"
|
|
||||||
Type = "Boolean"
|
|
||||||
DefaultValue = $false
|
|
||||||
Description = "Allow using bulk delete to delete all objects of selected types"
|
|
||||||
}) "ImportExport"
|
|
||||||
|
|
||||||
|
|
||||||
Add-SettingsObject (New-Object PSObject -Property @{
|
Add-SettingsObject (New-Object PSObject -Property @{
|
||||||
Title = "Allow update on import (Preview)"
|
Title = "Allow update on import (Preview)"
|
||||||
Key = "AllowUpdate"
|
Key = "AllowUpdate"
|
||||||
@@ -157,7 +146,6 @@ function Invoke-InitializeModule
|
|||||||
Description = "This will enable the option to update/replace an existing object during import"
|
Description = "This will enable the option to update/replace an existing object during import"
|
||||||
}) "ImportExport"
|
}) "ImportExport"
|
||||||
|
|
||||||
|
|
||||||
Add-SettingsObject (New-Object PSObject -Property @{
|
Add-SettingsObject (New-Object PSObject -Property @{
|
||||||
Title = "Add ID to export file"
|
Title = "Add ID to export file"
|
||||||
Key = "AddIDToExportFile"
|
Key = "AddIDToExportFile"
|
||||||
@@ -171,15 +159,15 @@ function Invoke-InitializeModule
|
|||||||
Key = "UseBatchAPI"
|
Key = "UseBatchAPI"
|
||||||
Type = "Boolean"
|
Type = "Boolean"
|
||||||
DefaultValue = $false
|
DefaultValue = $false
|
||||||
Description = "This will use batch API to call up to extport 20 objects on each API call"
|
Description = "This will use batch API to export up to 20 objects on each API call"
|
||||||
}) "ImportExport"
|
}) "ImportExport"
|
||||||
|
|
||||||
Add-SettingsObject (New-Object PSObject -Property @{
|
Add-SettingsObject (New-Object PSObject -Property @{
|
||||||
Title = "Refresh Objects after copy"
|
Title = "Resolve reference info"
|
||||||
Key = "RefreshObjectsAfterCopy"
|
Key = "ResolveReferenceInfo"
|
||||||
Type = "Boolean"
|
Type = "Boolean"
|
||||||
DefaultValue = $true
|
DefaultValue = $true
|
||||||
Description = "This will refresh all objects when after a copy. If this is disabled, the list must be refreshed manually to see the new objects. Default is true"
|
Description = "This will export/import info for referenced/navigation properties eg certificates in VPN profiles etc."
|
||||||
}) "ImportExport"
|
}) "ImportExport"
|
||||||
|
|
||||||
Add-SettingsObject (New-Object PSObject -Property @{
|
Add-SettingsObject (New-Object PSObject -Property @{
|
||||||
@@ -202,6 +190,38 @@ function Invoke-InitializeModule
|
|||||||
Type = "String"
|
Type = "String"
|
||||||
Description = "Certificate for Azure App"
|
Description = "Certificate for Azure App"
|
||||||
}) "GraphSilent"
|
}) "GraphSilent"
|
||||||
|
|
||||||
|
Add-SettingsObject (New-Object PSObject -Property @{
|
||||||
|
Title = "Refresh Objects after copy"
|
||||||
|
Key = "RefreshObjectsAfterCopy"
|
||||||
|
Type = "Boolean"
|
||||||
|
DefaultValue = $true
|
||||||
|
Description = "This will refresh all objects when after a copy. If this is disabled, the list must be refreshed manually to see the new objects. Default is true"
|
||||||
|
}) "GraphGeneral"
|
||||||
|
|
||||||
|
Add-SettingsObject (New-Object PSObject -Property @{
|
||||||
|
Title = "Show Delete button"
|
||||||
|
Key = "EMAllowDelete"
|
||||||
|
Type = "Boolean"
|
||||||
|
DefaultValue = $false
|
||||||
|
Description = "Allow deleting individual objectes"
|
||||||
|
}) "GraphGeneral"
|
||||||
|
|
||||||
|
Add-SettingsObject (New-Object PSObject -Property @{
|
||||||
|
Title = "Show Bulk Delete "
|
||||||
|
Key = "EMAllowBulkDelete"
|
||||||
|
Type = "Boolean"
|
||||||
|
DefaultValue = $false
|
||||||
|
Description = "Allow using bulk delete to delete all objects of selected types"
|
||||||
|
}) "GraphGeneral"
|
||||||
|
|
||||||
|
Add-SettingsObject (New-Object PSObject -Property @{
|
||||||
|
Title = "Expand assignments"
|
||||||
|
Key = "ExpandAssignments"
|
||||||
|
Type = "Boolean"
|
||||||
|
DefaultValue = $false
|
||||||
|
Description = "Expand assignments when listing objects. This can be used in custom columns based on assignment info"
|
||||||
|
}) "GraphGeneral"
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-GraphAppInfo
|
function Get-GraphAppInfo
|
||||||
@@ -210,13 +230,8 @@ function Get-GraphAppInfo
|
|||||||
|
|
||||||
if($global:hideUI -eq $true)
|
if($global:hideUI -eq $true)
|
||||||
{
|
{
|
||||||
# Set app info from custom settings
|
# Taken care of by authentication function
|
||||||
$appObj = New-Object PSObject -Property @{
|
return
|
||||||
ClientId = Get-SettingValue "$($PreFix)CustomAppId"
|
|
||||||
TenantId = $global:silentTenantId
|
|
||||||
RedirectUri = Get-SettingValue "$($PreFix)CustomAppRedirect"
|
|
||||||
Authority = Get-SettingValue "$($PreFix)CustomAuthority"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$graphAppId = Get-SettingValue $settingId
|
$graphAppId = Get-SettingValue $settingId
|
||||||
@@ -288,8 +303,8 @@ function Invoke-GraphRequest
|
|||||||
|
|
||||||
$ODataMetadata = "full", # full, minimal, none or skip
|
$ODataMetadata = "full", # full, minimal, none or skip
|
||||||
|
|
||||||
[ValidateSet("BETA","v1.0")]
|
[ValidateSet("beta","v1.0")]
|
||||||
$GraphVersion = "BETA",
|
$GraphVersion = "beta",
|
||||||
|
|
||||||
[switch]
|
[switch]
|
||||||
$AllPages,
|
$AllPages,
|
||||||
@@ -452,7 +467,9 @@ function Get-GraphObjects
|
|||||||
[switch]
|
[switch]
|
||||||
$AllPages,
|
$AllPages,
|
||||||
[switch]
|
[switch]
|
||||||
$SingleObject)
|
$SingleObject,
|
||||||
|
[string]
|
||||||
|
$filter)
|
||||||
|
|
||||||
$params = @{}
|
$params = @{}
|
||||||
if($objectType.ODataMetadata)
|
if($objectType.ODataMetadata)
|
||||||
@@ -486,7 +503,7 @@ function Get-GraphObjects
|
|||||||
if($SinglePage -eq $true)
|
if($SinglePage -eq $true)
|
||||||
{
|
{
|
||||||
#Use default page size or use below for a specific page size for testing
|
#Use default page size or use below for a specific page size for testing
|
||||||
#$params.Add("pageSize",100)
|
#$params.Add("pageSize",10) #!!!
|
||||||
}
|
}
|
||||||
elseif($SingleObject -ne $true -and $SinglePage -ne $true)
|
elseif($SingleObject -ne $true -and $SinglePage -ne $true)
|
||||||
{
|
{
|
||||||
@@ -498,14 +515,36 @@ function Get-GraphObjects
|
|||||||
$url = $script:nextGraphPage
|
$url = $script:nextGraphPage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($SingleObject -ne $true -and (Get-SettingValue "ExpandAssignments") -eq $true -and $objectType.ExpandAssignmentsList -ne $false)
|
||||||
|
{
|
||||||
|
# Expand assignments so they can be used in custom columns
|
||||||
|
if(($url.IndexOf('expand',[System.StringComparison]::InvariantCultureIgnoreCase)) -eq -1)
|
||||||
|
{
|
||||||
|
$url += (?: (($url.IndexOf('?')) -eq -1) "?" "&")
|
||||||
|
$url = "$($url)`$expand=assignments"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($script:multipleGraphPages -eq $true -and $SingleObject -ne $true -and $filter -and $objectType.QuerySearch -eq $true)
|
||||||
|
{
|
||||||
|
# QuerySearch is only reqired when there are more pages to load
|
||||||
|
if(($url.IndexOf('search',[System.StringComparison]::InvariantCultureIgnoreCase)) -eq -1)
|
||||||
|
{
|
||||||
|
$url += (?: (($url.IndexOf('?')) -eq -1) "?" "&")
|
||||||
|
$url = "$($url)`$search=`"$($filter)`""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$graphObjects = Invoke-GraphRequest -Url $url @params
|
$graphObjects = Invoke-GraphRequest -Url $url @params
|
||||||
if($SinglePage -eq $true -or $AllPages -eq $true)
|
if($SinglePage -eq $true -or $AllPages -eq $true)
|
||||||
{
|
{
|
||||||
$script:nextGraphPage = $graphObjects.'@odata.nextLink'
|
$script:nextGraphPage = $graphObjects.'@odata.nextLink'
|
||||||
|
if($null -eq $script:multipleGraphPages)
|
||||||
|
{
|
||||||
|
$script:multipleGraphPages = $null -ne $script:nextGraphPage
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if($graphObjects -and ($graphObjects | GM -Name Value -MemberType NoteProperty))
|
if($graphObjects -and ($graphObjects | GM -Name Value -MemberType NoteProperty))
|
||||||
{
|
{
|
||||||
$retObjects = $graphObjects.Value
|
$retObjects = $graphObjects.Value
|
||||||
@@ -515,7 +554,7 @@ function Get-GraphObjects
|
|||||||
$retObjects = $graphObjects
|
$retObjects = $graphObjects
|
||||||
}
|
}
|
||||||
|
|
||||||
$graphObjects = Add-GraphObectProperties $retObjects $objectType $property $exclude $SortProperty
|
$graphObjects = Add-GraphObjectProperties $retObjects $objectType $property $exclude $SortProperty
|
||||||
|
|
||||||
if($SingleObject -ne $true -and $objectType.PostListCommand)
|
if($SingleObject -ne $true -and $objectType.PostListCommand)
|
||||||
{
|
{
|
||||||
@@ -525,7 +564,7 @@ function Get-GraphObjects
|
|||||||
$graphObjects
|
$graphObjects
|
||||||
}
|
}
|
||||||
|
|
||||||
function Add-GraphObectProperties
|
function Add-GraphObjectProperties
|
||||||
{
|
{
|
||||||
param($graphObjects,
|
param($graphObjects,
|
||||||
$objectType,
|
$objectType,
|
||||||
@@ -548,6 +587,8 @@ function Add-GraphObectProperties
|
|||||||
$retObjects = $graphObjects
|
$retObjects = $graphObjects
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$getAssignmentInfo = ((Get-SettingValue "ExpandAssignments") -eq $true -and $objectType.ExpandAssignmentsList -ne $false)
|
||||||
|
|
||||||
foreach($graphObject in $retObjects)
|
foreach($graphObject in $retObjects)
|
||||||
{
|
{
|
||||||
$params = @{}
|
$params = @{}
|
||||||
@@ -560,6 +601,15 @@ function Add-GraphObectProperties
|
|||||||
$objTmp | Add-Member -NotePropertyName "ObjectType" -NotePropertyValue $objectType
|
$objTmp | Add-Member -NotePropertyName "ObjectType" -NotePropertyValue $objectType
|
||||||
$objects += $objTmp
|
$objects += $objTmp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($null -ne $graphObject.isAssigned)
|
||||||
|
{
|
||||||
|
$objTmp | Add-Member -NotePropertyName "IsAssigned" -NotePropertyValue $graphObject.isAssigned
|
||||||
|
}
|
||||||
|
elseif($getAssignmentInfo)
|
||||||
|
{
|
||||||
|
$objTmp | Add-Member -NotePropertyName "IsAssigned" -NotePropertyValue (($graphObject.assignments | measure).Count -gt 0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($objects.Count -gt 0 -and $SortProperty -and ($objects[0] | GM -MemberType NoteProperty -Name $SortProperty))
|
if($objects.Count -gt 0 -and $SortProperty -and ($objects[0] | GM -MemberType NoteProperty -Name $SortProperty))
|
||||||
@@ -572,8 +622,15 @@ function Add-GraphObectProperties
|
|||||||
|
|
||||||
function Show-GraphObjects
|
function Show-GraphObjects
|
||||||
{
|
{
|
||||||
|
param($filter, [switch]$ObjectTypeChanged)
|
||||||
|
|
||||||
$global:curObjectType = $global:lstMenuItems.SelectedItem
|
$global:curObjectType = $global:lstMenuItems.SelectedItem
|
||||||
|
|
||||||
|
if($ObjectTypeChanged -eq $true)
|
||||||
|
{
|
||||||
|
$script:multipleGraphPages = $null
|
||||||
|
}
|
||||||
|
|
||||||
Clear-GraphObjects
|
Clear-GraphObjects
|
||||||
|
|
||||||
if(-not $global:MSALToken)
|
if(-not $global:MSALToken)
|
||||||
@@ -585,7 +642,17 @@ function Show-GraphObjects
|
|||||||
}
|
}
|
||||||
elseif($global:curObjectType.'@AccessType' -eq "None")
|
elseif($global:curObjectType.'@AccessType' -eq "None")
|
||||||
{
|
{
|
||||||
$global:txtNotLoggedIn.Content = "You don't have the required permissons to access $($global:curObjectType.Title).`n`nRequired perimssons: $($global:curObjectType.Permissons)"
|
$requiredPermissions = ($global:curObjectType.Permissons -join ",")
|
||||||
|
$missingScopes = ?? $global:curObjectType.'@MissingScopes' $requiredPermissions
|
||||||
|
if($requiredPermissions -ne $missingScopes)
|
||||||
|
{
|
||||||
|
$requiredPermissions = "`nRequired permissions: $requiredPermissions"
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$requiredPermissions = ""
|
||||||
|
}
|
||||||
|
$global:txtNotLoggedIn.Content = "You don't have the required permissons to access $($global:curObjectType.Title).$($requiredPermissions)`n`Missing perimssons: $missingScopes`n`nRequest consent from the 'Request Consent' link in the user login info`nor`nDisable the 'Use Default Permissions' setting to trigger consent prompt.`nNote: Changing the 'Use Default Permissions' setting will require a restart of the app`nand a 'manual' login"
|
||||||
$global:grdNotLoggedIn.Visibility = "Visible"
|
$global:grdNotLoggedIn.Visibility = "Visible"
|
||||||
$global:grdData.Visibility = "Collapsed"
|
$global:grdData.Visibility = "Collapsed"
|
||||||
return
|
return
|
||||||
@@ -593,7 +660,7 @@ function Show-GraphObjects
|
|||||||
$global:grdNotLoggedIn.Visibility = "Collapsed"
|
$global:grdNotLoggedIn.Visibility = "Collapsed"
|
||||||
$global:grdData.Visibility = "Visible"
|
$global:grdData.Visibility = "Visible"
|
||||||
|
|
||||||
# Always show Import is an item is selected
|
# Always show Import if an item is selected
|
||||||
$global:btnImport.IsEnabled = $global:lstMenuItems.SelectedItem -ne $null
|
$global:btnImport.IsEnabled = $global:lstMenuItems.SelectedItem -ne $null
|
||||||
|
|
||||||
if(-not $global:lstMenuItems.SelectedItem) { return }
|
if(-not $global:lstMenuItems.SelectedItem) { return }
|
||||||
@@ -614,7 +681,7 @@ function Show-GraphObjects
|
|||||||
|
|
||||||
$script:nextGraphPage = $null
|
$script:nextGraphPage = $null
|
||||||
|
|
||||||
$graphObjects = @(Get-GraphObjects -property $global:curObjectType.ViewProperties -objectType $global:curObjectType -SinglePage)
|
$graphObjects = @(Get-GraphObjects -property $global:curObjectType.ViewProperties -objectType $global:curObjectType -SinglePage -Filter $filter)
|
||||||
|
|
||||||
$dgObjects.AutoGenerateColumns = $false
|
$dgObjects.AutoGenerateColumns = $false
|
||||||
$dgObjects.Columns.Clear()
|
$dgObjects.Columns.Clear()
|
||||||
@@ -857,7 +924,7 @@ function Start-GraphPreImport
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Remove OData properties
|
# Remove OData properties
|
||||||
foreach($odataProp in ($obj.PSObject.Properties | Where { $_.Name -like "*@Odata*Link" -or $_.Name -like "*@odata.context" -or $_.Name -like "*@odata.id" -or ($_.Name -like "*@odata.type" -and $_.Name -ne "@odata.type")}))
|
foreach($odataProp in ($obj.PSObject.Properties | Where { $_.Name -like "*@Odata*Link" -or $_.Name -like "*@odata.context" -or $_.Name -like "*@odata.id" -or ($_.Name -like "*@odata.type" -and $_.Name -ne "@odata.type")})) # -or $_.Name -like "#CustomRef*"
|
||||||
{
|
{
|
||||||
$removeProperties += $odataProp.Name
|
$removeProperties += $odataProp.Name
|
||||||
}
|
}
|
||||||
@@ -890,10 +957,11 @@ function Get-GraphMetaData
|
|||||||
{
|
{
|
||||||
# Graph metadata does not support Content-Length in response so size can not be used to check if it is updated
|
# Graph metadata does not support Content-Length in response so size can not be used to check if it is updated
|
||||||
# There also no other version information in response headers. Use file date to update every week
|
# There also no other version information in response headers. Use file date to update every week
|
||||||
|
Write-Log "Load Graph MetaData file"
|
||||||
$url = "https://graph.microsoft.com/beta/`$metadata"
|
$url = "https://graph.microsoft.com/beta/`$metadata"
|
||||||
$fileFullPath = [Environment]::ExpandEnvironmentVariables("%LOCALAPPDATA%\CloudAPIPowerShellManagement\GraphMetaData.xml")
|
$fileFullPath = [Environment]::ExpandEnvironmentVariables("%LOCALAPPDATA%\CloudAPIPowerShellManagement\GraphMetaData.xml")
|
||||||
$fi = [IO.FileInfo]$fileFullPath
|
$fi = [IO.FileInfo]$fileFullPath
|
||||||
$maxAge = (Get-Date).AddDays(-7)
|
$maxAge = (Get-Date).AddDays(-14)
|
||||||
if($fi.Exists -and ($fi.LastWriteTime -gt $maxAge -or $fi.CreationTime -gt $maxAge))
|
if($fi.Exists -and ($fi.LastWriteTime -gt $maxAge -or $fi.CreationTime -gt $maxAge))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -905,6 +973,7 @@ function Get-GraphMetaData
|
|||||||
|
|
||||||
if(-not $global:metaDataXML)
|
if(-not $global:metaDataXML)
|
||||||
{
|
{
|
||||||
|
Write-Log "Download Graph MetaData file"
|
||||||
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
|
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
|
||||||
$wc = New-Object System.Net.WebClient
|
$wc = New-Object System.Net.WebClient
|
||||||
$wc.Encoding = [System.Text.Encoding]::UTF8
|
$wc.Encoding = [System.Text.Encoding]::UTF8
|
||||||
@@ -1538,6 +1607,7 @@ function Show-GraphImportForm
|
|||||||
$filesToImport = & $global:curObjectType.PreFilesImportCommand $global:curObjectType $filesToImport
|
$filesToImport = & $global:curObjectType.PreFilesImportCommand $global:curObjectType $filesToImport
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$navigationPropObjects = @()
|
||||||
foreach ($fileObj in $filesToImport)
|
foreach ($fileObj in $filesToImport)
|
||||||
{
|
{
|
||||||
if($allowUpdate -and $global:cbImportType.SelectedValue -ne "alwaysImport" -and (Reset-GraphObjet $fileObj $global:dgObjects.ItemsSource))
|
if($allowUpdate -and $global:cbImportType.SelectedValue -ne "alwaysImport" -and (Reset-GraphObjet $fileObj $global:dgObjects.ItemsSource))
|
||||||
@@ -1545,7 +1615,22 @@ function Show-GraphImportForm
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
Import-GraphFile $fileObj
|
$importedObj = Import-GraphFile $fileObj -PassThru
|
||||||
|
if($importedObj -and $global:curObjectType.NavigationProperties -eq $true)
|
||||||
|
{
|
||||||
|
$navigationPropObjects += [PSCustomObject]@{
|
||||||
|
File = $fileObj
|
||||||
|
ImportedObject = $importedObj
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($navigationPropObjects)
|
||||||
|
{
|
||||||
|
foreach($navPropObj in $navigationPropObjects)
|
||||||
|
{
|
||||||
|
Set-GraphNavigationPropertiesFromFile $navPropObj
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Show-GraphObjects
|
Show-GraphObjects
|
||||||
Show-ModalObject
|
Show-ModalObject
|
||||||
@@ -1554,8 +1639,9 @@ function Show-GraphImportForm
|
|||||||
|
|
||||||
Add-XamlEvent $script:importForm "btnGetFiles" "add_click" {
|
Add-XamlEvent $script:importForm "btnGetFiles" "add_click" {
|
||||||
# Used when the user manually updates the path and the press Get Files
|
# Used when the user manually updates the path and the press Get Files
|
||||||
$global:dgObjectsToImport.ItemsSource = @(Get-GraphFileObjects $global:txtImportPath.Text)
|
$path = Expand-FileName $global:txtImportPath.Text
|
||||||
if([IO.Directory]::Exists($global:txtImportPath.Text))
|
$global:dgObjectsToImport.ItemsSource = @(Get-GraphFileObjects $path)
|
||||||
|
if([IO.Directory]::Exists($path))
|
||||||
{
|
{
|
||||||
Save-Setting "" "LastUsedFullPath" $global:txtImportPath.Text
|
Save-Setting "" "LastUsedFullPath" $global:txtImportPath.Text
|
||||||
Set-XamlProperty $script:importForm "lblMigrationTableInfo" "Content" (Get-MigrationTableInfo)
|
Set-XamlProperty $script:importForm "lblMigrationTableInfo" "Content" (Get-MigrationTableInfo)
|
||||||
@@ -1566,7 +1652,8 @@ function Show-GraphImportForm
|
|||||||
|
|
||||||
if($global:txtImportPath.Text)
|
if($global:txtImportPath.Text)
|
||||||
{
|
{
|
||||||
$global:dgObjectsToImport.ItemsSource = @(Get-GraphFileObjects $global:txtImportPath.Text)
|
$path = Expand-FileName $global:txtImportPath.Text
|
||||||
|
$global:dgObjectsToImport.ItemsSource = @(Get-GraphFileObjects $path)
|
||||||
Set-XamlProperty $script:importForm "lblMigrationTableInfo" "Content" (Get-MigrationTableInfo)
|
Set-XamlProperty $script:importForm "lblMigrationTableInfo" "Content" (Get-MigrationTableInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1750,6 +1837,7 @@ function Start-GraphObjectImport
|
|||||||
{
|
{
|
||||||
$filesToImport = & $item.ObjectType.PreFilesImportCommand $item.ObjectType $filesToImport
|
$filesToImport = & $item.ObjectType.PreFilesImportCommand $item.ObjectType $filesToImport
|
||||||
}
|
}
|
||||||
|
$navigationPropObjects = @()
|
||||||
|
|
||||||
foreach ($fileObj in @($filesToImport))
|
foreach ($fileObj in @($filesToImport))
|
||||||
{
|
{
|
||||||
@@ -1766,10 +1854,25 @@ function Start-GraphObjectImport
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
Import-GraphFile $fileObj
|
$importedObj = Import-GraphFile $fileObj -PassThru
|
||||||
|
if($importedObj -and $item.ObjectType.NavigationProperties -eq $true)
|
||||||
|
{
|
||||||
|
$navigationPropObjects += [PSCustomObject]@{
|
||||||
|
File = $fileObj
|
||||||
|
ImportedObject = $importedObj
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$importedObjects++
|
$importedObjects++
|
||||||
}
|
}
|
||||||
Save-Setting "" "LastUsedFullPath" $folder
|
Save-Setting "" "LastUsedFullPath" $folder
|
||||||
|
if($navigationPropObjects)
|
||||||
|
{
|
||||||
|
foreach($navPropObj in $navigationPropObjects)
|
||||||
|
{
|
||||||
|
Set-GraphNavigationPropertiesFromFile $navPropObj
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2010,7 +2113,7 @@ function Get-GraphFileObjects
|
|||||||
|
|
||||||
function Import-GraphFile
|
function Import-GraphFile
|
||||||
{
|
{
|
||||||
param($file, $objectType)
|
param($file, $objectType, [switch]$PassThru)
|
||||||
|
|
||||||
if([IO.File]::Exists($file.FileInfo.FullName) -eq $false)
|
if([IO.File]::Exists($file.FileInfo.FullName) -eq $false)
|
||||||
{
|
{
|
||||||
@@ -2051,6 +2154,11 @@ function Import-GraphFile
|
|||||||
{
|
{
|
||||||
Import-GraphObjectAssignment $newObj $file.ObjectType $objClone.Assignments $file.FileInfo.FullName | Out-Null
|
Import-GraphObjectAssignment $newObj $file.ObjectType $objClone.Assignments $file.FileInfo.FullName | Out-Null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($PassThru -eq $true -and $newObj)
|
||||||
|
{
|
||||||
|
$newObj
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
@@ -2347,7 +2455,8 @@ function Add-GraphMigrationInfo
|
|||||||
if($objType -eq "#microsoft.graph.groupAssignmentTarget" -or
|
if($objType -eq "#microsoft.graph.groupAssignmentTarget" -or
|
||||||
$objType -eq "#microsoft.graph.exclusionGroupAssignmentTarget")
|
$objType -eq "#microsoft.graph.exclusionGroupAssignmentTarget")
|
||||||
{
|
{
|
||||||
Add-GroupMigrationObject $objInfo.groupid
|
#Add-GroupMigrationObject $objInfo.groupid
|
||||||
|
Add-GraphMigrationObject $objInfo.groupid "/groups" "Group"
|
||||||
}
|
}
|
||||||
elseif($objType -eq "#microsoft.graph.allLicensedUsersAssignmentTarget" -or
|
elseif($objType -eq "#microsoft.graph.allLicensedUsersAssignmentTarget" -or
|
||||||
$objType -eq "#microsoft.graph.allDevicesAssignmentTarget")
|
$objType -eq "#microsoft.graph.allDevicesAssignmentTarget")
|
||||||
@@ -2420,6 +2529,8 @@ function Add-GroupMigrationObject
|
|||||||
|
|
||||||
if(-not $path) { return }
|
if(-not $path) { return }
|
||||||
|
|
||||||
|
$path = Expand-FileName $path
|
||||||
|
|
||||||
# Check if group is already processed
|
# Check if group is already processed
|
||||||
$groupObj = Get-GraphMigrationObject $groupId
|
$groupObj = Get-GraphMigrationObject $groupId
|
||||||
if(-not $groupObj)
|
if(-not $groupObj)
|
||||||
@@ -2434,7 +2545,7 @@ function Add-GroupMigrationObject
|
|||||||
if($global:AADObjectCache.ContainsKey($groupId) -eq $false) { $global:AADObjectCache.Add($groupId, $groupObj) }
|
if($global:AADObjectCache.ContainsKey($groupId) -eq $false) { $global:AADObjectCache.Add($groupId, $groupObj) }
|
||||||
|
|
||||||
# Add group to migration file
|
# Add group to migration file
|
||||||
if((Add-GraphMigrationObject $groupObj $path "Group"))
|
if((Add-GraphMigrationObjectToFile $groupObj $path "Group"))
|
||||||
{
|
{
|
||||||
# Export group info to json file for possible import
|
# Export group info to json file for possible import
|
||||||
$grouspPath = Join-Path $path "Groups"
|
$grouspPath = Join-Path $path "Groups"
|
||||||
@@ -2445,6 +2556,46 @@ function Add-GroupMigrationObject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Add-GraphMigrationObject
|
||||||
|
{
|
||||||
|
param($objId, $grapAPI, $objTypeName)
|
||||||
|
|
||||||
|
if(-not $objId) { return }
|
||||||
|
|
||||||
|
$path = Get-GraphMigrationTableFile $global:txtExportPath.Text
|
||||||
|
|
||||||
|
if(-not $path) { return }
|
||||||
|
|
||||||
|
$path = Expand-FileName $path
|
||||||
|
|
||||||
|
# Check if object is already processed
|
||||||
|
$graphObj = Get-GraphMigrationObject $objId
|
||||||
|
if(-not $graphObj)
|
||||||
|
{
|
||||||
|
# Get object info
|
||||||
|
$graphObj = Invoke-GraphRequest "$($grapAPI)/$objId" -ODataMetadata "none"
|
||||||
|
}
|
||||||
|
|
||||||
|
if($graphObj)
|
||||||
|
{
|
||||||
|
# Add object to cache
|
||||||
|
if($global:AADObjectCache.ContainsKey($objId) -eq $false) { $global:AADObjectCache.Add($objId, $ugraphObjserObj) }
|
||||||
|
|
||||||
|
# Add object to migration file
|
||||||
|
if((Add-GraphMigrationObjectToFile $graphObj $path $objTypeName))
|
||||||
|
{
|
||||||
|
if($objTypeName -eq "Group")
|
||||||
|
{
|
||||||
|
# Export group info to json file for possible import
|
||||||
|
$grouspPath = Join-Path $path "Groups"
|
||||||
|
if(-not (Test-Path $grouspPath)) { mkdir -Path $grouspPath -Force -ErrorAction SilentlyContinue | Out-Null }
|
||||||
|
$fileName = "$grouspPath\$((Remove-InvalidFileNameChars $graphObj.displayName)).json"
|
||||||
|
ConvertTo-Json $graphObj -Depth 10 | Out-File $fileName -Force
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Get-GraphMigrationObject
|
function Get-GraphMigrationObject
|
||||||
{
|
{
|
||||||
param($objId)
|
param($objId)
|
||||||
@@ -2458,7 +2609,7 @@ function Get-GraphMigrationObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Adds an object to migration file if not added previously
|
# Adds an object to migration file if not added previously
|
||||||
function Add-GraphMigrationObject
|
function Add-GraphMigrationObjectToFile
|
||||||
{
|
{
|
||||||
param($obj, $path, $objType)
|
param($obj, $path, $objType)
|
||||||
|
|
||||||
@@ -2517,6 +2668,7 @@ function Get-GraphMigrationTableForImport
|
|||||||
$global:GraphMigrationTable = $null
|
$global:GraphMigrationTable = $null
|
||||||
# Migration table must be located in the root of the import path
|
# Migration table must be located in the root of the import path
|
||||||
$path = $global:txtImportPath.Text
|
$path = $global:txtImportPath.Text
|
||||||
|
$path = Expand-FileName $path
|
||||||
|
|
||||||
for($i = 0;$i -lt 2;$i++)
|
for($i = 0;$i -lt 2;$i++)
|
||||||
{
|
{
|
||||||
@@ -2659,7 +2811,7 @@ function Update-JsonForEnvironment
|
|||||||
#region Dependency Functions
|
#region Dependency Functions
|
||||||
function Get-GraphDependencyDefaultObjects
|
function Get-GraphDependencyDefaultObjects
|
||||||
{
|
{
|
||||||
Add-GraphDependencyObjects @("ScopeTags")
|
Add-GraphDependencyObjects @("ScopeTags","AssignmentFilters")
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-GraphDependencyObjects
|
function Get-GraphDependencyObjects
|
||||||
@@ -2772,6 +2924,8 @@ function Export-GraphObjects
|
|||||||
$global:ExportRoot = (Get-XamlProperty $script:exportForm "txtExportPath" "Text")
|
$global:ExportRoot = (Get-XamlProperty $script:exportForm "txtExportPath" "Text")
|
||||||
$folder = Get-GraphObjectFolder $objectType $global:ExportRoot (Get-XamlProperty $script:exportForm "chkAddObjectType" "IsChecked") (Get-XamlProperty $script:exportForm "chkAddCompanyName" "IsChecked")
|
$folder = Get-GraphObjectFolder $objectType $global:ExportRoot (Get-XamlProperty $script:exportForm "chkAddObjectType" "IsChecked") (Get-XamlProperty $script:exportForm "chkAddCompanyName" "IsChecked")
|
||||||
|
|
||||||
|
$folder = Expand-FileName $folder
|
||||||
|
|
||||||
$objectsToExport = @()
|
$objectsToExport = @()
|
||||||
if($Selected -ne $true)
|
if($Selected -ne $true)
|
||||||
{
|
{
|
||||||
@@ -2832,6 +2986,8 @@ function Export-GraphObject
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Add-GraphNavigationProperties $obj $objectType
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if([IO.Directory]::Exists($exportFolder) -eq $false)
|
if([IO.Directory]::Exists($exportFolder) -eq $false)
|
||||||
@@ -2871,6 +3027,177 @@ function Export-GraphObject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<#
|
||||||
|
Update the navigation references for an object
|
||||||
|
#>
|
||||||
|
function Set-GraphNavigationPropertiesFromFile
|
||||||
|
{
|
||||||
|
param($navPropObject)
|
||||||
|
|
||||||
|
if(-not $navPropObject.File -or -not $navPropObject.ImportedObject)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Reload data from file. Some object properties was removed before import...
|
||||||
|
$objFileInfo = (ConvertFrom-Json (Get-Content -LiteralPath $navPropObject.File.FileInfo.FullName -Raw))
|
||||||
|
|
||||||
|
if(-not ($objFileInfo.PSObject.Properties | Where { $_.Name -like "#CustomRef_*" })) { return }
|
||||||
|
|
||||||
|
Set-GraphNavigationProperties $navPropObject.ImportedObject $objFileInfo $navPropObject.File.ObjectType
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function Set-GraphNavigationProperties
|
||||||
|
{
|
||||||
|
param($newObj, $oldObj, $objectType, [switch]$FromOldObject)
|
||||||
|
|
||||||
|
if($objectType.NavigationProperties -ne $true) { return }
|
||||||
|
|
||||||
|
if(-not $newObj -or -not $oldObj -or -not $objectType)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if((Get-SettingValue "ResolveReferenceInfo") -ne $true) { return }
|
||||||
|
|
||||||
|
$entityName = $oldObj.'@odata.type'.Split('.')[-1]
|
||||||
|
|
||||||
|
$nameProp = ?? $objectType.NameProperty "displayName"
|
||||||
|
|
||||||
|
$props = Get-GraphEntityTypeProperties $entityName
|
||||||
|
|
||||||
|
foreach($prop in ($props | Where LocalName -eq "NavigationProperty" ))
|
||||||
|
{
|
||||||
|
# Is this the correct way of filter out Assignments, summaries etc.?
|
||||||
|
if($prop.ContainsTarget -eq $true) { continue }
|
||||||
|
|
||||||
|
if(-not ($oldObj."$($prop.Name)@odata.associationLink")) { continue }
|
||||||
|
|
||||||
|
$associationLink = $oldObj."$($prop.Name)@odata.associationLink" -replace $oldObj.Id,$newObj.Id
|
||||||
|
$refBodyObjs = $null #@()
|
||||||
|
$refObjName = $null
|
||||||
|
$refObjId = $null
|
||||||
|
|
||||||
|
if($FromOldObject -eq $true)
|
||||||
|
{
|
||||||
|
$navProp = Invoke-GraphRequest -URL $oldObj."$($prop.Name)@odata.navigationLink" -ODataMetadata "minimal" -NoError
|
||||||
|
|
||||||
|
if(-not $navProp) { continue }
|
||||||
|
|
||||||
|
$refObjName = Get-GraphObjectName $navProp $navProp
|
||||||
|
$refObjId = $navProp.Id
|
||||||
|
|
||||||
|
$refBodyObjs = ([PSCustomObject]@{
|
||||||
|
"@odata.id" = ("https://$global:MSALGraphEnvironment/beta/$($objectType.API)('$($navProp.Id)')")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(-not ($oldObj."#CustomRef_$($prop.Name)")) { continue } # Not included in the export file
|
||||||
|
|
||||||
|
$idx = $oldObj."#CustomRef_$($prop.Name)".IndexOf("|:|")
|
||||||
|
if($idx -gt -1)
|
||||||
|
{
|
||||||
|
$refObjName = $oldObj."#CustomRef_$($prop.Name)".SubString(0,$idx)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$refObjName = $oldObj."#CustomRef_$($prop.Name)"
|
||||||
|
}
|
||||||
|
|
||||||
|
$refObjects = Invoke-GraphRequest -URL "$($objectType.API)?`$filter=$($nameProp) eq '$($refObjName)'" -NoError
|
||||||
|
|
||||||
|
$objectsFound = ($refObjects.value | measure).Count
|
||||||
|
|
||||||
|
if($objectsFound -eq 1)
|
||||||
|
{
|
||||||
|
# Are there any references that allows multiple ref objects?
|
||||||
|
foreach($refObj in $refObjects.value)
|
||||||
|
{
|
||||||
|
$refBodyObjs = ([PSCustomObject]@{
|
||||||
|
"@odata.id" = ("https://$global:MSALGraphEnvironment/beta/$($objectType.API)('$($refObj.Id)')")
|
||||||
|
})
|
||||||
|
$refObjId = $refObj.Id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif($objectsFound -gt 1)
|
||||||
|
{
|
||||||
|
Write-Log "Multiple objects ($objectsFound) found with $nameProp $refObjName. Skipping reference." 2
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Write-Log "No object found with $nameProp $refObjName" 2
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Log "Add $refObjName ($refObjId) to navigation property $($prop.Name)"
|
||||||
|
|
||||||
|
$body = $refBodyObjs | ConvertTo-Json -Depth 10
|
||||||
|
Invoke-GraphRequest -URL $associationLink -HttpMethod "PUT" -Content $body | Out-Null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
<#
|
||||||
|
Add Navigation Property data to the object so it included in the exported json file
|
||||||
|
#>
|
||||||
|
function Add-GraphNavigationProperties
|
||||||
|
{
|
||||||
|
param($obj, $objType)
|
||||||
|
|
||||||
|
if($objectType.NavigationProperties -ne $true) { return }
|
||||||
|
|
||||||
|
if(-not $obj.'@odata.type') { return }
|
||||||
|
|
||||||
|
if((Get-SettingValue "ResolveReferenceInfo") -ne $true) { return }
|
||||||
|
|
||||||
|
$entityName = $obj.'@odata.type'.Split('.')[-1]
|
||||||
|
|
||||||
|
$props = Get-GraphEntityTypeProperties $entityName
|
||||||
|
|
||||||
|
foreach($prop in ($props | Where LocalName -eq "NavigationProperty" ))
|
||||||
|
{
|
||||||
|
# Is this the correct way of filter out Assignments, summaries etc.?
|
||||||
|
if($prop.ContainsTarget -eq $true) { continue }
|
||||||
|
|
||||||
|
if(-not ($obj."$($prop.Name)@odata.navigationLink")) { continue }
|
||||||
|
$navProp = Invoke-GraphRequest -URL $obj."$($prop.Name)@odata.navigationLink" -ODataMetadata "minimal" -NoError
|
||||||
|
if($navProp)
|
||||||
|
{
|
||||||
|
$value = $null
|
||||||
|
$refType = ""
|
||||||
|
if($navProp.value -is [Object[]])
|
||||||
|
{
|
||||||
|
if($navProp.value.Count -gt 0 -and $navProp.value[0].'@odata.type') { $refType = $navProp.value[0].'@odata.type' }
|
||||||
|
$refValues = @()
|
||||||
|
$navProp.value | ForEach-Object { $refValues += (Get-GraphObjectName $_ $objType) }
|
||||||
|
if($refValues.Count -gt 0)
|
||||||
|
{
|
||||||
|
if(($refValues -join "") -like "*,*")
|
||||||
|
{
|
||||||
|
Write-Log "One or mor referenced objects has the comma (,) character in the name. Cannot add navigation property $($prop.Name)" 3
|
||||||
|
}
|
||||||
|
$value = ($refValues -join ",")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if($navProp.'@odata.type') { $refType = $navProp.'@odata.type' }
|
||||||
|
$value = (Get-GraphObjectName $navProp $objType)
|
||||||
|
}
|
||||||
|
if($refType -and $value)
|
||||||
|
{
|
||||||
|
$value = ($value + "|:|" + $refType)
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj | Add-Member -NotePropertyName "#CustomRef_$($prop.Name)" -NotePropertyValue $value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Get-GraphBatchObjects
|
function Get-GraphBatchObjects
|
||||||
{
|
{
|
||||||
param($objects, $txtNameFilter)
|
param($objects, $txtNameFilter)
|
||||||
@@ -2932,7 +3259,7 @@ function Get-GraphBatchObjects
|
|||||||
if($objectType -and $batchResults.Count -gt 0)
|
if($objectType -and $batchResults.Count -gt 0)
|
||||||
{
|
{
|
||||||
$batchResultsTmp = $batchResults
|
$batchResultsTmp = $batchResults
|
||||||
$batchResults = Add-GraphObectProperties $batchResultsTmp $objectType -property $objectType.ViewProperties
|
$batchResults = Add-GraphObjectProperties $batchResultsTmp $objectType -property $objectType.ViewProperties
|
||||||
|
|
||||||
$curObj = 1
|
$curObj = 1
|
||||||
foreach($obj in $batchResults)
|
foreach($obj in $batchResults)
|
||||||
@@ -3120,6 +3447,8 @@ function Copy-GraphObject
|
|||||||
[System.Windows.MessageBox]::Show("No object selected`n`nSelect the $($global:curObjectType.Title) item you want to copy", "Error", "OK", "Error")
|
[System.Windows.MessageBox]::Show("No object selected`n`nSelect the $($global:curObjectType.Title) item you want to copy", "Error", "OK", "Error")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
$script:copyForm = Initialize-Window ($global:AppRootFolder + "\Xaml\CopyDialog.xaml")
|
||||||
|
if(-not $script:copyForm) { return }
|
||||||
|
|
||||||
$newName = "$((Get-GraphObjectName $dgObjects.SelectedItem $global:curObjectType)) - Copy"
|
$newName = "$((Get-GraphObjectName $dgObjects.SelectedItem $global:curObjectType)) - Copy"
|
||||||
if($global:curObjectType.CopyDefaultName)
|
if($global:curObjectType.CopyDefaultName)
|
||||||
@@ -3127,10 +3456,44 @@ function Copy-GraphObject
|
|||||||
$newName = $global:curObjectType.CopyDefaultName
|
$newName = $global:curObjectType.CopyDefaultName
|
||||||
$dgObjects.SelectedItem.PSObject.Properties | foreach { $newName = $newName -replace "%$($_.Name)%", $dgObjects.SelectedItem."$($_.Name)" }
|
$dgObjects.SelectedItem.PSObject.Properties | foreach { $newName = $newName -replace "%$($_.Name)%", $dgObjects.SelectedItem."$($_.Name)" }
|
||||||
}
|
}
|
||||||
$ret = Show-InputDialog "Copy $($global:curObjectType.Title)" "Select name for the new object" $newName
|
|
||||||
|
Set-XamlProperty $script:copyForm "txtObjectName" "Text" $newName
|
||||||
|
$descriptionProperty = $global:dgObjects.SelectedItem.Object | gm | Where { $_.Name -eq "Description" }
|
||||||
|
if($descriptionProperty)
|
||||||
|
{
|
||||||
|
Set-XamlProperty $script:copyForm "txtObjectDescription" "Text" $global:dgObjects.SelectedItem.Object.Description
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Set-XamlProperty $script:copyForm "txtObjectDescription" "IsEnabled" $false
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:copyForm.Add_ContentRendered({
|
||||||
|
$txtName = $script:copyForm.FindName("txtObjectName")
|
||||||
|
if($txtName)
|
||||||
|
{
|
||||||
|
$txtName.SelectAll();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
Add-XamlEvent $script:copyForm "btnOk" "Add_Click" -scriptBlock ([scriptblock]{
|
||||||
|
$script:copyForm.DialogResult = $true;
|
||||||
|
})
|
||||||
|
|
||||||
|
$script:copyForm.Owner = $global:window
|
||||||
|
$script:copyForm.Icon = $global:Window.Icon
|
||||||
|
$ret = $script:copyForm.ShowDialog()
|
||||||
|
|
||||||
if($ret)
|
if($ret)
|
||||||
{
|
{
|
||||||
|
$newName = Get-XamlProperty $script:copyForm "txtObjectName" "Text"
|
||||||
|
if(-not $newName)
|
||||||
|
{
|
||||||
|
Write-Log "New name cannot be empty. Copy object skipped" 2
|
||||||
|
Write-Status ""
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
# Export profile
|
# Export profile
|
||||||
Write-Status "Export $((Get-GraphObjectName $dgObjects.SelectedItem $global:curObjectType))"
|
Write-Status "Export $((Get-GraphObjectName $dgObjects.SelectedItem $global:curObjectType))"
|
||||||
|
|
||||||
@@ -3138,7 +3501,7 @@ function Copy-GraphObject
|
|||||||
|
|
||||||
if($global:curObjectType.PreCopyCommand)
|
if($global:curObjectType.PreCopyCommand)
|
||||||
{
|
{
|
||||||
if((& $global:curObjectType.PreCopyCommand $exportObj $global:curObjectType $ret))
|
if((& $global:curObjectType.PreCopyCommand $exportObj $global:curObjectType $newName))
|
||||||
{
|
{
|
||||||
if((Get-SettingValue "RefreshObjectsAfterCopy") -eq $true)
|
if((Get-SettingValue "RefreshObjectsAfterCopy") -eq $true)
|
||||||
{
|
{
|
||||||
@@ -3154,15 +3517,22 @@ function Copy-GraphObject
|
|||||||
if($obj)
|
if($obj)
|
||||||
{
|
{
|
||||||
# Import new profile
|
# Import new profile
|
||||||
Set-GraphObjectName $obj $global:curObjectType $ret
|
Set-GraphObjectName $obj $global:curObjectType $newName
|
||||||
|
if((Get-XamlProperty $script:copyForm "txtObjectDescription" "IsEnabled" $false) -eq $true)
|
||||||
|
{
|
||||||
|
$obj.Description = Get-XamlProperty $script:copyForm "txtObjectDescription" "Text"
|
||||||
|
}
|
||||||
|
|
||||||
$newObj = Import-GraphObject $obj $global:curObjectType
|
$newObj = Import-GraphObject $obj $global:curObjectType
|
||||||
if($newObj)
|
if($newObj)
|
||||||
{
|
{
|
||||||
|
Set-GraphNavigationProperties $newObj $exportObj $global:curObjectType -FromOldObject
|
||||||
|
|
||||||
if($global:curObjectType.PostCopyCommand)
|
if($global:curObjectType.PostCopyCommand)
|
||||||
{
|
{
|
||||||
& $global:curObjectType.PostCopyCommand $exportObj $newObj $global:curObjectType
|
& $global:curObjectType.PostCopyCommand $exportObj $newObj $global:curObjectType
|
||||||
}
|
}
|
||||||
|
|
||||||
if((Get-SettingValue "RefreshObjectsAfterCopy") -eq $true)
|
if((Get-SettingValue "RefreshObjectsAfterCopy") -eq $true)
|
||||||
{
|
{
|
||||||
Show-GraphObjects
|
Show-GraphObjects
|
||||||
@@ -3236,7 +3606,7 @@ function Show-GraphObjectInfo
|
|||||||
$descriptionProperty = $global:dgObjects.SelectedItem.Object | gm | Where { $_.Name -eq "Description" }
|
$descriptionProperty = $global:dgObjects.SelectedItem.Object | gm | Where { $_.Name -eq "Description" }
|
||||||
if($descriptionProperty)
|
if($descriptionProperty)
|
||||||
{
|
{
|
||||||
Set-XamlProperty $script:detailsForm "txtObjectDescription" "Text" $descriptionProperty.Value
|
Set-XamlProperty $script:detailsForm "txtObjectDescription" "Text" $global:dgObjects.SelectedItem.Object.Description
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -3612,6 +3982,11 @@ function Get-GraphEntityTypeProperties
|
|||||||
{
|
{
|
||||||
param($entityType, $xml)
|
param($entityType, $xml)
|
||||||
|
|
||||||
|
Get-GraphMetaData
|
||||||
|
|
||||||
|
if(-not $xml) { $xml = $global:metaDataXML }
|
||||||
|
if(-not $xml) { return }
|
||||||
|
|
||||||
$tmpEntity = $xml.SelectSingleNode("//*[name()='EntityType' and @Name='$entityType']")
|
$tmpEntity = $xml.SelectSingleNode("//*[name()='EntityType' and @Name='$entityType']")
|
||||||
if(-not $tmpEntity) { return }
|
if(-not $tmpEntity) { return }
|
||||||
|
|
||||||
@@ -3631,7 +4006,7 @@ function Get-GraphEntityTypeProperties
|
|||||||
[array]::Reverse($entities)
|
[array]::Reverse($entities)
|
||||||
foreach($enitiy in $entities)
|
foreach($enitiy in $entities)
|
||||||
{
|
{
|
||||||
$properties += $enitiy.SelectNodes("*[name()='Property']")
|
$properties += $enitiy.SelectNodes("*[name()='Property' or name()='NavigationProperty']")
|
||||||
}
|
}
|
||||||
|
|
||||||
$properties
|
$properties
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
# Microsoft Authentication Library (MSAL)
|
# Microsoft Authentication Library (MSAL)
|
||||||
|
|
||||||
Microsoft Authentication Library (MSAL) is used for authenticating to Microsoft Graph and other APIs used by the script. Microsoft.Identity.Client.dll** is the library file that contains the authentication functions. This script is depending on the file to be able to authenticate to Microsoft Graph.
|
Microsoft Authentication Library (MSAL) is used for authenticating to Microsoft Graph and other APIs used by the script. **Microsoft.Identity.Client.dll** is the library file that contains the authentication functions. This script is depending on the file to be able to authenticate to Microsoft Graph.
|
||||||
|
|
||||||
See the GitHub repository [MSAL.PS](https://github.com/AzureAD/MSAL.PS) for more information on using MSAL with PowerShell. This script does not use the module directly for various reasons but the MSAL.PS repository is a great source of information and the best place to start for using MSAL with PowerShell.
|
See the GitHub repository [MSAL.PS](https://github.com/AzureAD/MSAL.PS) for more information on using MSAL with PowerShell. This script does not use the module directly for various reasons but the MSAL.PS repository is a great source of information and the best place to start for using MSAL with PowerShell.
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
+2249
-322
File diff suppressed because it is too large
Load Diff
@@ -30,7 +30,7 @@ Before starting the app:
|
|||||||
Before logging on:
|
Before logging on:
|
||||||
|
|
||||||
* The app will use the Intune PowerShell Azure Enterprise Application by default and only use the permissions granted to that appliction. Disable **Use Default Permissions** in Settings to request additional permissions. The will cause a consent prompt if one or more permissions are missing for the app.
|
* The app will use the Intune PowerShell Azure Enterprise Application by default and only use the permissions granted to that appliction. Disable **Use Default Permissions** in Settings to request additional permissions. The will cause a consent prompt if one or more permissions are missing for the app.
|
||||||
**Note:** If the app has not been approved for the organization, a consent prompt will be disablyed.
|
**Note:** If the app has not been approved for the organization, a consent prompt will be displayed.
|
||||||
* Enable **Get Tenant List** in Settings if accessing multiple environments with the same account e.g. a guest account in other tenants. This might cause a Consent prompt
|
* Enable **Get Tenant List** in Settings if accessing multiple environments with the same account e.g. a guest account in other tenants. This might cause a Consent prompt
|
||||||
|
|
||||||
Start the script by running **Start.cmd**, **Start-WithJson.cmd**, **Start-WithConsole.cmd** or **Start-IntuneManagement.ps1**. **Start-WithConsole.cmd** will leave the command prompt window open so you can see the log while running the app.
|
Start the script by running **Start.cmd**, **Start-WithJson.cmd**, **Start-WithConsole.cmd** or **Start-IntuneManagement.ps1**. **Start-WithConsole.cmd** will leave the command prompt window open so you can see the log while running the app.
|
||||||
@@ -282,7 +282,7 @@ Start-WithJson.cmd is included as an example on how to start the script with jso
|
|||||||
* .Net 4.7
|
* .Net 4.7
|
||||||
* PowerShell 5.1
|
* PowerShell 5.1
|
||||||
* MSAL
|
* MSAL
|
||||||
* Microsoft.Identity.Client.dll version 4.29.0.0 is included in this version
|
* Microsoft.Identity.Client.dll version 4.42.1.0 is included in this version
|
||||||
* License and permissions in Azure to manage objects in Intune and Azure
|
* License and permissions in Azure to manage objects in Intune and Azure
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|||||||
@@ -1,4 +1,78 @@
|
|||||||
# Release Notes
|
# Release Notes
|
||||||
|
## 3.5.0 - 2022-04-26
|
||||||
|
|
||||||
|
**New features**
|
||||||
|
|
||||||
|
- **Automatic update check**<br />
|
||||||
|
The app will check GitHub at start-up if there is a new version available<br />
|
||||||
|
This can be disabled in settings<br />
|
||||||
|
|
||||||
|
- **Use PowerShell 5**<br />
|
||||||
|
Command files will now use PowerShell 5 (-version 5 in the command line)<br />
|
||||||
|
This is based on [Issue 44](https://github.com/Micke-K/IntuneManagement/issues/44)<br />
|
||||||
|
|
||||||
|
- **Documentation**<br />
|
||||||
|
- New Word settings: Table text style and table caption location<br />
|
||||||
|
This is based on an additional request in [Issue 37](https://github.com/Micke-K/IntuneManagement/issues/37)<br />
|
||||||
|
- Terms of Use info when documenting Conditional Access<br />
|
||||||
|
- Added documentation support for Terms of Use<br />
|
||||||
|
- Added additional support for offline documentation<br />
|
||||||
|
**Note:** Offline is defined as documenting an exported folder while logged in to another tenant.<br />
|
||||||
|
If logged in to the same tenant as the exported folder, "online" documentation will be used<br />
|
||||||
|
- Changed the layout for the assignment table on Win32 Applications. There were too many columns so additional info is changed to a table in the value column<br />
|
||||||
|
- Filter / Filter Mode column headers are now set from language files<br />
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
- **Export/Import**<br />
|
||||||
|
- Users in Conditional Access are now added to the Migration Table<br />
|
||||||
|
This is so the user IDs can be translated during Offline documentation<br />
|
||||||
|
- Referenced settings are now included in the export<br />
|
||||||
|
This is to support referenced settings during import, copy and offline documentation (Certs on VPN profiles etc.)<br />
|
||||||
|
These properties are named #CustomRef_*PropertyName* in the json file<br />
|
||||||
|
**Note:** This might cause export/copy to take longer once every second week since it requires the MetaData XML for Graph to be downloaded.<br />
|
||||||
|
This feature can be turned off by unchecking 'Resolve reference info' in Settings<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
|
- **Copy**<br />
|
||||||
|
- New dialog when copying an object. Description can now be changed during the copy<br />
|
||||||
|
<br />
|
||||||
|
- **Authentication**<br />
|
||||||
|
- Full authentication support for US Government and China clouds<br />
|
||||||
|
This requires that 'Show Azure AD login menu' is enabled in Settings<br />
|
||||||
|
- Consent can be requested for missing permissions. This can be triggered via the 'Request Consent' link in the user profile info<br />
|
||||||
|
- New version of MSAL.DLL, version 4.42.1<br />
|
||||||
|
- Object types with only Read permissions are now supported. These will be orange in the menu<br />
|
||||||
|
Buttons like Import and Delete will still be available but they will not work<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
|
- **List objects**<br />
|
||||||
|
- IsAssigned column is added to objects that supports it (property on the Graph object)<br />
|
||||||
|
- Enable 'Expand assignments' in Settings to include Assignments when getting a full list of objects from Graph<br />
|
||||||
|
This can be used for adding Custom columns based on assignment info<br />
|
||||||
|
It is also used for setting the IsAssigned column for objects that doesn't have the info in Graph<br />
|
||||||
|
This is based on [Issue 30](https://github.com/Micke-K/IntuneManagement/issues/30)<br />
|
||||||
|
- Apps can be filtered in the request<br />
|
||||||
|
If there are more than 1000 applications in the environment, the filter box can be used to return only matched items<br />
|
||||||
|
Enter the filter in the text box and press the Refresh button. Clear the filter box and click Refresh to reload other objects<br />
|
||||||
|
This is based on [Issue 28](https://github.com/Micke-K/IntuneManagement/issues/28)<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
|
**Fixes**
|
||||||
|
|
||||||
|
- **Documentation**<br />
|
||||||
|
|
||||||
|
- Fixed bug in *Conditional Access* documentation that caused some Grant information to be excluded from documentation
|
||||||
|
- Fixed missing properties when documenting *Device restrictions (Windows 10 Team)* profiles
|
||||||
|
- Fixed some Offline Documentation issues<br />
|
||||||
|
Get dependency info from exported folders instead of Graph<br />
|
||||||
|
Offline documentation is not 100% fully supported yet. Dependency applications for Win32 apps are not included in this version<br />
|
||||||
|
and there might be more properties missing. Please report anything missing for offline documentation to [Issue 37](https://github.com/Micke-K/IntuneManagement/issues/37)<br />
|
||||||
|
**Note** Offline documentation will always require online access. Some information like language text, Azure roles, Mobile apps etc. will use Graph API<br /><br />
|
||||||
|
|
||||||
|
- **Authentication**<br />
|
||||||
|
- First login with last used account could fail if the user domain was changed after the initial token was cached<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
## 3.4.0 - 2022-03-01
|
## 3.4.0 - 2022-03-01
|
||||||
|
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
cmd /c powershell -ex bypass -file "%~DP0Start-IntuneManagement.ps1" -ShowConsoleWindow
|
cmd /c powershell -version 5 -ex bypass -file "%~DP0Start-IntuneManagement.ps1" -ShowConsoleWindow
|
||||||
pause
|
pause
|
||||||
+1
-1
@@ -1 +1 @@
|
|||||||
cmd /c powershell -ex bypass -File "%~DP0Start-IntuneManagement.ps1" -JSonSettings
|
cmd /c powershell -version 5 -ex bypass -File "%~DP0Start-IntuneManagement.ps1" -JSonSettings
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
cmd /c powershell -ex bypass -File "%~DP0Start-IntuneManagement.ps1"
|
cmd /c powershell -version 5 -ex bypass -File "%~DP0Start-IntuneManagement.ps1"
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
<TextBlock Height="20" Name="txtTitle" FontWeight="Bold" Margin="0,5,0,0" />
|
<TextBlock Height="20" Name="txtTitle" FontWeight="Bold" Margin="0,5,0,0" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="1" Text="(c) 2021 Mikael Karlsson - MIT License" Margin="0,5,0,0" />
|
<TextBlock Grid.Row="1" Text="(c) 2022 Mikael Karlsson - MIT License" Margin="0,5,0,0" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="2">
|
<TextBlock Grid.Row="2">
|
||||||
See
|
See
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
Title="Copy object"
|
||||||
|
SizeToContent="WidthAndHeight"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
ShowInTaskbar="False"
|
||||||
|
WindowStartupLocation="CenterOwner"
|
||||||
|
FocusManager.FocusedElement="{Binding ElementName=txtObjectName}">
|
||||||
|
|
||||||
|
<Window.Resources>
|
||||||
|
<ResourceDictionary>
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="Themes\Default.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
</ResourceDictionary>
|
||||||
|
</Window.Resources>
|
||||||
|
|
||||||
|
<Grid Margin="10">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="0" HorizontalAlignment="Left">
|
||||||
|
<Label Content="New Name" />
|
||||||
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Name of the object" />
|
||||||
|
</StackPanel>
|
||||||
|
<TextBox Name="txtObjectName" Margin="0,5,5,0" Grid.Row="0" Grid.Column="1" Width="250"/>
|
||||||
|
|
||||||
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Top" >
|
||||||
|
<Label Content="Description" />
|
||||||
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Description for the object" Margin="0,2,0,0" />
|
||||||
|
</StackPanel>
|
||||||
|
<TextBox Name="txtObjectDescription" Margin="0,5,5,0" Grid.Row="1" Grid.Column="1" AcceptsReturn="True" Width="250" Height="100" />
|
||||||
|
|
||||||
|
<WrapPanel Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Right" Margin="0,15,0,0">
|
||||||
|
<Button IsDefault="True" Name="btnOk" MinWidth="60" Margin="0,0,10,0">_OK</Button>
|
||||||
|
<Button IsCancel="True" Name="btnCancel" MinWidth="60" >_Cancel</Button>
|
||||||
|
</WrapPanel>
|
||||||
|
</Grid>
|
||||||
|
</Window>
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
<RowDefinition Height="Auto"/>
|
<RowDefinition Height="Auto"/>
|
||||||
<RowDefinition Height="Auto"/>
|
<RowDefinition Height="Auto"/>
|
||||||
<RowDefinition Height="Auto"/>
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
<RowDefinition Height="*"/>
|
<RowDefinition Height="*"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
@@ -190,63 +191,76 @@
|
|||||||
<TextBox Grid.Column='2' Grid.Row='12' Name='txtWordSubCategoryHeaderStyle' Margin="0,5,5,5"/>
|
<TextBox Grid.Column='2' Grid.Row='12' Name='txtWordSubCategoryHeaderStyle' Margin="0,5,5,5"/>
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="13">
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="13">
|
||||||
|
<Label Content="Table text style" />
|
||||||
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Style of the text in a table. Default is current font" />
|
||||||
|
</StackPanel>
|
||||||
|
<TextBox Grid.Column='2' Grid.Row='13' Name='txtWordTableTextStyle' Margin="0,5,5,5"/>
|
||||||
|
|
||||||
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="14">
|
||||||
|
<Label Content="Table caption position" />
|
||||||
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Specify where the table captions should be. Above or below the table" />
|
||||||
|
</StackPanel>
|
||||||
|
<ComboBox Name="cbWordTableCaptionPosition" Margin="0,5,0,0" MinWidth="250" Grid.Row="14" Grid.Column="1" HorizontalAlignment="Left"
|
||||||
|
DisplayMemberPath="Name" SelectedValuePath="Value" />
|
||||||
|
|
||||||
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="15">
|
||||||
<Label Content="Cover Page" />
|
<Label Content="Cover Page" />
|
||||||
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Cover page to use if the template property is not specified. Ion (Dark) is used if not specified" />
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Cover page to use if the template property is not specified. Ion (Dark) is used if not specified" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<TextBox Grid.Column='1' Grid.Row='13' Name='txtWordCoverPage' Margin="0,5,5,5"/>
|
<TextBox Grid.Column='1' Grid.Row='15' Name='txtWordCoverPage' Margin="0,5,5,5"/>
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="14">
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="16">
|
||||||
<Label Content="Title" />
|
<Label Content="Title" />
|
||||||
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Specify the title property for the document" />
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Specify the title property for the document" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<TextBox Grid.Column='1' Grid.Row='14' Name='txtWordTitleProperty' Margin="0,5,5,5"/>
|
<TextBox Grid.Column='1' Grid.Row='16' Name='txtWordTitleProperty' Margin="0,5,5,5"/>
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="15">
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="17">
|
||||||
<Label Content="Subject" />
|
<Label Content="Subject" />
|
||||||
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Specify the subject property for the document" />
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Specify the subject property for the document" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<TextBox Grid.Column='1' Grid.Row='15' Name='txtWordSubjectProperty' Margin="0,5,5,5"/>
|
<TextBox Grid.Column='1' Grid.Row='17' Name='txtWordSubjectProperty' Margin="0,5,5,5"/>
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="16">
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="18">
|
||||||
<Label Content="Content controls" />
|
<Label Content="Content controls" />
|
||||||
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Specify content control values e.g. prop1=value;prop2=value;prop3=value" />
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Specify content control values e.g. prop1=value;prop2=value;prop3=value" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<TextBox Grid.Column='1' Grid.Row='16' Name='txtWordContentControls' Margin="0,5,5,5"/>
|
<TextBox Grid.Column='1' Grid.Row='18' Name='txtWordContentControls' Margin="0,5,5,5"/>
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Grid.Row='17' Margin="0,0,5,0">
|
<StackPanel Orientation="Horizontal" Grid.Row='19' Margin="0,0,5,0">
|
||||||
<Label Content="Open document" />
|
<Label Content="Open document" />
|
||||||
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="This will open the document and activate Word when finished" />
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="This will open the document and activate Word when finished" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<CheckBox Grid.Column='1' Grid.Row='17' Name='chkWordOpenDocument' VerticalAlignment="Center" IsChecked="true" />
|
<CheckBox Grid.Column='1' Grid.Row='19' Name='chkWordOpenDocument' VerticalAlignment="Center" IsChecked="true" />
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Grid.Row='18' Margin="0,0,5,0">
|
<StackPanel Orientation="Horizontal" Grid.Row='20' Margin="0,0,5,0">
|
||||||
<Label Content="Document scripts" />
|
<Label Content="Document scripts" />
|
||||||
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Include scripts in the documentation" />
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Include scripts in the documentation" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<CheckBox Grid.Column='1' Grid.Row='18' Name='chkWordIncludeScripts' VerticalAlignment="Center" IsChecked="true" />
|
<CheckBox Grid.Column='1' Grid.Row='20' Name='chkWordIncludeScripts' VerticalAlignment="Center" IsChecked="true" />
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Grid.Row='19' Margin="0,0,5,0">
|
<StackPanel Orientation="Horizontal" Grid.Row='21' Margin="0,0,5,0">
|
||||||
<Label Content="Remove script signature" />
|
<Label Content="Remove script signature" />
|
||||||
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Remove signature block from PowerShell scripts to reduce script documentation size" />
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Remove signature block from PowerShell scripts to reduce script documentation size" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<CheckBox Grid.Column='1' Grid.Row='19' Name='chkWordExcludeScriptSignature' VerticalAlignment="Center" IsChecked="true" />
|
<CheckBox Grid.Column='1' Grid.Row='21' Name='chkWordExcludeScriptSignature' VerticalAlignment="Center" IsChecked="true" />
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Grid.Row='20' Margin="0,0,5,0">
|
<StackPanel Orientation="Horizontal" Grid.Row='22' Margin="0,0,5,0">
|
||||||
<Label Content="Attatch Json file" />
|
<Label Content="Attatch Json file" />
|
||||||
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Attatch the Json file to the documentation" />
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Attatch the Json file to the documentation" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<CheckBox Grid.Column='1' Grid.Row='20' Name='chkWordAttatchJsonFile' VerticalAlignment="Center" IsChecked="false" />
|
<CheckBox Grid.Column='1' Grid.Row='22' Name='chkWordAttatchJsonFile' VerticalAlignment="Center" IsChecked="false" />
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="21">
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="23">
|
||||||
<Label Content="Script table style" />
|
<Label Content="Script table style" />
|
||||||
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Specify the table style to use for scripts. Ducument table style will be use as default" />
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Specify the table style to use for scripts. Ducument table style will be use as default" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<TextBox Grid.Column='1' Grid.Row='21' Name='txtWordScriptTableStyle' Margin="0,5,5,5"/>
|
<TextBox Grid.Column='1' Grid.Row='23' Name='txtWordScriptTableStyle' Margin="0,5,5,5"/>
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="22">
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="24">
|
||||||
<Label Content="Script font style" />
|
<Label Content="Script font style" />
|
||||||
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Specify the font style to use for documenting scripts. HTML Code is used as default" />
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Specify the font style to use for documenting scripts. HTML Code is used as default" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<TextBox Grid.Column='1' Grid.Row='22' Name='txtWordScriptStyle' Margin="0,5,5,5"/>
|
<TextBox Grid.Column='1' Grid.Row='24' Name='txtWordScriptStyle' Margin="0,5,5,5"/>
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
Grid.IsSharedSizeScope='True'>
|
||||||
|
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="*" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
|
<TextBlock Text="{Binding Name}" Margin="5,5,0,0" FontWeight="Bold" />
|
||||||
|
<TextBlock Text="{Binding Description}" Grid.Row="1" Margin="5,5,0,0" />
|
||||||
|
<Separator Grid.Row="2" />
|
||||||
|
|
||||||
|
<ContentControl Name="ccEMIntuneAppPage" Grid.Row="3" Margin="5,5,5,0" Content="{Binding PanelView}" />
|
||||||
|
|
||||||
|
<Separator Grid.Row="4" />
|
||||||
|
|
||||||
|
<TextBlock Grid.Row="5" Name="txtIntuneAppsPageStatus" HorizontalAlignment="Left" Margin="0,5,0,0" />
|
||||||
|
|
||||||
|
<StackPanel Grid.Row="5" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,5,0,0" >
|
||||||
|
<Button Name="btnIntuneApplicationPrevious" Content="Previous" MinWidth="100" Margin="0,0,5,0" IsEnabled="False" />
|
||||||
|
<Button Name="btnIntuneApplicationNext" Content="Next" MinWidth="100" Margin="0,0,5,0" />
|
||||||
|
<Button Name="btnIntuneApplicationFinish" Content="Finish" ToolTip="Create application in intune" MinWidth="100" Visibility="Collapsed" Margin="0,0,5,0" />
|
||||||
|
<Button Name="btnIntuneApplicationNew" Content="New" ToolTip="Create a new application" MinWidth="100" Visibility="Collapsed" Margin="0,0,5,0" />
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
+17
-3
@@ -1,5 +1,19 @@
|
|||||||
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
Title="" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterScreen">
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
Title=""
|
||||||
|
SizeToContent="WidthAndHeight"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
ShowInTaskbar="False"
|
||||||
|
WindowStartupLocation="CenterOwner">
|
||||||
|
|
||||||
|
<Window.Resources>
|
||||||
|
<ResourceDictionary>
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="Themes\Default.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
</ResourceDictionary>
|
||||||
|
</Window.Resources>
|
||||||
|
|
||||||
<Grid Margin="10">
|
<Grid Margin="10">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
@@ -15,7 +29,7 @@
|
|||||||
<TextBox Name="txtValue" Grid.Column="1" Grid.Row="1" MinWidth="250"></TextBox>
|
<TextBox Name="txtValue" Grid.Column="1" Grid.Row="1" MinWidth="250"></TextBox>
|
||||||
|
|
||||||
<WrapPanel Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Right" Margin="0,15,0,0">
|
<WrapPanel Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Right" Margin="0,15,0,0">
|
||||||
<Button IsDefault="True" Name="btnOk" MinWidth="60" Margin="0,0,10,0">_Ok</Button>
|
<Button IsDefault="True" Name="btnOk" MinWidth="60" Margin="0,0,10,0">_OK</Button>
|
||||||
<Button IsCancel="True" Name="btnCancel" MinWidth="60">_Cancel</Button>
|
<Button IsCancel="True" Name="btnCancel" MinWidth="60">_Cancel</Button>
|
||||||
</WrapPanel>
|
</WrapPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
<!-- x:Class="Dialogs.Margins" <Border xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> -->
|
||||||
|
<Window
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
Title="Login"
|
||||||
|
SizeToContent="WidthAndHeight"
|
||||||
|
ResizeMode="NoResize"
|
||||||
|
ShowInTaskbar="False"
|
||||||
|
WindowStartupLocation="CenterOwner"
|
||||||
|
FocusManager.FocusedElement="{Binding ElementName=cbMSALCloudType}">
|
||||||
|
|
||||||
|
<Window.Resources>
|
||||||
|
<ResourceDictionary>
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="Themes\Default.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
</ResourceDictionary>
|
||||||
|
</Window.Resources>
|
||||||
|
|
||||||
|
<Grid Width="350" HorizontalAlignment="Stretch" Name="grdModalContainer" VerticalAlignment="Stretch" Background="White">
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<!--
|
||||||
|
<Border Background="{DynamicResource TitleBackgroundColor}" BorderThickness="0">
|
||||||
|
<TextBlock Margin="5" FontWeight="Bold" Text="Login" />
|
||||||
|
</Border>
|
||||||
|
-->
|
||||||
|
<Grid Grid.Row="1">
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" SharedSizeGroup="TitleColumn" />
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="0">
|
||||||
|
<Label Content="Cloud" />
|
||||||
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Select the target cloud to login to" />
|
||||||
|
</StackPanel>
|
||||||
|
<ComboBox Name="cbMSALCloudType" Margin="0,5,5,0" Grid.Row="0" Grid.Column="1"
|
||||||
|
DisplayMemberPath="Name" SelectedValuePath="Value" />
|
||||||
|
|
||||||
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="1">
|
||||||
|
<Label Content="GCC Environment" />
|
||||||
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Select the GCC environment. Only valid if 'Azure AD US Government' cloud is selected." />
|
||||||
|
</StackPanel>
|
||||||
|
<ComboBox Name="cbMSALGCCType" Margin="0,5,5,0" Grid.Row="1" Grid.Column="1"
|
||||||
|
DisplayMemberPath="Name" SelectedValuePath="Value" />
|
||||||
|
|
||||||
|
<StackPanel Grid.Row='2' Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,5,5,5">
|
||||||
|
<Button Name="btnLogin" Content="Login" Width='100' Margin="5,0,0,0" VerticalAlignment="Center" />
|
||||||
|
<Button Name="btnCancel" Content="Cancel" Width='100' Margin="5,0,0,0" VerticalAlignment="Center" />
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
|
||||||
|
</Window>
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<Menu Name="mnuMain" Padding="0,5,0,5" Grid.ColumnSpan="2" >
|
<Menu Name="mnuMain" Padding="0,5,0,5" Grid.ColumnSpan="2" >
|
||||||
<MenuItem Header="_File" >
|
<MenuItem Header="_File" Name="mnuFile">
|
||||||
<MenuItem Header="_Settings" Name="mnuSettings" />
|
<MenuItem Header="_Settings" Name="mnuSettings" />
|
||||||
<MenuItem Header="_Tenant Settings" Name="mnuTenantSettings" />
|
<MenuItem Header="_Tenant Settings" Name="mnuTenantSettings" />
|
||||||
<Separator />
|
<Separator />
|
||||||
|
|||||||
@@ -44,9 +44,9 @@
|
|||||||
</StackPanel>
|
</StackPanel>
|
||||||
<TextBox Name="txtObjectName" Margin="0,5,5,0" Grid.Row="0" Grid.Column="1" />
|
<TextBox Name="txtObjectName" Margin="0,5,5,0" Grid.Row="0" Grid.Column="1" />
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="1" HorizontalAlignment="Left">
|
<StackPanel Orientation="Horizontal" Margin="0,5,5,0" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Top">
|
||||||
<Label Content="Description" />
|
<Label Content="Description" />
|
||||||
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Name of the object" />
|
<Rectangle Style="{DynamicResource InfoIcon}" ToolTip="Description for the object" Margin="0,2,0,0" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<TextBox Name="txtObjectDescription" Margin="0,5,5,0" Grid.Row="1" Grid.Column="1" AcceptsReturn="True" Height="100" />
|
<TextBox Name="txtObjectDescription" Margin="0,5,5,0" Grid.Row="1" Grid.Column="1" AcceptsReturn="True" Height="100" />
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,8 @@
|
|||||||
<TextBlock Name="txtAppId" />
|
<TextBlock Name="txtAppId" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
|
<Button Margin="5" Grid.Row="4" Grid.ColumnSpan="2" Name="lnkRequestConsent" Content="Request Consent" ToolTip="Request consent for missing scopes" Cursor="Hand" Style="{DynamicResource LinkButton}" />
|
||||||
|
|
||||||
<StackPanel Grid.Row="5" Grid.ColumnSpan="2" Orientation="Horizontal">
|
<StackPanel Grid.Row="5" Grid.ColumnSpan="2" Orientation="Horizontal">
|
||||||
<Button Margin="5" Name="lnkTokeninfo" Content="MSAL Token" Cursor="Hand" Style="{DynamicResource LinkButton}" />
|
<Button Margin="5" Name="lnkTokeninfo" Content="MSAL Token" Cursor="Hand" Style="{DynamicResource LinkButton}" />
|
||||||
<Button Margin="5" Name="lnkAccessTokenInfo" ToolTip="Show the decoded JWT info of the AccessToken" Content="Access Token" Cursor="Hand" Style="{DynamicResource LinkButton}" />
|
<Button Margin="5" Name="lnkAccessTokenInfo" ToolTip="Show the decoded JWT info of the AccessToken" Content="Access Token" Cursor="Hand" Style="{DynamicResource LinkButton}" />
|
||||||
|
|||||||
Reference in New Issue
Block a user