Skip to content

Commit b2838d9

Browse files
authored
ADOrganizationalUnit: Added DomainController Parameter #563 (#666)
1 parent 1b336ff commit b2838d9

File tree

5 files changed

+318
-67
lines changed

5 files changed

+318
-67
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ For older change log history see the [historic changelog](HISTORIC_CHANGELOG.md)
2323
- ADDomain
2424
- Refactored to use Get-DomainObject.
2525
- Refactored Unit Tests.
26+
- ADOrganizationalUnit
27+
- Added DomainController Parameter.
2628

2729
## [6.2.0] - 2022-05-01
2830

source/DSCResources/MSFT_ADOrganizationalUnit/MSFT_ADOrganizationalUnit.psm1

+120-19
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,17 @@ $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US'
1919
.PARAMETER Path
2020
Specifies the X.500 path of the OrganizationalUnit (OU) or container where the new object is created.
2121
22+
.PARAMETER Credential
23+
The credential to be used to perform the operation on Active Directory.
24+
25+
.PARAMETER DomainController
26+
Active Directory domain controller to enact the change upon.
27+
2228
.NOTES
2329
Used Functions:
2430
Name | Module
2531
------------------------------|--------------------------
32+
Get-ADCommonParameters | ActiveDirectoryDsc.Common
2633
Get-ADOrganizationalUnit | ActiveDirectory
2734
Assert-Module | DscResource.Common
2835
New-InvalidOperationException | DscResource.Common
@@ -39,17 +46,39 @@ function Get-TargetResource
3946

4047
[Parameter(Mandatory = $true)]
4148
[System.String]
42-
$Path
49+
$Path,
50+
51+
[Parameter()]
52+
[ValidateNotNull()]
53+
[System.Management.Automation.PSCredential]
54+
[System.Management.Automation.CredentialAttribute()]
55+
$Credential,
56+
57+
[Parameter()]
58+
[ValidateNotNull()]
59+
[System.String]
60+
$DomainController
4361
)
4462

4563
Assert-Module -ModuleName 'ActiveDirectory'
4664

47-
Write-Verbose ($script:localizedData.RetrievingOU -f $Name, $Path)
65+
$commonParameters = Get-ADCommonParameters @PSBoundParameters
66+
67+
Write-Verbose -Message ($script:localizedData.RetrievingOU -f $Name, $Path)
68+
69+
$getADOUProperties = ('Name', 'DistinguishedName', 'Description', 'ProtectedFromAccidentalDeletion')
4870

4971
try
5072
{
51-
$ou = Get-ADOrganizationalUnit -Filter "Name -eq `"$Name`"" -SearchBase $Path `
52-
-SearchScope OneLevel -Properties ProtectedFromAccidentalDeletion, Description
73+
$getADOUParameters = $commonParameters.Clone()
74+
$getADOUParameters.Filter = ('Name -eq "{0}"' -f $Name)
75+
$getADOUParameters.SearchBase = $Path
76+
$getADOUParameters.SearchScope = 'OneLevel'
77+
$getADOUParameters.Properties = $getADOUProperties
78+
$getADOUParameters.Remove('Identity')
79+
$getADOUParameters.Remove('Name')
80+
$getADOUParameters.Remove('Path')
81+
$ou = Get-ADOrganizationalUnit @getADOUParameters
5382
}
5483
catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]
5584
{
@@ -108,6 +137,9 @@ function Get-TargetResource
108137
.PARAMETER Credential
109138
The credential to be used to perform the operation on Active Directory.
110139
140+
.PARAMETER DomainController
141+
Active Directory domain controller to enact the change upon.
142+
111143
.PARAMETER ProtectedFromAccidentalDeletion
112144
Specifies if the Organizational Unit (OU) container should be protected from deletion. Default value is $true.
113145
@@ -161,30 +193,50 @@ function Test-TargetResource
161193
[Parameter()]
162194
[ValidateNotNull()]
163195
[System.Boolean]
164-
$RestoreFromRecycleBin
196+
$RestoreFromRecycleBin,
197+
198+
[Parameter()]
199+
[ValidateNotNullOrEmpty()]
200+
[System.String]
201+
$DomainController
165202
)
166203

167-
$targetResource = Get-TargetResource -Name $Name -Path $Path
204+
$getTargetResourceParameters = @{
205+
Name = $Name
206+
Path = $Path
207+
Credential = $Credential
208+
DomainController = $DomainController
209+
}
210+
211+
# Remove parameters that have not been specified, unless in the IgnoreParameters array
212+
@($getTargetResourceParameters.Keys) |
213+
ForEach-Object {
214+
if (-not $PSBoundParameters.ContainsKey($_))
215+
{
216+
$getTargetResourceParameters.Remove($_)
217+
}
218+
}
219+
$getTargetResourceResult = Get-TargetResource @getTargetResourceParameters
168220

169-
if ($targetResource.Ensure -eq 'Present')
221+
if ($getTargetResourceResult.Ensure -eq 'Present')
170222
{
171223
# Resource exists
172224
if ($Ensure -eq 'Present')
173225
{
174226
# Resource should exist
175-
$propertiesNotInDesiredState = (
176-
Compare-ResourcePropertyState -CurrentValue $targetResource -DesiredValues $PSBoundParameters -IgnoreProperties ('Credential', 'RestoreFromRecycleBin') |
177-
Where-Object -Property InDesiredState -eq $false)
227+
$ignoreProperties = @('DomainController', 'Credential', 'RestoreFromRecycleBin')
228+
$propertiesNotInDesiredState = (Compare-ResourcePropertyState -CurrentValues $getTargetResourceResult `
229+
-DesiredValues $PSBoundParameters -IgnoreProperties $ignoreProperties `
230+
-Verbose:$VerbosePreference | Where-Object -Property InDesiredState -eq $false)
178231

179232
if ($propertiesNotInDesiredState)
180233
{
181234
$inDesiredState = $false
182235
}
183236
else
184237
{
185-
# Resource is in the desired state
186-
Write-Verbose ($script:localizedData.OUInDesiredState -f $Name)
187-
238+
# Resource is in desired state
239+
Write-Verbose -Message ($script:localizedData.OUInDesiredState -f $Name)
188240
$inDesiredState = $true
189241
}
190242
}
@@ -234,6 +286,9 @@ function Test-TargetResource
234286
.PARAMETER Credential
235287
The credential to be used to perform the operation on Active Directory.
236288
289+
.PARAMETER DomainController
290+
Active Directory domain controller to enact the change upon.
291+
237292
.PARAMETER ProtectedFromAccidentalDeletion
238293
Specifies if the Organizational Unit (OU) container should be protected from deletion. Default value is $true.
239294
@@ -278,6 +333,11 @@ function Set-TargetResource
278333
[System.Management.Automation.CredentialAttribute()]
279334
$Credential,
280335

336+
[Parameter()]
337+
[ValidateNotNullOrEmpty()]
338+
[System.String]
339+
$DomainController,
340+
281341
[Parameter()]
282342
[ValidateNotNull()]
283343
[System.Boolean]
@@ -294,16 +354,32 @@ function Set-TargetResource
294354
$RestoreFromRecycleBin
295355
)
296356

297-
$targetResource = Get-TargetResource -Name $Name -Path $Path
357+
$getTargetResourceParameters = @{
358+
Name = $Name
359+
Path = $Path
360+
Credential = $Credential
361+
DomainController = $DomainController
362+
}
298363

299-
if ($targetResource.Ensure -eq 'Present')
364+
# Remove parameters that have not been specified
365+
@($getTargetResourceParameters.Keys) |
366+
ForEach-Object {
367+
if (-not $PSBoundParameters.ContainsKey($_))
368+
{
369+
$getTargetResourceParameters.Remove($_)
370+
}
371+
}
372+
373+
$getTargetResourceResult = Get-TargetResource @getTargetResourceParameters
374+
375+
if ($getTargetResourceResult.Ensure -eq 'Present')
300376
{
301377
if ($Ensure -eq 'Present')
302378
{
303379
Write-Verbose ($script:localizedData.UpdatingOU -f $Name)
304380

305381
$setADOrganizationalUnitParams = @{
306-
Identity = $targetResource.DistinguishedName
382+
Identity = $getTargetResourceResult.DistinguishedName
307383
Description = $Description
308384
ProtectedFromAccidentalDeletion = $ProtectedFromAccidentalDeletion
309385
}
@@ -313,6 +389,11 @@ function Set-TargetResource
313389
$setADOrganizationalUnitParams['Credential'] = $Credential
314390
}
315391

392+
if ($DomainController)
393+
{
394+
$setADOrganizationalUnitParams['Server'] = $DomainController
395+
}
396+
316397
try
317398
{
318399
Set-ADOrganizationalUnit @setADOrganizationalUnitParams
@@ -329,10 +410,10 @@ function Set-TargetResource
329410
Write-Verbose ($script:localizedData.DeletingOU -f $Name)
330411

331412
# Disable 'ProtectedFromAccidentalDeletion' if it is set.
332-
if ($targetResource.ProtectedFromAccidentalDeletion)
413+
if ($getTargetResourceResult.ProtectedFromAccidentalDeletion)
333414
{
334415
$setADOrganizationalUnitParams = @{
335-
Identity = $targetResource.DistinguishedName
416+
Identity = $getTargetResourceResult.DistinguishedName
336417
ProtectedFromAccidentalDeletion = $false
337418
}
338419

@@ -341,6 +422,11 @@ function Set-TargetResource
341422
$setADOrganizationalUnitParams['Credential'] = $Credential
342423
}
343424

425+
if ($DomainController)
426+
{
427+
$setADOrganizationalUnitParams['Server'] = $DomainController
428+
}
429+
344430
try
345431
{
346432
Set-ADOrganizationalUnit @setADOrganizationalUnitParams
@@ -353,14 +439,19 @@ function Set-TargetResource
353439
}
354440

355441
$removeADOrganizationalUnitParams = @{
356-
Identity = $targetResource.DistinguishedName
442+
Identity = $getTargetResourceResult.DistinguishedName
357443
}
358444

359445
if ($Credential)
360446
{
361447
$removeADOrganizationalUnitParams['Credential'] = $Credential
362448
}
363449

450+
if ($DomainController)
451+
{
452+
$removeADOrganizationalUnitParams['Server'] = $DomainController
453+
}
454+
364455
try
365456
{
366457
Remove-ADOrganizationalUnit @removeADOrganizationalUnitParams
@@ -391,6 +482,11 @@ function Set-TargetResource
391482
$restoreParams['Credential'] = $Credential
392483
}
393484

485+
if ($DomainController)
486+
{
487+
$restoreParams['Server'] = $DomainController
488+
}
489+
394490
$restoreSuccessful = Restore-ADCommonObject @restoreParams
395491
}
396492

@@ -410,6 +506,11 @@ function Set-TargetResource
410506
$newADOrganizationalUnitParams['Credential'] = $Credential
411507
}
412508

509+
if ($DomainController)
510+
{
511+
$newADOrganizationalUnitParams['Server'] = $DomainController
512+
}
513+
413514
try
414515
{
415516
New-ADOrganizationalUnit @newADOrganizationalUnitParams

source/DSCResources/MSFT_ADOrganizationalUnit/MSFT_ADOrganizationalUnit.schema.mof

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ class MSFT_ADOrganizationalUnit : OMI_BaseResource
55
[Key, Description("Specifies the X.500 path of the Organizational Unit (OU) or container where the new object is created.")] String Path;
66
[Write, Description("Specifies whether the Organizational Unit (OU) should be present or absent. Default value is 'Present'."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure;
77
[Write, Description("The credential to be used to perform the operation on Active Directory."), EmbeddedInstance("MSFT_Credential")] String Credential;
8+
[Write, Description("Specifies the Active Directory Domain Services instance to use to perform the task.")] String DomainController;
89
[Write, Description("Specifies if the Organizational Unit (OU) container should be protected from deletion. Default value is $true.")] Boolean ProtectedFromAccidentalDeletion;
910
[Write, Description("Specifies the description of the Organizational Unit (OU). Default value is empty ('').")] String Description;
1011
[Write, Description("Try to restore the Organizational Unit (OU) from the recycle bin before creating a new one.")] Boolean RestoreFromRecycleBin;

source/DSCResources/MSFT_ADOrganizationalUnit/en-US/about_ADOrganizationalUnit.help.txt

+4
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
Write - PSCredential
3030
The credential to be used to perform the operation on Active Directory.
3131

32+
.PARAMETER DomainController
33+
Write - String
34+
Specifies the Active Directory Domain Services instance to use to perform the task.
35+
3236
.PARAMETER ProtectedFromAccidentalDeletion
3337
Write - Boolean
3438
Specifies if the Organizational Unit (OU) container should be protected from deletion. Default value is $true.

0 commit comments

Comments
 (0)