@@ -21,7 +21,7 @@ function Get-TargetResource
21
21
if ($smbShare -ne $null )
22
22
{
23
23
$smbShareAccess = Get-SmbShareAccess - Name $Name
24
- $smbShareAccess | % {
24
+ $smbShareAccess | ForEach-Object {
25
25
$access = $_ ;
26
26
if ($access.AccessRight -eq ' Change' -and $access.AccessControlType -eq ' Allow' )
27
27
{
@@ -30,7 +30,7 @@ function Get-TargetResource
30
30
elseif ($access.AccessRight -eq ' Read' -and $access.AccessControlType -eq ' Allow' )
31
31
{
32
32
$readAccess += $access.AccountName
33
- }
33
+ }
34
34
elseif ($access.AccessRight -eq ' Full' -and $access.AccessControlType -eq ' Allow' )
35
35
{
36
36
$fullAccess += $access.AccountName
@@ -44,24 +44,24 @@ function Get-TargetResource
44
44
else
45
45
{
46
46
Write-Verbose " Share with name $Name does not exist"
47
- }
47
+ }
48
48
49
49
$returnValue = @ {
50
- Name = $smbShare.Name
51
- Path = $smbShare.Path
52
- Description = $smbShare.Description
53
- ConcurrentUserLimit = $smbShare.ConcurrentUserLimit
54
- EncryptData = $smbShare.EncryptData
55
- FolderEnumerationMode = $smbShare.FolderEnumerationMode
56
- ShareState = $smbShare.ShareState
57
- ShareType = $smbShare.ShareType
58
- ShadowCopy = $smbShare.ShadowCopy
59
- Special = $smbShare.Special
60
- ChangeAccess = $changeAccess
61
- ReadAccess = $readAccess
62
- FullAccess = $fullAccess
63
- NoAccess = $noAccess
64
- Ensure = if ($smbShare ) {" Present" } else {" Absent" }
50
+ Name = $smbShare.Name
51
+ Path = $smbShare.Path
52
+ Description = $smbShare.Description
53
+ ConcurrentUserLimit = $smbShare.ConcurrentUserLimit
54
+ EncryptData = $smbShare.EncryptData
55
+ FolderEnumerationMode = $smbShare.FolderEnumerationMode
56
+ ShareState = $smbShare.ShareState
57
+ ShareType = $smbShare.ShareType
58
+ ShadowCopy = $smbShare.ShadowCopy
59
+ Special = $smbShare.Special
60
+ ChangeAccess = $changeAccess
61
+ ReadAccess = $readAccess
62
+ FullAccess = $fullAccess
63
+ NoAccess = $noAccess
64
+ Ensure = if ($smbShare ) {" Present" } else {" Absent" }
65
65
}
66
66
67
67
$returnValue
@@ -71,7 +71,7 @@ function Set-AccessPermission
71
71
{
72
72
[CmdletBinding ()]
73
73
Param
74
- (
74
+ (
75
75
$ShareName ,
76
76
77
77
[string []]
@@ -94,11 +94,52 @@ function Set-AccessPermission
94
94
}
95
95
}
96
96
97
+ Function Set-BoundParameters
98
+ {
99
+ # Define parameters
100
+ Param
101
+ (
102
+ $BoundParameters
103
+ )
104
+
105
+ # Check for null access before passing to New-SmbShare
106
+ if (($BoundParameters.ContainsKey (" ChangeAccess" )) -and ([string ]::IsNullOrEmpty($BoundParameters [" ChangeAccess" ])))
107
+ {
108
+ Write-Verbose " Parameter ChangeAccess is null or empty, removing from collection."
109
+ # Remove the parameter
110
+ $BoundParameters.Remove (" ChangeAccess" )
111
+ }
112
+
113
+ if (($BoundParameters.ContainsKey (" ReadAccess" )) -and ([string ]::IsNullOrEmpty($BoundParameters [" ReadAccess" ])))
114
+ {
115
+ Write-Verbose " Paramater ReadAccess is null or empty, removing from collection."
116
+ # Remove the parameter
117
+ $BoundParameters.Remove (" ReadAccess" )
118
+ }
119
+
120
+ if (($BoundParameters.ContainsKey (" FullAccess" )) -and ([string ]::IsNullOrEmpty($BoundParameters [" FullAccess" ])))
121
+ {
122
+ Write-Verbose " Parameter FullAccess is null or empty, removing from collection."
123
+ # Remove the parameter
124
+ $BoundParameters.Remove (" FullAccess" )
125
+ }
126
+
127
+ if (($BoundParameters.ContainsKey (" NoAccess" )) -and ([string ]::IsNullOrEmpty($BoundParameters [" NoAccess" ])))
128
+ {
129
+ Write-Verbose " Parameter NoAccess is null or empty, removing from collection."
130
+ # Remove the parameter
131
+ $BoundParameters.Remove (" NoAccess" )
132
+ }
133
+
134
+ # Return the parameter collection
135
+ return $BoundParameters
136
+ }
137
+
97
138
function Remove-AccessPermission
98
139
{
99
140
[CmdletBinding ()]
100
141
Param
101
- (
142
+ (
102
143
$ShareName ,
103
144
104
145
[string []]
@@ -114,7 +155,8 @@ function Remove-AccessPermission
114
155
if ($AccessPermission -eq " Change" -or $AccessPermission -eq " Read" -or $AccessPermission -eq " Full" )
115
156
{
116
157
Revoke-SmbShareAccess - Name $Name - AccountName $UserName - Force
117
- }
158
+
159
+ }
118
160
else
119
161
{
120
162
UnBlock-SmbShareAccess - Name $Name - AccountName $userName - Force
@@ -164,7 +206,7 @@ function Set-TargetResource
164
206
$Ensure = ' Present'
165
207
)
166
208
167
- $psboundparameters .Remove (" Debug" )
209
+ $PSBoundParameters .Remove (" Debug" )
168
210
169
211
$shareExists = $false
170
212
$smbShare = Get-SmbShare - Name $Name - ErrorAction SilentlyContinue
@@ -177,94 +219,115 @@ function Set-TargetResource
177
219
{
178
220
if ($shareExists -eq $false )
179
221
{
180
- $psboundparameters .Remove (" Ensure" )
222
+ $PSBoundParameters .Remove (" Ensure" )
181
223
Write-Verbose " Creating share $Name to ensure it is Present"
182
- New-SmbShare @psboundparameters
224
+
225
+ # Alter bound parameters
226
+ $newShareParameters = Set-BoundParameters - BoundParameters $PSBoundParameters
227
+
228
+ # Pass the parameter collection to New-SmbShare
229
+ New-SmbShare @newShareParameters
183
230
}
184
231
else
185
232
{
186
233
# Need to call either Set-SmbShare or *ShareAccess cmdlets
187
- if ($psboundparameters .ContainsKey (" ChangeAccess" ))
234
+ if ($PSBoundParameters .ContainsKey (" ChangeAccess" ))
188
235
{
189
- $changeAccessValue = $psboundparameters [" ChangeAccess" ]
190
- $psboundparameters .Remove (" ChangeAccess" )
236
+ $changeAccessValue = $PSBoundParameters [" ChangeAccess" ]
237
+ $PSBoundParameters .Remove (" ChangeAccess" )
191
238
}
192
- if ($psboundparameters .ContainsKey (" ReadAccess" ))
239
+ if ($PSBoundParameters .ContainsKey (" ReadAccess" ))
193
240
{
194
- $readAccessValue = $psboundparameters [" ReadAccess" ]
195
- $psboundparameters .Remove (" ReadAccess" )
241
+ $readAccessValue = $PSBoundParameters [" ReadAccess" ]
242
+ $PSBoundParameters .Remove (" ReadAccess" )
196
243
}
197
- if ($psboundparameters .ContainsKey (" FullAccess" ))
244
+ if ($PSBoundParameters .ContainsKey (" FullAccess" ))
198
245
{
199
- $fullAccessValue = $psboundparameters [" FullAccess" ]
200
- $psboundparameters .Remove (" FullAccess" )
246
+ $fullAccessValue = $PSBoundParameters [" FullAccess" ]
247
+ $PSBoundParameters .Remove (" FullAccess" )
201
248
}
202
- if ($psboundparameters .ContainsKey (" NoAccess" ))
249
+ if ($PSBoundParameters .ContainsKey (" NoAccess" ))
203
250
{
204
- $noAccessValue = $psboundparameters [" NoAccess" ]
205
- $psboundparameters .Remove (" NoAccess" )
251
+ $noAccessValue = $PSBoundParameters [" NoAccess" ]
252
+ $PSBoundParameters .Remove (" NoAccess" )
206
253
}
207
-
254
+
208
255
# Use Set-SmbShare for performing operations other than changing access
209
- $psboundparameters .Remove (" Ensure" )
210
- $psboundparameters .Remove (" Path" )
256
+ $PSBoundParameters .Remove (" Ensure" )
257
+ $PSBoundParameters .Remove (" Path" )
211
258
Set-SmbShare @PSBoundParameters - Force
212
-
259
+
213
260
# Use *SmbShareAccess cmdlets to change access
214
- $smbshareAccessValues = Get-SmbShareAccess - Name $Name
261
+ $smbShareAccessValues = Get-SmbShareAccess - Name $Name
262
+
263
+ # Remove Change permissions
264
+ $smbShareAccessValues | Where-Object {$_.AccessControlType -eq ' Allow' -and $_.AccessRight -eq ' Change' } `
265
+ | ForEach-Object {
266
+ Remove-AccessPermission - ShareName $Name - UserName $_.AccountName - AccessPermission Change
267
+ }
268
+
215
269
if ($ChangeAccess -ne $null )
216
270
{
217
- # Blow off whatever is in there and replace it with this list
218
- $smbshareAccessValues | ? {$_.AccessControlType -eq ' Allow' -and $_.AccessRight -eq ' Change' } `
219
- | % {
220
- Remove-AccessPermission - ShareName $Name - UserName $_.AccountName - AccessPermission Change
221
- }
222
-
223
- $changeAccessValue | % {
271
+ # Add change permissions
272
+ $changeAccessValue | ForEach-Object {
224
273
Set-AccessPermission - ShareName $Name - AccessPermission " Change" - Username $_
225
274
}
226
275
}
227
- $smbshareAccessValues = Get-SmbShareAccess - Name $Name
276
+
277
+ $smbShareAccessValues = Get-SmbShareAccess - Name $Name
278
+
279
+ # Remove read access
280
+ $smbShareAccessValues | Where-Object {$_.AccessControlType -eq ' Allow' -and $_.AccessRight -eq ' Read' } `
281
+ | ForEach-Object {
282
+ Remove-AccessPermission - ShareName $Name - UserName $_.AccountName - AccessPermission Read
283
+ }
284
+
228
285
if ($ReadAccess -ne $null )
229
286
{
230
- # Blow off whatever is in there and replace it with this list
231
- $smbshareAccessValues | ? {$_.AccessControlType -eq ' Allow' -and $_.AccessRight -eq ' Read' } `
232
- | % {
233
- Remove-AccessPermission - ShareName $Name - UserName $_.AccountName - AccessPermission Read
234
- }
235
-
236
- $readAccessValue | % {
237
- Set-AccessPermission - ShareName $Name - AccessPermission " Read" - Username $_
287
+ # Add read access
288
+ $readAccessValue | ForEach-Object {
289
+ Set-AccessPermission - ShareName $Name - AccessPermission " Read" - Username $_
238
290
}
239
291
}
240
- $smbshareAccessValues = Get-SmbShareAccess - Name $Name
292
+
293
+
294
+ $smbShareAccessValues = Get-SmbShareAccess - Name $Name
295
+
296
+ # Remove full access
297
+ $smbShareAccessValues | Where-Object {$_.AccessControlType -eq ' Allow' -and $_.AccessRight -eq ' Full' } `
298
+ | ForEach-Object {
299
+ Remove-AccessPermission - ShareName $Name - UserName $_.AccountName - AccessPermission Full
300
+ }
301
+
302
+
241
303
if ($FullAccess -ne $null )
242
304
{
243
- # Blow off whatever is in there and replace it with this list
244
- $smbshareAccessValues | ? {$_.AccessControlType -eq ' Allow' -and $_.AccessRight -eq ' Full' } `
245
- | % {
246
- Remove-AccessPermission - ShareName $Name - UserName $_.AccountName - AccessPermission Full
247
- }
248
-
249
- $fullAccessValue | % {
250
- Set-AccessPermission - ShareName $Name - AccessPermission " Full" - Username $_
305
+
306
+ # Add full access
307
+ $fullAccessValue | ForEach-Object {
308
+ Set-AccessPermission - ShareName $Name - AccessPermission " Full" - Username $_
251
309
}
252
310
}
253
- $smbshareAccessValues = Get-SmbShareAccess - Name $Name
311
+
312
+ $smbShareAccessValues = Get-SmbShareAccess - Name $Name
313
+
314
+ # Remove explicit deny
315
+ $smbShareAccessValues | Where-Object {$_.AccessControlType -eq ' Deny' } `
316
+ | ForEach-Object {
317
+ Remove-AccessPermission - ShareName $Name - UserName $_.AccountName - AccessPermission No
318
+ }
319
+
320
+
254
321
if ($NoAccess -ne $null )
255
322
{
256
- # Blow off whatever is in there and replace it with this list
257
- $smbshareAccessValues | ? {$_.AccessControlType -eq ' Deny' } `
258
- | % {
259
- Remove-AccessPermission - ShareName $Name - UserName $_.AccountName - AccessPermission No
260
- }
261
- $noAccessValue | % {
323
+ # Add explicit deny
324
+ $noAccessValue | ForEach-Object {
262
325
Set-AccessPermission - ShareName $Name - AccessPermission " No" - Username $_
263
326
}
264
327
}
265
328
}
266
329
}
267
- else
330
+ else
268
331
{
269
332
Write-Verbose " Removing share $Name to ensure it is Absent"
270
333
Remove-SmbShare - name $Name - Force
@@ -314,8 +377,13 @@ function Test-TargetResource
314
377
[System.String ]
315
378
$Ensure = ' Present'
316
379
)
380
+
381
+ # Alter the bound parameters, removing anything that is null or emtpy
382
+ $alteredBoundParameters = Set-BoundParameters - boundparameters $PSBoundParameters
383
+
317
384
$testResult = $false ;
318
385
$share = Get-TargetResource - Name $Name - Path $Path - ErrorAction SilentlyContinue - ErrorVariable ev
386
+ $differences = @ ()
319
387
if ($Ensure -ne " Absent" )
320
388
{
321
389
if ($share.Ensure -eq " Absent" )
@@ -325,9 +393,27 @@ function Test-TargetResource
325
393
elseif ($share.Ensure -eq " Present" )
326
394
{
327
395
$Params = ' Name' , ' Path' , ' Description' , ' ChangeAccess' , ' ConcurrentUserLimit' , ' EncryptData' , ' FolderEnumerationMode' , ' FullAccess' , ' NoAccess' , ' ReadAccess' , ' Ensure'
328
- if ($PSBoundParameters.Keys.Where ({$_ -in $Params }) | ForEach-Object {Compare-Object - ReferenceObject $PSBoundParameters .$_ - DifferenceObject $share .$_ })
329
- {
330
- $testResult = $false
396
+
397
+ # Get all matching parameters from alteredBoundParameters that are in Params
398
+ $matchingParameters = $alteredBoundParameters.Keys.Where ({($_ -in $Params )})
399
+
400
+ if ($null -ne $matchingParameters )
401
+ {
402
+ foreach ($matchingParameter in $matchingParameters )
403
+ {
404
+ $differences += Compare-Object - ReferenceObject $alteredBoundParameters [$matchingParameter ] - DifferenceObject $share .$matchingParameter # ; $differences
405
+ }
406
+
407
+ # Check to see if there is anything in $differences
408
+ if (($null -ne $differences ) -and ($differences.Length -gt 0 ))
409
+ {
410
+ $differences | ForEach-Object {Write-Verbose - Message " $_ " }
411
+ $testResult = $false
412
+ }
413
+ else
414
+ {
415
+ $testResult = $true
416
+ }
331
417
}
332
418
else
333
419
{
@@ -351,4 +437,3 @@ function Test-TargetResource
351
437
}
352
438
353
439
Export-ModuleMember - Function *- TargetResource
354
-
0 commit comments