Hello,
I created a page to allow department managers to add or remove users from AD groups they manage.
This one is not completely finished but the main one works.
On the other hand, I encounter two concerns:
- two consecutive sync-udelements do not have the same value for $SelectedGroup (see line 248 of the code => fixed by placing the second Sync-UDElement in the element synchronized by the first Sync-UDElement)
- if I choose an AD group and refresh the page, $DynamicDetails and $DynamicTabs always display the values before refresh. Likewise, if I open multiple browser tabs on this page.
$SelectedGroup keeps the value it had before refreshing the page and a new browser tab takes the value of $SelectedGroup from the tab used previously.
Isn’t the behavior supposed to be like below?
- $SelectedGroup not having a session or cache scope should not find its old value after refreshing the page or on a new browser tab
- two consecutive Sync-UDElement should have the same value for $SelectedGroup since this value is not changed in any of the synchronized elements
Did I miss or not understand something ?
Thanks for your help
Here is my code :
New-UDDashboard -Title 'Tableau de bord' -Content {
if ($SelectedGroup) {
Show-UDToast -Message "[START] `$SelectedGroup = $($SelectedGroup.Name)" -Duration 10000 #dev
}
if (!$Cache:AssignableUsers) {
$Cache:AssignableUsers = Get-ADUser -Filter "Enabled -eq `$true -and Surname -like '*' -and GivenName -like '*'" -Properties Surname, GivenName, Company, Department, Title, Mail, SamAccountName, UserPrincipalName |
Select-Object Surname, GivenName, Company, Department, Title, Mail, SamAccountName, UserPrincipalName
}
$CurrentADUser = Get-ADUser -Filter "UserPrincipalName -eq '$User'"
[Microsoft.ActiveDirectory.Management.ADGroup[]]$ManagedGroups = @()
$ManagedGroups = Get-ADGroup -Filter { ManagedBy -eq $CurrentADUser.SamAccountName } -Properties Description, Info | Sort-Object Name
$CurrentGroups = Get-ADUser -Identity $CurrentADUser.SamAccountName -Properties MemberOf | Select-Object -ExpandProperty MemberOf
$CurrentGroups | ForEach-Object {
$isGroupManager = Get-ADGroup -Filter { ManagedBy -eq $_ } -Properties Description, Info | Sort-Object Name
if ($isGroupManager) {
$ManagedGroups += $isGroupManager
}
}
$UNCPathRegex = '(\\\\([a-z|A-Z|0-9|-|_|\s]{2,15}){1}(\.[a-z|A-Z|0-9|-|_|\s]{1,64}){0,3}){1}(\\[^\\|\/|\:|\*|\?|"|\<|\>|\|]{1,64}){1,}(\\){0,}'
$DynamicDetails = {
New-UDDynamic -Id 'DynamicDetails' -Content {
if ($SelectedGroup) {
Show-UDToast -Message "[DynamicDetails] `$SelectedGroup = $($SelectedGroup.Name)" -Duration 10000 #dev
New-UDGrid -Item -Children {
if ($SelectedGroup.Info) {
New-UDList -Content {
if ($SelectedGroup.Info -match $UNCPathRegex) {
New-UDListItem -Label 'Dossier' -Icon (New-UDIcon -Icon Folder -Size 2x) -SubTitle $SelectedGroup.Info
} else {
New-UDListItem -Label 'Permission' -Icon (New-UDIcon -Icon UserTie -Size 2x) -SubTitle $SelectedGroup.Info
}
}
} else {
New-UDList -Content {
New-UDListItem -Label 'Dossier ou permission' -Icon (New-UDIcon -Icon Question -Size 2x) -SubTitle 'non renseigné'
}
}
}
New-UDGrid -Item -Children {
New-UDList -Content {
if ($SelectedGroup.Description) {
New-UDListItem -Label 'Description' -Icon (New-UDIcon -Icon InfoCircle -Size 2x) -SubTitle $SelectedGroup.Description
} else {
New-UDListItem -Label 'Description' -Icon (New-UDIcon -Icon InfoCircle -Size 2x) -SubTitle 'non renseigné'
}
}
}
}
} -LoadingComponent {
New-UDElement -Tag 'BR'
New-UDProgress
}
}
$ColumnsTableList = @(
New-UDTableColumn -Title 'Nom' -Property 'Surname' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType text -DefaultSortColumn -ShowSort
New-UDTableColumn -Title 'Prénom' -Property 'GivenName' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType text
New-UDTableColumn -Title 'Société' -Property 'Company' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType select
New-UDTableColumn -Title 'Service' -Property 'Department' -IncludeInExport -IncludeInSearch
New-UDTableColumn -Title 'Poste' -Property 'Title' -IncludeInExport -IncludeInSearch
New-UDTableColumn -Title 'Mail' -Property 'Mail' -IncludeInExport -IncludeInSearch
New-UDTableColumn -Title ' ' -Property 'SamAccountName' -Render {
New-UDTooltip -TooltipContent { 'Retirer l''utilisateur du groupe' } -Content {
New-UDButton -Icon (New-UDIcon -Icon UserMinus -Color 'Red') -Variant 'text' -OnClick {
try {
Remove-ADGroupMember -Identity $SelectedGroup.SamAccountName -Members $EventData.SamAccountName -Confirm:$false -ErrorAction Stop
} catch {
Show-UDToast -Title 'ERREUR!' -Message "$($EventData.Surname) $($EventData.GivenName) n'a pas pu être retiré du groupe $($SelectedGroup.Name)" -Duration 10000
}
}
}
}
)
$ColumnsTableAdd = @(
New-UDTableColumn -Title 'Nom' -Property 'Surname' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType text -DefaultSortColumn -ShowSort
New-UDTableColumn -Title 'Prénom' -Property 'GivenName' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType text
New-UDTableColumn -Title 'Société' -Property 'Company' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType select
New-UDTableColumn -Title 'Service' -Property 'Department' -IncludeInExport -IncludeInSearch
New-UDTableColumn -Title 'Poste' -Property 'Title' -IncludeInExport -IncludeInSearch
New-UDTableColumn -Title 'Mail' -Property 'Mail' -IncludeInExport -IncludeInSearch
New-UDTableColumn -Title ' ' -Property 'SamAccountName' -Render {
New-UDTooltip -TooltipContent { 'Ajouter l''utilisateur du groupe' } -Content {
New-UDButton -Icon (New-UDIcon -Icon UserPlus -Color 'Green') -Variant 'text' -OnClick {
try {
Add-ADGroupMember -Identity $SelectedGroup.SamAccountName -Members $EventData.SamAccountName -ErrorAction Stop
Sync-UDElement -Id 'DynamicTabs'
} catch {
Show-UDToast -Title 'ERREUR!' -Message "$($EventData.Surname) $($EventData.GivenName) n'a pas pu être ajouté au groupe $($SelectedGroup.Name)" -Duration 10000
}
}
}
}
)
$DynamicTabs = {
New-UDDynamic -Id 'DynamicTabs' -Content {
New-UDGrid -Item -Children {
if ($SelectedGroup) {
Show-UDToast -Message "[DynamicTabs] `$SelectedGroup = $($SelectedGroup.Name)" -Duration 10000 #dev
New-UDTabs -Id 'Tabs' -Tabs {
New-UDTab -Text 'Liste des utilisateurs' -Content {
$GroupMembers = Get-ADGroupMember -Identity $SelectedGroup.DistinguishedName
if ($GroupMembers.Count -eq 0) {
New-UDAlert -Severity info -Text 'Aucun utilisateur n''est membre de ce groupe.'
} else {
$Users = @()
$GroupMembers | ForEach-Object {
$Users += Get-ADUser -Identity $_.SamAccountName -Properties Company, Department, Title, Mail
}
New-UDTable -Id 'TableListMembers' -Data $Users -Columns $ColumnsTableList -Dense -DefaultSortDirection ascending -ShowSort -DisableMultiSelect -DisableSortRemove -PageSize 10 -ShowPagination -ShowExport
}
}
New-UDTab -Text 'Ajouter' -Content {
$TableAddMembersProps = @{
Id = 'TableAddMembers'
Columns = $ColumnsTableAdd
DefaultSortDirection = 'ascending'
Dense = $true
DisableMultiSelect = $true
DisableSortRemove = $true
PageSize = 10
ShowPagination = $true
ShowSort = $true
}
New-UDTable @TableAddMembersProps -LoadData {
$TableData = ConvertFrom-Json $Body
$PageSize = $TableData.PageSize
$Offset = $TableData.Page * $PageSize
$NextRow = $Offset + $PageSize - 1
$OrderBy = $TableData.orderBy.field
if ($OrderBy -eq $null) {
$OrderBy = 'Surname'
}
$Descending = $false
if ($TableData.OrderDirection -eq 'desc') {
$Descending = $true
}
$WhereArray = @()
if ($TableData.Filters) {
foreach ($filter in $TableData.Filters) {
$WhereArray += "`$_.$($filter.id) -like '$($filter.value)*'"
}
}
$WhereString = $WhereArray -Join ' -and '
$WhereBlock = [scriptblock]::Create($WhereString)
if ($WhereArray.Count) {
$Data = $Cache:AssignableUsers | Where-Object $WhereBlock | Sort-Object $OrderBy -Descending:$Descending
} else {
$Data = $Cache:AssignableUsers | Sort-Object $OrderBy -Descending:$Descending
}
$TotalCount = $Data.Count
$Data = $Data[$Offset..$NextRow] |
ForEach-Object {
@{
Surname = $_.Surname
GivenName = $_.GivenName
Company = $_.Company
Department = $_.Department
Title = $_.Title
Mail = $_.Mail
SamAccountName = $_.SamAccountName
}
}
$Data | Out-UDTableData -TotalCount $TotalCount -Page $TableData.Page -Properties $TableData.Properties
}
}
}
} else {
New-UDAlert -Severity info -Text 'Aucun groupe sélectionné.'
}
}
Sync-UDElement -Id 'DynamicDetails' #Used to correct BUG 1 at line 248
} -LoadingComponent {
New-UDElement -Tag 'BR'
New-UDProgress
}
}
New-UDCard -Title 'Gérer mes groupes d''utilisateurs' -Content {
New-UDGrid -Container -Children {
New-UDGrid -Item -Children {
if ($ManagedGroups.Count -eq 0) {
New-UDTypography -Text 'Vous n''avez la gestion d''aucun groupe.'
New-UDHtml -Markup 'BR'
New-UDTypography -Text ''
} else {
New-UDTooltip -TooltipContent { 'Sélectionnez le groupe que vous souhaitez gérer' } -Content {
New-UDSelect -Id 'SelectManagedGroup' -Label 'Groupe' -DefaultValue 'null' -Option {
New-UDSelectOption -Name 'Sélectionnez un groupe' -Value 'null'
$ManagedGroups | ForEach-Object {
New-UDSelectOption -Name $_.Name -Value $_.DistinguishedName
}
} -OnChange {
if ($EventData -eq 'null') {
# Aucun groupe séléctionné
$SelectedGroup = $null
} else {
$SelectedGroup = $ManagedGroups | Where-Object { $_.DistinguishedName -eq $EventData }
}
Sync-UDElement -Id 'DynamicTabs'
#Sync-UDElement -Id 'DynamicDetails' #BUG 1 two consecutive sync-udelements do not have the same value for $SelectedGroup
}
}
}
}
New-UDGrid -Item -Children {
New-UDGrid -Container -Children $DynamicDetails
}
}
New-UDGrid -Container -Children $DynamicTabs
}
}
Product: PowerShell Universal
Version: 2.6.2