https://github.com/scns/privileged-users-report-multitenant
PowerShell-tool voor PIM- en permanente rolrapportage in meerdere Microsoft 365/Azure AD tenants.
https://github.com/scns/privileged-users-report-multitenant
multitenant multitenant-applications pim privileged privileged-access-management privileged-access-security privileged-identity-management security security-tools
Last synced: 20 days ago
JSON representation
PowerShell-tool voor PIM- en permanente rolrapportage in meerdere Microsoft 365/Azure AD tenants.
- Host: GitHub
- URL: https://github.com/scns/privileged-users-report-multitenant
- Owner: scns
- License: mit
- Created: 2025-08-13T11:15:18.000Z (7 months ago)
- Default Branch: main
- Last Pushed: 2026-01-27T05:27:30.000Z (about 2 months ago)
- Last Synced: 2026-01-27T18:39:06.941Z (about 2 months ago)
- Topics: multitenant, multitenant-applications, pim, privileged, privileged-access-management, privileged-access-security, privileged-identity-management, security, security-tools
- Language: PowerShell
- Homepage: https://mrtn.blog
- Size: 225 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Codeowners: .github/CODEOWNERS
- Security: SECURITY.md
Awesome Lists containing this project
README
# PIM & Permanent Role Users Report - Multi Tenant
Een uitgebreide PowerShell-oplossing voor het analyseren van Privileged Identity Management (PIM) en permanente roltoewijzingen in meerdere Microsoft 365/Azure AD tenants.
## π Overzicht
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
## πΎ Backup Functionaliteit
### Automatische Backups
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
### Backup Configuratie
```json
"BackupSettings": {
"EnableBackup": true,
"BackupRoot": "backups",
"ExportBackupSubfolder": "exports",
"ConfigBackupSubfolder": "config",
"EnableExportBackup": true,
"EnableConfigBackup": true,
"ExportBackupRetention": 5,
"ConfigBackupRetention": 3
}
```
### Backup Instellingen
- **`EnableBackup`** - Hoofdschakelaar voor backup functionaliteit
- **`BackupRoot`** - Root directory voor alle backups (standaard: "backups")
- **`ExportBackupSubfolder`** - Subdirectory voor export backups
- **`ConfigBackupSubfolder`** - Subdirectory voor configuratie backups
- **`EnableExportBackup`** - 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)
### Backup Voordelen
β
**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
## π Wijzigingsdetectie
### Automatische Change Detection
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.
### Intelligente PIM Filtering
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.
### Wel Gerapporteerde Wijzigingen
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
### Change Report Output
```csv
# 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
```
### Configuratie
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
### Wijzigingsdetectie Voordelen
β
**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
### Backup Structuur
```text
backups/
βββ exports/
β βββ exports-20250817_200746.zip
β βββ exports-20250816_154321.zip
β βββ ...
βββ config/
βββ config-20250817_200752.zip
βββ config-20250816_154325.zip
βββ ...
```
## π§ Troubleshooting*PIM rol-toewijzingen** (Eligible en Active)'
- **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
## β¨ Functies
### π Uitgebreide Analyse
- **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
### π Modern HTML Dashboard
- **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
### π Uitgebreide Rapportage
- **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
### π’ Multi-Tenant Ondersteuning
- **Meerdere tenants** in één run
- **Flexibele credential structuur** ondersteuning
- **Foutafhandeling** per tenant
- **Gedetailleerde logging** met voortgangsindicaties
## π Installatie
### Vereisten
- **PowerShell 5.1** of hoger
- **Microsoft Graph PowerShell modules** (automatisch geΓ―nstalleerd)
- **Azure AD App Registration** met juiste permissies
### Benodigde Permissies
Configureer de volgende Microsoft Graph API permissies in Azure AD:
```text
RoleManagement.Read.Directory
Directory.Read.All
User.Read.All
Group.Read.All
Application.Read.All
```
### Setup
1. **Clone het repository**:
```bash
git clone https://github.com/scns/Privileged-Users-Report-MultiTenant.git
cd Privileged-Users-Report-MultiTenant
```
2. **Configureer credentials**:
```bash
# Kopieer template bestanden
copy _credentials.json credentials.json
copy _config.json config.json
# Bewerk credentials.json met jouw tenant gegevens
notepad credentials.json
```
3. **Run het script**:
```powershell
.\Get-PIMUsers.ps1
```
## βοΈ Configuratie
### credentials.json
Maak een `credentials.json` bestand met tenant informatie:
```json
{
"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
### config.json (Optioneel)
Pas rapportage-instellingen aan:
```json
{
"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
## π₯οΈ Gebruik
### Basis Gebruik
```powershell
# Standaard configuratie
.\Get-PIMUsers.ps1
# Custom configuratie
.\Get-PIMUsers.ps1 -ConfigFile "custom-config.json" -OutputPath "C:\Reports"
```
### Parameters
- `-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
### Gebruik voorbeelden
```powershell
# 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
```
## π Output Bestanden
### Naamconventie
Alle bestanden gebruiken het format: `YYYYMMDD_Customer_ReportType.csv`
### Per Klant
- `20250816_Customer1_Full_Report.csv` - Alle rol-toewijzingen
- `20250816_Customer1_Users_Only.csv` - Alleen gebruikers
- `20250816_Customer1_PIM_Eligible.csv` - PIM Eligible rollen
- `20250816_Customer1_PIM_Active.csv` - Actieve PIM rollen
- `20250816_Customer1_Permanent_Roles.csv` - Permanente rollen
- `20250816_Customer1_Summary.csv` - Samenvattingsrapport
### Gecombineerde Rapporten
- `20250816_All_Customers_Full_Report.csv` - Alle klanten gecombineerd
- `20250816_All_Customers_High_Privilege.csv` - High-privilege rollen
- `20250816_All_Customers_PIM_vs_Permanent_Comparison.csv` - Vergelijking
- `PIM_Role_Dashboard.html` - **Interactief HTML Dashboard**
## π¨ HTML Dashboard Features
### π± Modern Interface
- **Responsive design** - Werkt op desktop, tablet, en mobile
- **Dark/Light mode** - Automatische thema-persistentie
- **FontAwesome iconen** - Professionele UI elementen
- **Moderne kleuren** - Visueel aantrekkelijke statistieken
### π Interactieve Elementen
- **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
#### π― Clickable Filter Buttons
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
### π Data Visualisatie
- **Security status indicatoren** - Kleurgecodeerde risico's
- **PIM adoptie percentage** - Compliance tracking
- **Top rollen overzicht** - Meest gebruikte privileges
- **Groepslidmaatschap indicaties** - Via groep of direct toegewezen
## π Security Features
### π‘οΈ Risk Assessment
- **Permanent rol detectie** - Identificeert security risico's
- **Global Admin tracking** - Monitort hoogste privileges
- **PIM adoptie metrics** - Compliance percentage
- **Groepsleden analyse** - Verborgen toegang via groepen
### π Best Practices
- **PIM adoptie > 90%** wordt aanbevolen
- **Minimaliseer permanent rollen** voor betere security
- **Global Admins < 5 per tenant** als guideline
- **Regelmatige access reviews** voor compliance
## οΏ½ ReportOnly Mode
### Wanneer gebruiken?
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
### Voordelen
- β‘ **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
### ReportOnly Vereisten
- Minimaal één bestaande export (via normale uitvoering)
- `*_All_Customers_Full_Report.csv` bestand in export directory
- Geldige `config.json` voor HTML instellingen
## οΏ½π§ Troubleshooting
### Veelvoorkomende Problemen
#### "Module niet gevonden"
```powershell
# Installeer Microsoft Graph modules handmatig
Install-Module Microsoft.Graph.Authentication -Scope CurrentUser
Install-Module Microsoft.Graph.Identity.Governance -Scope CurrentUser
```
#### "Insufficient privileges"
- Controleer Azure AD App permissions
- Zorg voor admin consent op tenant niveau
- Verificeer client secret geldigheid
#### "Credentials file not found"
- Maak `credentials.json` in script directory
- Controleer JSON syntax en formatting
- Zorg voor juiste property names
#### "Group members not detected"
**Symptomen:**
- Script rapporteert groepsleden niet in de output
- Alleen directe rol-toewijzingen zijn zichtbaar
- Missing group membership data in reports
**Mogelijke oorzaken en oplossingen:**
1. **Microsoft Graph permissions**:
```text
Benodigde permissions:
- Group.Read.All (Application permission)
- Directory.Read.All (Application permission)
```
2. **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
3. **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
4. **Script logging controleren**:
```powershell
# Run script met verbose output
.\Get-PIMUsers.ps1 -Verbose
# Check voor specifieke error messages
# Kijk naar "Group enumeration" sectie in output
```
5. **Manual verificatie**:
```powershell
# Test Group API connectivity
Connect-MgGraph -Scopes "Group.Read.All"
Get-MgGroup -Filter "displayName eq 'YourGroupName'"
Get-MgGroupMember -GroupId "group-id-here"
```
## π€ Contributing
1. **Fork** het repository
2. **Create** een feature branch (`git checkout -b feature/AmazingFeature`)
3. **Commit** je changes (`git commit -m 'Add AmazingFeature'`)
4. **Push** naar branch (`git push origin feature/AmazingFeature`)
5. **Open** een Pull Request
## π Changelog
### v1.0 (2025-08-16)
- β
**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
## π Licentie
Dit project is gelicenseerd onder de [MIT License](LICENSE).
## π¨βπ» Auteur
### PowerShell Script voor PIM & Permanent Role Rapportage
- Versie: 1.0
- Laatste update: 2025-08-16
## π Dankbetuigingen
- **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.