Een uitgebreide PowerShell-oplossing voor het analyseren van Privileged Identity Management (PIM) en permanente roltoewijzingen in meerdere Microsoft 365/Azure AD tenants.
Dit script biedt gedetailleerde rapportage over:### ReportOnly Vereisten
- Minimaal één bestaande export (via normale uitvoering)
*_All_Customers_Full_Report.csv
bestand in export directory- Geldige
config.json
voor HTML instellingen
Het script biedt automatische backup functionaliteit voor:
- Export bestanden - Alle CSV rapporten worden gecomprimeerd
- Configuratie bestanden - config.json en credentials.json worden beveiligd
- Retention beleid - Automatische opschoning van oude backups
"BackupSettings": {
"EnableBackup": true,
"BackupRoot": "backups",
"ExportBackupSubfolder": "exports",
"ConfigBackupSubfolder": "config",
"EnableExportBackup": true,
"EnableConfigBackup": true,
"ExportBackupRetention": 5,
"ConfigBackupRetention": 3
}
EnableBackup
- Hoofdschakelaar voor backup functionaliteitBackupRoot
- Root directory voor alle backups (standaard: "backups")ExportBackupSubfolder
- Subdirectory voor export backupsConfigBackupSubfolder
- Subdirectory voor configuratie backupsEnableExportBackup
- Export bestanden backuppen (true/false)EnableConfigBackup
- Configuratie bestanden backuppen (true/false)ExportBackupRetention
- Aantal export backups te behouden (standaard: 5)ConfigBackupRetention
- Aantal config backups te behouden (standaard: 3)
β Automatisch - Backups worden automatisch aangemaakt na elke run
β Retention - Oude backups worden automatisch verwijderd
β Gecomprimeerd - ZIP formaat voor efficiΓ«nte opslag
β Timestamped - Duidelijke naamgeving met datum/tijd
β Gefilterd - Alleen relevante bestanden worden gebackupt
Het script bevat een geavanceerd systeem voor het detecteren van wijzigingen in roltoewijzingen tussen verschillende uitvoeringen. Dit helpt bij het monitoren van security changes en compliance tracking.
Een belangrijk kenmerk van de wijzigingsdetectie is dat normale PIM-activaties niet worden gerapporteerd als wijzigingen:
- Eligible β Active: Wanneer een gebruiker een PIM rol activeert
- Active β Eligible: Wanneer een PIM rol weer deactiveert/verloopt
- Eligible β Eligible: Hernieuwing van eligible status
Deze overgangen worden automatisch uitgefilterd omdat ze deel uitmaken van normale PIM-operaties en niet wijzen op structurele veranderingen in de roltoewijzingen.
Het systeem rapporteert wel de volgende belangrijke wijzigingen:
- Nieuwe roltoewijzingen: Volledig nieuwe toegang voor gebruikers
- Verwijderde roltoewijzingen: Intrekking van toegang
- Permanente rol wijzigingen: Veranderingen in permanent toegewezen rollen
- Groepslidmaatschap veranderingen: Wijzigingen via security groups
- Assignment Type wijzigingen: Van Permanent naar PIM of vice versa
# Voorbeeld uitvoer wijzigingsrapport
User,Role,ChangeType,PreviousState,CurrentState,Tenant,Timestamp
john.doe@company.com,Global Administrator,NEW,None,Permanent,Customer1,2025-08-18T10:30:00
jane.smith@company.com,Security Administrator,REMOVED,PIM Eligible,None,Customer2,2025-08-18T10:30:00
Wijzigingsdetectie is automatisch ingeschakeld en vereist geen extra configuratie. Het systeem:
- Vergelijkt automatisch met de vorige export
- Genereert een
Changes_Report.csv
bestand - Toont samenvattingsstatistieken in de console
- Integreert change information in het HTML dashboard
β Security Monitoring - Detecteert ongeautoriseerde wijzigingen
β Compliance Tracking - Audit trail voor roltoewijzingen
β Intelligent Filtering - Onderscheidt tussen operationele en structurele wijzigingen
β Automated Reporting - Geen handmatige vergelijking nodig
β Historical Context - Behoudt overzicht van veranderingen over tijd
backups/
βββ exports/
β βββ exports-20250817_200746.zip
β βββ exports-20250816_154321.zip
β βββ ...
βββ config/
βββ config-20250817_200752.zip
βββ config-20250816_154325.zip
βββ ...
- Permanente roltoewijzingen (niet via PIM)
- Groepslidmaatschap voor privileged rollen
- Multi-tenant ondersteuning voor MSP's en grote organisaties
- HTML Dashboard met moderne UI/UX
- Uitgebreide CSV exports per klant en gecombineerd
- PIM Eligible: Gebruikers die rollen kunnen activeren
- PIM Active: Momenteel geactiveerde rollen
- Permanent: Permanente roltoewijzingen (security risk)
- Groepsleden: Automatische detectie van gebruikers via groepslidmaatschap
- Service Principals: Inclusief applicatie-identiteiten
- Dark/Light mode toggle met persistentie
- Responsive design voor alle apparaten
- Interactieve tabellen met DataTables
- Per-klant tabs voor gedetailleerde analyse
- Real-time statistieken en grafieken
- Security aanbevelingen en best practices
- Per-klant CSV exports met nieuwe naamconventie
- Gecombineerde rapporten voor alle tenants
- Gefilterde rapporten (Users Only, PIM Eligible, etc.)
- High-privilege gebruikers rapportage
- Vergelijkingsrapporten PIM vs Permanent
- Meerdere tenants in één run
- Flexibele credential structuur ondersteuning
- Foutafhandeling per tenant
- Gedetailleerde logging met voortgangsindicaties
- PowerShell 5.1 of hoger
- Microsoft Graph PowerShell modules (automatisch geΓ―nstalleerd)
- Azure AD App Registration met juiste permissies
Configureer de volgende Microsoft Graph API permissies in Azure AD:
RoleManagement.Read.Directory
Directory.Read.All
User.Read.All
Group.Read.All
Application.Read.All
-
Clone het repository:
git clone https://github.com/scns/Privileged-Users-Report-MultiTenant.git cd Privileged-Users-Report-MultiTenant
-
Configureer credentials:
# Kopieer template bestanden copy _credentials.json credentials.json copy _config.json config.json # Bewerk credentials.json met jouw tenant gegevens notepad credentials.json
-
Run het script:
.\Get-PIMUsers.ps1
Maak een credentials.json
bestand met tenant informatie:
{
"LoginCredentials": [
{
"customername": "Customer1",
"ClientID": "your-app-id-here",
"Secret": "your-client-secret-here",
"TenantID": "your-tenant-id-here"
},
{
"customername": "Customer2",
"ClientID": "your-app-id-here",
"Secret": "your-client-secret-here",
"TenantID": "your-tenant-id-here"
}
]
}
π‘ Tip: Gebruik het meegeleverde
_credentials.json
template bestand
Pas rapportage-instellingen aan:
{
"ExportSettings": {
"OutputFolder": "exports",
"CreateDateSubfolders": false,
"ArchiveOldReports": true,
"MaxReportsToKeep": 10
},
"ReportSettings": {
"IncludeTimestamp": false,
"FileEncoding": "UTF8",
"DateFormat": "yyyyMMdd",
"IncludeServicePrincipals": true
},
"HTMLSettings": {
"GenerateHTMLDashboard": true,
"AutoOpenHTMLReport": true
},
"BackupSettings": {
"EnableBackup": true,
"BackupRoot": "backups",
"ExportBackupSubfolder": "exports",
"ConfigBackupSubfolder": "config",
"EnableExportBackup": true,
"EnableConfigBackup": true,
"ExportBackupRetention": 5,
"ConfigBackupRetention": 3
}
}
π‘ Tip: Gebruik het meegeleverde
_config.json
template bestand
# Standaard configuratie
.\Get-PIMUsers.ps1
# Custom configuratie
.\Get-PIMUsers.ps1 -ConfigFile "custom-config.json" -OutputPath "C:\Reports"
-ConfigFile
: Pad naar configuratiebestand (standaard: config.json)-OutputPath
: Output directory (overschrijft config.json)-ReportOnly
: Genereer alleen HTML rapport uit bestaande exports zonder nieuwe data op te halen
# Normale uitvoering - haalt nieuwe data op en genereert rapporten
.\Get-PIMUsers.ps1
# Met aangepaste configuratie
.\Get-PIMUsers.ps1 -ConfigFile "custom-config.json"
# Met aangepast output pad
.\Get-PIMUsers.ps1 -OutputPath "C:\Reports"
# Alleen HTML rapport genereren uit bestaande data
.\Get-PIMUsers.ps1 -ReportOnly
# Combinatie van parameters
.\Get-PIMUsers.ps1 -ConfigFile "custom-config.json" -ReportOnly
Alle bestanden gebruiken het format: YYYYMMDD_Customer_ReportType.csv
20250816_Customer1_Full_Report.csv
- Alle rol-toewijzingen20250816_Customer1_Users_Only.csv
- Alleen gebruikers20250816_Customer1_PIM_Eligible.csv
- PIM Eligible rollen20250816_Customer1_PIM_Active.csv
- Actieve PIM rollen20250816_Customer1_Permanent_Roles.csv
- Permanente rollen20250816_Customer1_Summary.csv
- Samenvattingsrapport
20250816_All_Customers_Full_Report.csv
- Alle klanten gecombineerd20250816_All_Customers_High_Privilege.csv
- High-privilege rollen20250816_All_Customers_PIM_vs_Permanent_Comparison.csv
- VergelijkingPIM_Role_Dashboard.html
- Interactief HTML Dashboard
- Responsive design - Werkt op desktop, tablet, en mobile
- Dark/Light mode - Automatische thema-persistentie
- FontAwesome iconen - Professionele UI elementen
- Moderne kleuren - Visueel aantrekkelijke statistieken
- DataTables - Sorteerbare, doorzoekbare tabellen
- Customer tabs - Gefocusseerde analyse per klant
- Real-time filters - Dynamische data filtering
- Responsive statistieken - Automatisch aangepaste lay-out
- Clickable filter buttons - Directe filtering per rol type
Elke customer tab bevat intelligente filter buttons voor snelle data analyse:
- ποΈ Alle - Toont alle rol-toewijzingen (totaal aantal tussen haakjes)
- π΅ Eligible - Filtert alleen PIM Eligible rollen die geactiveerd kunnen worden
- π’ Active - Toont alleen momenteel actieve PIM rollen
- π΄ Permanent - Toont permanente rollen (security risk - direct toegewezen)
- π€ Users - Filtert alleen gebruikers (exclusief service principals)
- β‘ Global Admins - Toont alleen Global Administrator rollen
Functionaliteit:
- Direct klikken - Geen reload nodig, client-side filtering
- Visual feedback - Actieve filter wordt gemarkeerd
- Aantal indicatie - Elk filter toont het aantal resultaten
- Snelle navigatie - Schakel moeiteloos tussen verschillende views
- Kleurcodering - Visuele identificatie van rol types
- Security status indicatoren - Kleurgecodeerde risico's
- PIM adoptie percentage - Compliance tracking
- Top rollen overzicht - Meest gebruikte privileges
- Groepslidmaatschap indicaties - Via groep of direct toegewezen
- Permanent rol detectie - Identificeert security risico's
- Global Admin tracking - Monitort hoogste privileges
- PIM adoptie metrics - Compliance percentage
- Groepsleden analyse - Verborgen toegang via groepen
- PIM adoptie > 90% wordt aanbevolen
- Minimaliseer permanent rollen voor betere security
- Global Admins < 5 per tenant als guideline
- Regelmatige access reviews voor compliance
De -ReportOnly
parameter is handig in deze situaties:
- Snel HTML dashboard regenereren - Zonder wachten op API calls
- Verschillende visualisaties - Experimenteren met configuratie wijzigingen
- Demo doeleinden - Presenteren van bestaande data
- Troubleshooting HTML - Testen van dashboard wijzigingen
- Offline analyse - Werken met eerder opgehaalde data
- β‘ Snelheid - Geen API authenticatie of netwerkverkeer nodig
- π Vergelijking - Automatische detectie van wijzigingen tussen exports
- πΎ EfficiΓ«ntie - Hergebruik van bestaande data
- π¨ Flexibiliteit - Makkelijk experimenteren met rapportage
- Minimaal één bestaande export (via normale uitvoering)
*_All_Customers_Full_Report.csv
bestand in export directory- Geldige
config.json
voor HTML instellingen
# Installeer Microsoft Graph modules handmatig
Install-Module Microsoft.Graph.Authentication -Scope CurrentUser
Install-Module Microsoft.Graph.Identity.Governance -Scope CurrentUser
- Controleer Azure AD App permissions
- Zorg voor admin consent op tenant niveau
- Verificeer client secret geldigheid
- Maak
credentials.json
in script directory - Controleer JSON syntax en formatting
- Zorg voor juiste property names
Symptomen:
- Script rapporteert groepsleden niet in de output
- Alleen directe rol-toewijzingen zijn zichtbaar
- Missing group membership data in reports
Mogelijke oorzaken en oplossingen:
-
Microsoft Graph permissions:
Benodigde permissions: - Group.Read.All (Application permission) - Directory.Read.All (Application permission)
-
Admin consent:
- Zorg dat admin consent is verleend voor alle permissions
- Check Azure AD > App registrations > [Your App] > API permissions
- "Grant admin consent" moet groen zijn
-
Groep configuratie:
- Verificeer dat security groups bestaan in de tenant
- Check of groepen daadwerkelijk leden hebben
- Controleer of groepen zijn toegewezen aan Azure AD rollen
-
Script logging controleren:
# Run script met verbose output .\Get-PIMUsers.ps1 -Verbose # Check voor specifieke error messages # Kijk naar "Group enumeration" sectie in output
-
Manual verificatie:
# Test Group API connectivity Connect-MgGraph -Scopes "Group.Read.All" Get-MgGroup -Filter "displayName eq 'YourGroupName'" Get-MgGroupMember -GroupId "group-id-here"
- Fork het repository
- Create een feature branch (
git checkout -b feature/AmazingFeature
) - Commit je changes (
git commit -m 'Add AmazingFeature'
) - Push naar branch (
git push origin feature/AmazingFeature
) - Open een Pull Request
- β Multi-tenant ondersteuning met flexibele credentials
- β Groepsleden detectie voor alle rol-toewijzingen
- β Modern HTML Dashboard met dark/light mode
- β Nieuwe bestandsnaam conventie zonder timestamps
- β Uitgebreide error handling en logging
- β DataTables integratie voor interactieve tabellen
- β Per-klant rapportage met complete segregatie
- β Security metrics en compliance tracking
Dit project is gelicenseerd onder de MIT License.
- Versie: 1.0
- Laatste update: 2025-08-16
- Microsoft Graph PowerShell SDK team
- DataTables voor table functionaliteit
- FontAwesome voor moderne iconen
- jQuery voor DOM manipulatie
π‘ Tip: Voor de beste ervaring, open het HTML dashboard in een moderne browser zoals Chrome, Firefox, of Edge.
π Security: Bewaar credential bestanden veilig en deel ze nooit in version control.
π Analytics: Gebruik de HTML dashboard voor real-time insights en de CSV bestanden voor uitgebreide analyse.