Skip to content

Commit feb5eb7

Browse files
authored
Fix Remove-EntraUserExtension (#1509)
1 parent b423054 commit feb5eb7

File tree

6 files changed

+265
-138
lines changed

6 files changed

+265
-138
lines changed

module/Entra/Microsoft.Entra/Users/Remove-EntraUserExtension.ps1

Lines changed: 28 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,25 @@
33
# Licensed under the MIT License. See License in the project root for license information.
44
# ------------------------------------------------------------------------------
55
function Remove-EntraUserExtension {
6-
[CmdletBinding(DefaultParameterSetName = 'Default')]
6+
[CmdletBinding(DefaultParameterSetName = 'RemoveSingle')]
77
param (
8-
[Parameter(ParameterSetName = "SetMultiple", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
8+
[Parameter(ParameterSetName = "RemoveMultiple", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
99
[System.Collections.Generic.List`1[System.String]] $ExtensionNames,
10-
11-
[Alias('ObjectId')]
12-
[Parameter(ParameterSetName = "SetSingle", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
13-
[Parameter(ParameterSetName = "SetMultiple", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
14-
[System.String] $ExtensionId,
1510

16-
[Parameter(ParameterSetName = "SetSingle", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
17-
[System.String] $ExtensionName
11+
[Parameter(ParameterSetName = "RemoveSingle", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
12+
[System.String] $ExtensionName,
13+
14+
[Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
15+
[Alias('ObjectId')]
16+
[ValidateNotNullOrEmpty()]
17+
[ValidateScript({
18+
if ($_ -match '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' -or
19+
$_ -match '^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$') {
20+
return $true
21+
}
22+
throw "UserId must be a valid email address or GUID."
23+
})]
24+
[System.String] $UserId
1825
)
1926

2027
begin {
@@ -29,64 +36,30 @@ function Remove-EntraUserExtension {
2936
PROCESS {
3037
$params = @{}
3138
$customHeaders = New-EntraCustomHeaders -Command $MyInvocation.MyCommand
32-
39+
$body = @{}
40+
3341
if ($null -ne $PSBoundParameters["ExtensionNames"]) {
34-
$params["ExtensionNames"] = $PSBoundParameters["ExtensionNames"]
35-
}
36-
if ($PSBoundParameters.ContainsKey("Debug")) {
37-
$params["Debug"] = $PSBoundParameters["Debug"]
38-
}
39-
if ($null -ne $PSBoundParameters["PipelineVariable"]) {
40-
$params["PipelineVariable"] = $PSBoundParameters["PipelineVariable"]
41-
}
42-
if ($null -ne $PSBoundParameters["InformationVariable"]) {
43-
$params["InformationVariable"] = $PSBoundParameters["InformationVariable"]
44-
}
45-
if ($null -ne $PSBoundParameters["OutBuffer"]) {
46-
$params["OutBuffer"] = $PSBoundParameters["OutBuffer"]
47-
}
48-
if ($null -ne $PSBoundParameters["WarningVariable"]) {
49-
$params["WarningVariable"] = $PSBoundParameters["WarningVariable"]
50-
}
51-
if ($PSBoundParameters.ContainsKey("Verbose")) {
52-
$params["Verbose"] = $PSBoundParameters["Verbose"]
53-
}
54-
if ($null -ne $PSBoundParameters["ErrorVariable"]) {
55-
$params["ErrorVariable"] = $PSBoundParameters["ErrorVariable"]
56-
}
57-
if ($null -ne $PSBoundParameters["ErrorAction"]) {
58-
$params["ErrorAction"] = $PSBoundParameters["ErrorAction"]
59-
}
60-
if ($null -ne $PSBoundParameters["ExtensionId"]) {
61-
$params["ExtensionId"] = $PSBoundParameters["ExtensionId"]
42+
foreach ($extName in $PSBoundParameters["ExtensionNames"]) {
43+
$body[$extName] = $null
44+
}
6245
}
6346
if ($null -ne $PSBoundParameters["ExtensionName"]) {
64-
$params["ExtensionName"] = $PSBoundParameters["ExtensionName"]
65-
}
66-
if ($null -ne $PSBoundParameters["InformationAction"]) {
67-
$params["InformationAction"] = $PSBoundParameters["InformationAction"]
68-
}
69-
if ($null -ne $PSBoundParameters["WarningAction"]) {
70-
$params["WarningAction"] = $PSBoundParameters["WarningAction"]
71-
}
72-
if ($null -ne $PSBoundParameters["ProgressAction"]) {
73-
$params["ProgressAction"] = $PSBoundParameters["ProgressAction"]
74-
}
75-
if ($null -ne $PSBoundParameters["OutVariable"]) {
76-
$params["OutVariable"] = $PSBoundParameters["OutVariable"]
47+
$body[$PSBoundParameters["ExtensionName"]] = $null
7748
}
7849

50+
# Invoke API call using UserId and ExtensionId
7951
Write-Debug("============================ TRANSFORMATIONS ============================")
8052
$params.Keys | ForEach-Object { "$_ : $($params[$_])" } | Write-Debug
8153
Write-Debug("=========================================================================`n")
82-
83-
$response = Remove-MgUserExtension @params -Headers $customHeaders
54+
55+
$uri = "/v1.0/users/$UserId"
56+
$response = Invoke-MgGraphRequest -Method PATCH -Uri $uri -Body $body -Headers $customHeaders
8457
$response | ForEach-Object {
8558
if ($null -ne $_) {
86-
Add-Member -InputObject $_ -MemberType AliasProperty -Name ObjectId -Value Id
87-
59+
Add-Member -InputObject $_ -MemberType AliasProperty -Name ObjectId -Value UserId
8860
}
8961
}
62+
9063
$response
9164
}
9265
}

module/EntraBeta/Microsoft.Entra.Beta/Users/Remove-EntraBetaUserExtension.ps1

Lines changed: 30 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,25 @@
33
# Licensed under the MIT License. See License in the project root for license information.
44
# ------------------------------------------------------------------------------
55
function Remove-EntraBetaUserExtension {
6-
[CmdletBinding(DefaultParameterSetName = 'SetSingle')]
6+
[CmdletBinding(DefaultParameterSetName = 'RemoveSingle')]
77
param (
8-
[Parameter(ParameterSetName = "SetSingle", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
9-
[System.String] $ExtensionName,
10-
11-
[Alias('ObjectId')]
12-
[Parameter(ParameterSetName = "SetSingle", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
13-
[Parameter(ParameterSetName = "SetMultiple", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
14-
[System.String] $ExtensionId,
8+
[Parameter(ParameterSetName = "RemoveMultiple", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
9+
[System.Collections.Generic.List`1[System.String]] $ExtensionNames,
1510

16-
[Parameter(ParameterSetName = "SetMultiple", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
17-
[System.Collections.Generic.List`1[System.String]] $ExtensionNames
11+
[Parameter(ParameterSetName = "RemoveSingle", Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
12+
[System.String] $ExtensionName,
13+
14+
[Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
15+
[Alias('ObjectId')]
16+
[ValidateNotNullOrEmpty()]
17+
[ValidateScript({
18+
if ($_ -match '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' -or
19+
$_ -match '^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$') {
20+
return $true
21+
}
22+
throw "UserId must be a valid email address or GUID."
23+
})]
24+
[System.String] $UserId
1825
)
1926

2027
begin {
@@ -29,64 +36,30 @@ function Remove-EntraBetaUserExtension {
2936
PROCESS {
3037
$params = @{}
3138
$customHeaders = New-EntraBetaCustomHeaders -Command $MyInvocation.MyCommand
32-
33-
if ($null -ne $PSBoundParameters["ExtensionName"]) {
34-
$params["ExtensionName"] = $PSBoundParameters["ExtensionName"]
35-
}
36-
if ($null -ne $PSBoundParameters["ProgressAction"]) {
37-
$params["ProgressAction"] = $PSBoundParameters["ProgressAction"]
38-
}
39-
if ($PSBoundParameters.ContainsKey("Debug")) {
40-
$params["Debug"] = $PSBoundParameters["Debug"]
41-
}
42-
if ($null -ne $PSBoundParameters["OutBuffer"]) {
43-
$params["OutBuffer"] = $PSBoundParameters["OutBuffer"]
44-
}
45-
if ($null -ne $PSBoundParameters["ErrorAction"]) {
46-
$params["ErrorAction"] = $PSBoundParameters["ErrorAction"]
47-
}
48-
if ($null -ne $PSBoundParameters["WarningVariable"]) {
49-
$params["WarningVariable"] = $PSBoundParameters["WarningVariable"]
50-
}
51-
if ($null -ne $PSBoundParameters["WarningAction"]) {
52-
$params["WarningAction"] = $PSBoundParameters["WarningAction"]
53-
}
54-
if ($null -ne $PSBoundParameters["ExtensionId"]) {
55-
$params["ExtensionId"] = $PSBoundParameters["ExtensionId"]
56-
}
57-
if ($null -ne $PSBoundParameters["OutVariable"]) {
58-
$params["OutVariable"] = $PSBoundParameters["OutVariable"]
59-
}
60-
if ($PSBoundParameters.ContainsKey("Verbose")) {
61-
$params["Verbose"] = $PSBoundParameters["Verbose"]
62-
}
39+
$body = @{}
40+
6341
if ($null -ne $PSBoundParameters["ExtensionNames"]) {
64-
$params["ExtensionNames"] = $PSBoundParameters["ExtensionNames"]
65-
}
66-
if ($null -ne $PSBoundParameters["PipelineVariable"]) {
67-
$params["PipelineVariable"] = $PSBoundParameters["PipelineVariable"]
68-
}
69-
if ($null -ne $PSBoundParameters["InformationVariable"]) {
70-
$params["InformationVariable"] = $PSBoundParameters["InformationVariable"]
71-
}
72-
if ($null -ne $PSBoundParameters["InformationAction"]) {
73-
$params["InformationAction"] = $PSBoundParameters["InformationAction"]
42+
foreach ($extName in $PSBoundParameters["ExtensionNames"]) {
43+
$body[$extName] = $null
44+
}
7445
}
75-
if ($null -ne $PSBoundParameters["ErrorVariable"]) {
76-
$params["ErrorVariable"] = $PSBoundParameters["ErrorVariable"]
46+
if ($null -ne $PSBoundParameters["ExtensionName"]) {
47+
$body[$PSBoundParameters["ExtensionName"]] = $null
7748
}
7849

50+
# Invoke API call using UserId and ExtensionId
7951
Write-Debug("============================ TRANSFORMATIONS ============================")
8052
$params.Keys | ForEach-Object { "$_ : $($params[$_])" } | Write-Debug
8153
Write-Debug("=========================================================================`n")
82-
83-
$response = Remove-MgBetaUserExtension @params -Headers $customHeaders
54+
55+
$uri = "/beta/users/$UserId"
56+
$response = Invoke-MgGraphRequest -Method PATCH -Uri $uri -Body $body -Headers $customHeaders
8457
$response | ForEach-Object {
8558
if ($null -ne $_) {
86-
Add-Member -InputObject $_ -MemberType AliasProperty -Name ObjectId -Value Id
87-
59+
Add-Member -InputObject $_ -MemberType AliasProperty -Name ObjectId -Value UserId
8860
}
8961
}
62+
9063
$response
9164
}
9265
}

module/docs/entra-powershell-beta/Users/Remove-EntraBetaUserExtension.md

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,41 +22,54 @@ Removes a user extension.
2222

2323
## SYNTAX
2424

25-
### SetMultiple
25+
### RemoveMultiple
2626

2727
```powershell
2828
Remove-EntraBetaUserExtension
29-
-ObjectId <String>
29+
-UserId <String>
3030
-ExtensionNames <System.Collections.Generic.List`1[System.String]>
3131
[<CommonParameters>]
3232
```
3333

34-
### SetSingle
34+
### RemoveSingle
3535

3636
```powershell
3737
Remove-EntraBetaUserExtension
38-
-ObjectId <String>
38+
-UserId <String>
3939
-ExtensionName <String>
4040
[<CommonParameters>]
4141
```
4242

4343
## DESCRIPTION
4444

45-
The `Remove-EntraBetaUserExtension` cmdlet removes a user extension from Microsoft Entra ID. Specify `ObjectId` and `ExtensionNames` parameters to remove a user extension.
45+
The `Remove-EntraBetaUserExtension` cmdlet removes a user extension from Microsoft Entra ID. Specify `UserId` and `ExtensionName` or `ExtensionNames` parameters to remove a user extension.
4646

4747
## EXAMPLES
4848

49-
### Example 1: Remove the user extension
49+
### Example 1: Remove single user extension
5050

5151
```powershell
5252
Connect-Entra -Scopes 'User.ReadWrite.All'
53-
Remove-EntraBetaUserExtension -ObjectId '[email protected]' -ExtensionName 'Test Extension'
53+
Remove-EntraBetaUserExtension -UserId '[email protected]' -ExtensionName 'extension_bbbbbbbb111122223333cccccccccccc_TestExtension'
5454
```
5555

5656
This example demonstrates how to remove a user extension from Microsoft Entra ID.
5757

58-
- `ObjectId` parameter specifies the user Object ID.
59-
- `ExtensionName` parameter specifies the user ExtentionName.
58+
- `UserId` parameter specifies the user ID.
59+
- `ExtensionName` parameter specifies the user extension name.
60+
61+
### Example 2: Remove multiple user extensions
62+
63+
```powershell
64+
Connect-Entra -Scopes 'User.ReadWrite.All'
65+
Remove-EntraBetaUserExtension -UserId '[email protected]' -ExtensionNames 'extension_bbbbbbbb111122223333cccccccccccc_TestExtension','extension_bbbbbbbb111122223333cccccccccccc_DummyExtension'
66+
```
67+
68+
This example demonstrates how to remove a user extension from Microsoft Entra ID.
69+
70+
- `UserId` parameter specifies the user ID.
71+
- `ExtensionNames` parameter specifies a collection user extension names.
72+
6073

6174
## PARAMETERS
6275

@@ -66,7 +79,7 @@ Specifies the name of an extension.
6679

6780
```yaml
6881
Type: System.String
69-
Parameter Sets: SetSingle
82+
Parameter Sets: RemoveSingle
7083
Aliases:
7184

7285
Required: True
@@ -82,7 +95,7 @@ Specifies an array of extension names.
8295
8396
```yaml
8497
Type: System.Collections.Generic.List`1[System.String]
85-
Parameter Sets: SetMultiple
98+
Parameter Sets: RemoveMultiple
8699
Aliases:
87100

88101
Required: True
@@ -92,9 +105,9 @@ Accept pipeline input: True (ByPropertyName, ByValue)
92105
Accept wildcard characters: False
93106
```
94107
95-
### -ObjectId
108+
### -UserId
96109
97-
Specifies an object ID.
110+
Specifies the ID of a user (as a User Principle Name or UserId) in Microsoft Entra ID.
98111
99112
```yaml
100113
Type: System.String

0 commit comments

Comments
 (0)