Skip to content

Commit 87b1308

Browse files
authored
ADGroup: Changing group membership management mechanism (#620)
This is intended to change the way that the ADGroup resource manages group membership. The new implementation abandons usage of Add-ADGroupMember and Remove-ADGroupMember due to limitations with Foreign Security Principals. Instead we opt to utilize Set-ADGroup with the Add and Remove parameters, passing a hash object with the member key and a list of formatted SID values (e.g. - "<SID=SID_VALUE>").
1 parent f30a845 commit 87b1308

14 files changed

+1082
-381
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ For older change log history see the [historic changelog](HISTORIC_CHANGELOG.md)
88
## [Unreleased]
99

1010
### Added
11-
11+
- ADGroup
12+
- Added support for managing AD group membership of Foreign Security Principals. This involved completely
13+
refactoring group membership management to utilize the `Set-ADGroup` cmdlet and referencing SID values.
14+
([issue #619](https://github.com/dsccommunity/ActiveDirectoryDsc/issues/619)).
1215
- ADFineGrainedPasswordPolicy
1316
- New resource for creating and updating Fine Grained Password Policies for AD principal subjects.
1417
([issue #584](https://github.com/dsccommunity/ActiveDirectoryDsc/issues/584)).

source/DSCResources/MSFT_ADGroup/MSFT_ADGroup.psm1

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -655,8 +655,6 @@ function Set-TargetResource
655655

656656
Assert-MemberParameters @assertMemberParameters
657657

658-
$membersInMultipleDomains = $false
659-
660658
if ($MembershipAttribute -eq 'DistinguishedName')
661659
{
662660
$allMembers = $Members + $MembersToInclude + $MembersToExclude
@@ -676,7 +674,6 @@ function Set-TargetResource
676674
if ($GroupMemberDomainCount -gt 1 -or ($groupMemberDomains -ine (Get-DomainName)).Count -gt 0)
677675
{
678676
Write-Verbose -Message ($script:localizedData.GroupMembershipMultipleDomains -f $GroupMemberDomainCount)
679-
$membersInMultipleDomains = $true
680677
}
681678
}
682679

@@ -842,12 +839,24 @@ function Set-TargetResource
842839
{
843840
Write-Verbose -Message ($script:localizedData.RemovingGroupMembers -f $adGroupMembers.Count, $GroupName)
844841

845-
Remove-ADGroupMember @commonParameters -Members $adGroupMembers -Confirm:$false -ErrorAction 'Stop'
842+
$setADCommonGroupMemberParms = @{
843+
Members = $adGroupMembers
844+
MembershipAttribute = $MembershipAttribute
845+
Parameters = $commonParameters
846+
Action = 'Remove'
847+
}
848+
Set-ADCommonGroupMember @setADCommonGroupMemberParms
846849
}
847850

848851
Write-Verbose -Message ($script:localizedData.AddingGroupMembers -f $Members.Count, $GroupName)
849852

850-
Add-ADCommonGroupMember -Parameters $commonParameters -Members $Members -MembersInMultipleDomains:$membersInMultipleDomains
853+
$setADCommonGroupMemberParms = @{
854+
Members = $Members
855+
MembershipAttribute = $MembershipAttribute
856+
Parameters = $commonParameters
857+
Action = 'Add'
858+
}
859+
Set-ADCommonGroupMember @setADCommonGroupMemberParms
851860
}
852861

853862
if ($PSBoundParameters.ContainsKey('MembersToInclude') -and -not [System.String]::IsNullOrEmpty($MembersToInclude))
@@ -856,7 +865,13 @@ function Set-TargetResource
856865

857866
Write-Verbose -Message ($script:localizedData.AddingGroupMembers -f $MembersToInclude.Count, $GroupName)
858867

859-
Add-ADCommonGroupMember -Parameters $commonParameters -Members $MembersToInclude -MembersInMultipleDomains:$membersInMultipleDomains
868+
$setADCommonGroupMemberParms = @{
869+
Members = $MembersToInclude
870+
MembershipAttribute = $MembershipAttribute
871+
Parameters = $commonParameters
872+
Action = 'Add'
873+
}
874+
Set-ADCommonGroupMember @setADCommonGroupMemberParms
860875
}
861876

862877
if ($PSBoundParameters.ContainsKey('MembersToExclude') -and -not [System.String]::IsNullOrEmpty($MembersToExclude))
@@ -865,7 +880,13 @@ function Set-TargetResource
865880

866881
Write-Verbose -Message ($script:localizedData.RemovingGroupMembers -f $MembersToExclude.Count, $GroupName)
867882

868-
Remove-ADGroupMember @commonParameters -Members $MembersToExclude -Confirm:$false -ErrorAction 'Stop'
883+
$setADCommonGroupMemberParms = @{
884+
Members = $MembersToExclude
885+
MembershipAttribute = $MembershipAttribute
886+
Parameters = $commonParameters
887+
Action = 'Remove'
888+
}
889+
Set-ADCommonGroupMember @setADCommonGroupMemberParms
869890
}
870891
}
871892
}
@@ -960,15 +981,27 @@ function Set-TargetResource
960981

961982
Write-Verbose -Message ($script:localizedData.AddingGroupMembers -f $Members.Count, $GroupName)
962983

963-
Add-ADCommonGroupMember -Parameters $commonParameters -Members $Members -MembersInMultipleDomains:$membersInMultipleDomains
984+
$setADCommonGroupMemberParms = @{
985+
Members = $Members
986+
MembershipAttribute = $MembershipAttribute
987+
Parameters = $commonParameters
988+
Action = 'Add'
989+
}
990+
Set-ADCommonGroupMember @setADCommonGroupMemberParms
964991
}
965992
elseif ($PSBoundParameters.ContainsKey('MembersToInclude') -and -not [System.String]::IsNullOrEmpty($MembersToInclude))
966993
{
967994
$MembersToInclude = Remove-DuplicateMembers -Members $MembersToInclude
968995

969996
Write-Verbose -Message ($script:localizedData.AddingGroupMembers -f $MembersToInclude.Count, $GroupName)
970997

971-
Add-ADCommonGroupMember -Parameters $commonParameters -Members $MembersToInclude -MembersInMultipleDomains:$membersInMultipleDomains
998+
$setADCommonGroupMemberParms = @{
999+
Members = $MembersToInclude
1000+
MembershipAttribute = $MembershipAttribute
1001+
Parameters = $commonParameters
1002+
Action = 'Add'
1003+
}
1004+
Set-ADCommonGroupMember @setADCommonGroupMemberParms
9721005
}
9731006
}
9741007
} #end catch
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<#PSScriptInfo
2+
.VERSION 1.0.0
3+
.GUID f2ecc331-e242-4204-a6b1-54fd68c852b7
4+
.AUTHOR DSC Community
5+
.COMPANYNAME DSC Community
6+
.COPYRIGHT DSC Community contributors. All rights reserved.
7+
.TAGS DSCConfiguration
8+
.LICENSEURI https://github.com/dsccommunity/ActiveDirectoryDsc/blob/master/LICENSE
9+
.PROJECTURI https://github.com/dsccommunity/ActiveDirectoryDsc
10+
.ICONURI https://dsccommunity.org/images/DSC_Logo_300p.png
11+
.RELEASENOTES
12+
Initial release
13+
#>
14+
15+
#Requires -Module ActiveDirectoryDsc
16+
17+
<#
18+
.DESCRIPTION
19+
This configuration will create a new domain-local group in contoso with
20+
two members; one from the contoso domain and one from the fabrikam domain.
21+
This qualified SamAccountName format is required if any of the users are in a
22+
one-way trusted forest/external domain.
23+
#>
24+
Configuration ADGroup_NewGroupOneWayTrust_Config
25+
{
26+
Import-DscResource -ModuleName ActiveDirectoryDsc
27+
28+
node localhost
29+
{
30+
ADGroup 'ExampleExternalTrustGroup'
31+
{
32+
GroupName = 'ExampleExternalTrustGroup'
33+
GroupScope = 'DomainLocal'
34+
MembershipAttribute = 'SamAccountName'
35+
Members = @(
36+
'contoso\john'
37+
'fabrikam\toby'
38+
)
39+
}
40+
}
41+
}

source/Modules/ActiveDirectoryDsc.Common/ActiveDirectoryDsc.Common.psd1

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
'ConvertTo-DeploymentDomainMode'
3838
'Restore-ADCommonObject'
3939
'Get-ADDomainNameFromDistinguishedName'
40-
'Add-ADCommonGroupMember'
40+
'Set-ADCommonGroupMember'
4141
'Get-DomainControllerObject'
4242
'Test-IsDomainController'
4343
'Convert-PropertyMapToObjectProperties'
@@ -53,6 +53,8 @@
5353
'Get-ActiveDirectoryDomain'
5454
'Get-ActiveDirectoryForest'
5555
'Resolve-SamAccountName'
56+
'Resolve-SecurityIdentifier'
57+
'Resolve-MembersSecurityIdentifier'
5658
)
5759

5860
# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.

0 commit comments

Comments
 (0)