|
1 | 1 | @{ |
2 | 2 | # Script module or binary module file associated with this manifest. |
3 | | - RootModule = 'PIMActivation.psm1' |
| 3 | + RootModule = 'PIMActivation.psm1' |
4 | 4 |
|
5 | 5 | # Version number of this module. |
6 | | - ModuleVersion = '1.2.6' |
| 6 | + ModuleVersion = '2.0.0' |
7 | 7 |
|
8 | 8 | # Supported PSEditions - Requires PowerShell Core (7+) |
9 | 9 | CompatiblePSEditions = @('Core') |
10 | 10 |
|
11 | 11 | # ID used to uniquely identify this module |
12 | | - GUID = 'a3f4b8e2-9c7d-4e5f-b6a9-8d7c6b5a4f3e' |
| 12 | + GUID = 'a3f4b8e2-9c7d-4e5f-b6a9-8d7c6b5a4f3e' |
13 | 13 |
|
14 | 14 | # Author of this module |
15 | | - Author = 'Sebastian Flæng Markdanner' |
| 15 | + Author = 'Sebastian Flæng Markdanner' |
16 | 16 |
|
17 | 17 | # Company or vendor of this module |
18 | | - CompanyName = 'Cloudy With a Change Of Security' |
| 18 | + CompanyName = 'Cloudy With a Change Of Security' |
19 | 19 |
|
20 | 20 | # Copyright statement for this module |
21 | | - Copyright = '(c) 2025 Sebastian Flæng Markdanner. All rights reserved.' |
| 21 | + Copyright = '(c) 2025 Sebastian Flæng Markdanner. All rights reserved.' |
22 | 22 |
|
23 | 23 | # Description of the functionality provided by this module |
24 | | - Description = 'PowerShell module for managing Microsoft Entra ID Privileged Identity Management (PIM) role activations through a modern GUI interface. Supports authentication context, bulk operations, and policy compliance. Developed with AI assistance. Requires PowerShell 7+.' |
| 24 | + Description = 'PowerShell module for managing Microsoft Entra ID Privileged Identity Management (PIM) role activations through a modern GUI interface. Supports Entra ID roles, PIM-enabled groups, and Azure Resource roles. Features authentication context, bulk operations, and policy compliance. Developed with AI assistance. Requires PowerShell 7+.' |
25 | 25 |
|
26 | 26 | # Minimum version of the PowerShell engine required by this module |
27 | | - PowerShellVersion = '7.0' |
| 27 | + PowerShellVersion = '7.0' |
28 | 28 |
|
29 | 29 | # Script to run after the module is imported |
30 | | - ScriptsToProcess = @() |
| 30 | + ScriptsToProcess = @() |
31 | 31 |
|
32 | 32 | # Required modules - conditionally enforced based on availability |
33 | 33 | # Auto-installation logic in PSM1 handles missing modules |
34 | | - RequiredModules = @() |
| 34 | + RequiredModules = @() |
35 | 35 |
|
36 | 36 | # Functions to export from this module |
37 | | - FunctionsToExport = @( |
| 37 | + FunctionsToExport = @( |
38 | 38 | 'Start-PIMActivation' |
39 | 39 | ) |
40 | 40 |
|
41 | 41 | # Cmdlets to export from this module |
42 | | - CmdletsToExport = @() |
| 42 | + CmdletsToExport = @() |
43 | 43 |
|
44 | 44 | # Variables to export from this module |
45 | | - VariablesToExport = @() |
| 45 | + VariablesToExport = @() |
46 | 46 |
|
47 | 47 | # Aliases to export from this module |
48 | | - AliasesToExport = @() |
| 48 | + AliasesToExport = @() |
49 | 49 |
|
50 | 50 | # Private data to pass to the module specified in RootModule/ModuleToProcess |
51 | | - PrivateData = @{ |
| 51 | + PrivateData = @{ |
52 | 52 | PSData = @{ |
53 | 53 | # Tags applied to this module for online gallery discoverability |
54 | | - Tags = @('PIM', 'PrivilegedIdentityManagement', 'EntraID', 'AzureAD', 'Identity', 'Governance', 'RBAC', 'GUI', 'Authentication', 'ConditionalAccess', 'Security', 'Microsoft', 'Graph') |
| 54 | + Tags = @('PIM', 'PrivilegedIdentityManagement', 'EntraID', 'AzureAD', 'Azure', 'AzureResources', 'Identity', 'Governance', 'RBAC', 'GUI', 'Authentication', 'ConditionalAccess', 'Security', 'Microsoft', 'Graph') |
55 | 55 |
|
56 | 56 | # A URL to the license for this module. |
57 | | - LicenseUri = 'https://github.com/Noble-Effeciency13/PIMActivation/blob/main/LICENSE' |
| 57 | + LicenseUri = 'https://github.com/Noble-Effeciency13/PIMActivation/blob/main/LICENSE' |
58 | 58 |
|
59 | 59 | # A URL to the main website for this project. |
60 | | - ProjectUri = 'https://github.com/Noble-Effeciency13/PIMActivation' |
| 60 | + ProjectUri = 'https://github.com/Noble-Effeciency13/PIMActivation' |
61 | 61 |
|
62 | 62 | # A URL to an icon representing this module. |
63 | | - IconUri = 'https://raw.githubusercontent.com/Noble-Effeciency13/PIMActivation/main/Resources/icon.png' |
| 63 | + IconUri = 'https://raw.githubusercontent.com/Noble-Effeciency13/PIMActivation/main/Resources/icon.png' |
64 | 64 |
|
65 | 65 | # ReleaseNotes |
66 | | - ReleaseNotes = @' |
67 | | -## PIMActivation v1.2.6 |
| 66 | + ReleaseNotes = @' |
| 67 | +## PIMActivation v2.0.0 - Azure Resources & Parallel Processing Engine |
| 68 | +
|
| 69 | +### 🚀 Major New Features |
| 70 | +- **Azure Resource Roles Support**: Full integration with Azure Resource PIM for subscription, resource group, and individual resource role management |
| 71 | +- **Parallel Processing Engine**: High-performance concurrent execution for all operations with real-time progress tracking |
| 72 | +- **Enhanced Role Display**: Azure roles display with [Azure] prefix and portal-aligned resource/scope columns |
| 73 | +- **Cross-Subscription Support**: Automatic enumeration and management across all accessible Azure subscriptions |
| 74 | +- **Modular Architecture**: Split functions into individual files for better maintainability |
| 75 | +
|
| 76 | +### ⚡ Performance Features |
| 77 | +- **Parallel Processing by Default**: Concurrent execution for Azure, Entra, and Group operations |
| 78 | +- **Real-Time Progress Tracking**: Enhanced verbose output with emoji indicators (🚀, ✅, ❌) and timing metrics |
| 79 | +- **Smart Throttling**: Default ThrottleLimit of 10 concurrent operations, configurable up to 50 |
| 80 | +- **Thread-Safe Operations**: ConcurrentBag and ConcurrentDictionary for safe parallel result aggregation |
68 | 81 |
|
69 | 82 | ### ✅ Added |
70 | | -- Support for custom app registration for Microsoft Graph delegated auth. New parameters `ClientId` and `TenantId` are available on `Start-PIMActivation` and `Connect-PIMServices`. When both are provided, the module authenticates using the specified app registration; otherwise, it falls back to the default interactive flow. |
| 83 | +- Complete Azure Resource role activation and deactivation support |
| 84 | +- Select All button for bulk role selection in GUI |
| 85 | +- `Get-AzureResourceRoles` function with parallel subscription processing |
| 86 | +- `Initialize-AzureResourceSupport` for Azure module management |
| 87 | +- `DisableParallelProcessing` parameter for sequential processing when needed |
| 88 | +- Enhanced scope parsing for Azure ARM resource hierarchies |
| 89 | +- Support for both PIM-eligible and active Azure Resource role assignments |
71 | 90 |
|
72 | | -### 🔧 Fixes |
73 | | -- Resolved Microsoft Graph query limitations when collecting role policies for large sets (e.g., >20 eligible roles of the same type). Implemented chunked batching and a REST-based path with pagination so policies are fetched reliably at scale. |
74 | | -- Added robust fallback to per-item fetching when the service rejects complex filters or returns zero results. |
75 | | -- Corrected control flow and ensured `-ErrorAction Stop` on policy assignment calls so fallbacks always trigger when needed. |
76 | | -- Addressed a transient InvalidResource/InvalidFilter regression introduced during the fix and removed it. |
| 91 | +### 🔧 Enhanced Performance |
| 92 | +- All v1.2.x optimizations preserved and extended: |
| 93 | + - ArrayList-based collections for optimal memory usage |
| 94 | + - Batch API operations reducing Graph calls by 85% |
| 95 | + - Memoized scope display name lookups |
| 96 | + - Intelligent role deduplication and caching |
| 97 | + - NEW: Parallel processing across all role types and policy operations |
77 | 98 |
|
78 | | -### ⚡ Improvements |
79 | | -- Performance: Replaced array concatenations with `ArrayList`/`AddRange` in hot paths (role collection and batch aggregations). |
80 | | -- Stability: Flattened `ArrayList` before mapping policies; treat `InvalidResource` like `InvalidFilter` for resilient behavior. |
81 | | -- Caching: Memoized scope and AU display name lookups in `Get-ScopeDisplayName` to reduce repeated Graph calls. |
| 99 | +### 📋 Requirements |
| 100 | +- PowerShell 7.0+ (required for parallel processing engine) |
| 101 | +- Az.Accounts 5.1.0+ and Az.Resources 6.0.0+ (auto-installed for Azure resources) |
| 102 | +- Microsoft Graph PowerShell modules (existing requirements preserved) |
82 | 103 |
|
83 | 104 | ### 📚 More |
84 | 105 | - Changelog: https://github.com/Noble-Effeciency13/PIMActivation/blob/main/CHANGELOG.md |
| 106 | +- Blog Post: https://www.chanceofsecurity.com/post/microsoft-entra-pim-bulk-role-activation-tool |
85 | 107 | - Releases: https://github.com/Noble-Effeciency13/PIMActivation/releases |
86 | 108 |
|
87 | | -PowerShell module for Microsoft Entra ID PIM role activations with a modern GUI. Requires PowerShell 7+. |
| 109 | +PowerShell module for comprehensive PIM role management across Entra ID, Groups, and Azure Resources with parallel processing engine and modern GUI. |
88 | 110 | '@ |
89 | 111 | # Flag to indicate whether the module requires explicit user acceptance |
90 | 112 | RequireLicenseAcceptance = $false |
|
0 commit comments