DSCResources/VE_XD7DesktopGroup/VE_XD7DesktopGroup.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
Import-LocalizedData -BindingVariable localizedData -FileName VE_XD7DesktopGroup.Resources.psd1;

function Get-TargetResource {
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param (
        [Parameter(Mandatory)] [ValidateNotNullOrEmpty()]
        [System.String] $Name,

        [Parameter(Mandatory)] [ValidateNotNull()]
        [System.Boolean] $IsMultiSession,

        [Parameter(Mandatory)] [ValidateSet('AppsOnly','DesktopsOnly','DesktopsAndApps')]
        [System.String] $DeliveryType,

        [Parameter(Mandatory)] [ValidateSet('Private','Shared')]
        [System.String] $DesktopType, # Type?

        [Parameter()] [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present',

        [Parameter()] [ValidateNotNullOrEmpty()]
        [System.String] $Description = $Name,

        [Parameter()] [ValidateNotNullOrEmpty()]
        [System.String] $DisplayName = $Name,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $Enabled = $true,

        [Parameter()] [ValidateSet('FourBit','EightBit','SixteenBit','TwentyFourBit')]
        [System.String] $ColorDepth = 'TwentyFourBit',

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $IsMaintenanceMode = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $IsRemotePC = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $IsSecureIca = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $ShutdownDesktopsAfterUse = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $TurnOnAddedMachine = $false,

        [Parameter()] [AllowNull()]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.CredentialAttribute()]
        $Credential
    )
    begin {
        AssertXDModule -Name 'Citrix.Broker.Admin.V2' -IsSnapin;
    }
    process {

        $scriptBlock = {
            Add-PSSnapin -Name 'Citrix.Broker.Admin.V2' -ErrorAction Stop;

            $deliveryGroup = Get-BrokerDesktopGroup -Name $using:Name -ErrorAction SilentlyContinue;
            $targetResource = @{
                Name = $using:Name;
                IsMultiSession = $deliveryGroup.SessionSupport -eq 'MultiSession';
                DeliveryType = [System.String] $deliveryGroup.DeliveryType;
                Description = $deliveryGroup.Description;
                DisplayName = $deliveryGroup.PublishedName;
                DesktopType = [System.String] $deliveryGroup.DesktopKind;
                Enabled = $deliveryGroup.Enabled;
                ColorDepth = [System.String] $deliveryGroup.ColorDepth;
                IsMaintenanceMode = $deliveryGroup.InMaintenanceMode;
                IsRemotePC = $deliveryGroup.IsRemotePC;
                IsSecureICA = $deliveryGroup.SecureIcaRequired;
                ShutdownDesktopsAfterUse = $deliveryGroup.ShutdownDesktopsAfterUse;
                TurnOnAddedMachine = $deliveryGroup.TurnOnAddedMachine
                Ensure = 'Absent';
            }
            if ($deliveryGroup) {
                $targetResource['Ensure'] = 'Present';
            }
            return $targetResource;
        } #end scriptBlock

        $invokeCommandParams = @{
            ScriptBlock = $scriptBlock;
            ErrorAction = 'Stop';
        }
        if ($Credential) {
            AddInvokeScriptBlockCredentials -Hashtable $invokeCommandParams -Credential $Credential;
        }
        else {
            $invokeCommandParams['ScriptBlock'] = [System.Management.Automation.ScriptBlock]::Create($scriptBlock.ToString().Replace('$using:','$'));
        }
        $scriptBlockParams = @($Name, $Description, $DeliveryType, $PublishedName, $ColorDepth, $Enabled, $IsMaintenanceMode, $IsRemotePC,
                                $IsSecureIca,$ShutdownDesktopsAfterUse,$TurnOnAddedMachine);
        Write-Verbose ($localizedData.InvokingScriptBlockWithParams -f [System.String]::Join("','", $scriptBlockParams));
        $targetResource = Invoke-Command  @invokeCommandParams;
        return $targetResource;

    } #end process
} #end function Get-TargetResource


function Test-TargetResource {
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param (
        [Parameter(Mandatory)] [ValidateNotNullOrEmpty()]
        [System.String] $Name,

        [Parameter(Mandatory)] [ValidateNotNull()]
        [System.Boolean] $IsMultiSession,

        [Parameter(Mandatory)] [ValidateSet('AppsOnly','DesktopsOnly','DesktopsAndApps')]
        [System.String] $DeliveryType,

        [Parameter(Mandatory)] [ValidateSet('Private','Shared')]
        [System.String] $DesktopType, # Type?

        [Parameter()] [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present',

        [Parameter()] [ValidateNotNullOrEmpty()]
        [System.String] $Description = $Name,

        [Parameter()] [ValidateNotNullOrEmpty()]
        [System.String] $DisplayName = $Name,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $Enabled = $true,

        [Parameter()] [ValidateSet('FourBit','EightBit','SixteenBit','TwentyFourBit')]
        [System.String] $ColorDepth = 'TwentyFourBit',

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $IsMaintenanceMode = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $IsRemotePC = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $IsSecureIca = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $ShutdownDesktopsAfterUse = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $TurnOnAddedMachine = $false,

        [Parameter()] [AllowNull()]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.CredentialAttribute()]
        $Credential
    )
    process {

        $PSBoundParameters['Ensure'] = $Ensure;
        $targetResource = Get-TargetResource @PSBoundParameters;
        $inCompliance = $true;
        foreach ($property in $PSBoundParameters.Keys) {
            if ($targetResource.ContainsKey($property)) {
                $expected = $PSBoundParameters[$property];
                $actual = $targetResource[$property];
                if ($expected -ne $actual) {
                    Write-Verbose ($localizedData.ResourcePropertyMismatch -f $property, $expected, $actual);
                    $inCompliance = $false;
                }
            }
        }
        if ($inCompliance) {
            Write-Verbose ($localizedData.ResourceInDesiredState -f $Name);
            return $true;
        }
        else {
            Write-Verbose ($localizedData.ResourceNotInDesiredState -f $Name);
            return $false;
        }

    } #end process
} #end function Get-TargetResource


function Set-TargetResource {
    [CmdletBinding()]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')]
    param (
        [Parameter(Mandatory)] [ValidateNotNullOrEmpty()]
        [System.String] $Name,

        [Parameter(Mandatory)] [ValidateNotNull()]
        [System.Boolean] $IsMultiSession,

        [Parameter(Mandatory)] [ValidateSet('AppsOnly','DesktopsOnly','DesktopsAndApps')]
        [System.String] $DeliveryType,

        [Parameter(Mandatory)] [ValidateSet('Private','Shared')]
        [System.String] $DesktopType, # Type?

        [Parameter()] [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present',

        [Parameter()] [ValidateNotNullOrEmpty()]
        [System.String] $Description = $Name,

        [Parameter()] [ValidateNotNullOrEmpty()]
        [System.String] $DisplayName = $Name,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $Enabled = $true,

        [Parameter()] [ValidateSet('FourBit','EightBit','SixteenBit','TwentyFourBit')]
        [System.String] $ColorDepth = 'TwentyFourBit',

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $IsMaintenanceMode = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $IsRemotePC = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $IsSecureIca = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $ShutdownDesktopsAfterUse = $false,

        [Parameter()] [ValidateNotNull()]
        [System.Boolean] $TurnOnAddedMachine = $false,

        [Parameter()] [AllowNull()]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.CredentialAttribute()]
        $Credential
    )
    begin {
        AssertXDModule -Name 'Citrix.Broker.Admin.V2' -IsSnapin;
    }
    process {

        $scriptBlock = {
            Add-PSSnapin -Name 'Citrix.Broker.Admin.V2' -ErrorAction Stop;
            Import-Module "$env:ProgramFiles\WindowsPowerShell\Modules\XenDesktop7\DSCResources\VE_XD7Common\VE_XD7Common.psd1" -Verbose:$false;

            $deliveryGroup = Get-BrokerDesktopGroup -Name $using:Name -ErrorAction SilentlyContinue;
            if ($using:Ensure -eq 'Present') {
                $brokerDeliveryGroupParams = @{
                    Name = $using:Name;
                    Description = $using:Description;
                    DeliveryType = $using:DeliveryType;
                    PublishedName = $using:DisplayName;
                    ColorDepth = $using:ColorDepth;
                    Enabled = $using:Enabled;
                    InMaintenanceMode = $using:IsMaintenanceMode;
                    IsRemotePC = $using:IsRemotePC;
                    SecureIcaRequired = $using:IsSecureIca;
                    ShutdownDesktopsAfterUse = $using:ShutdownDesktopsAfterUse;
                    TurnOnAddedMachine = $using:TurnOnAddedMachine
                }
                if ($deliveryGroup) {
                    if ($using:IsMultiSession) {
                        $sessionSupport = 'MultiSession';
                    }
                    else {
                        $sessionSupport = 'SingleSession';
                    }
                    ## ! No SessionSupport or DesktopKind - DeleteIfNeeded option? RemoveExistingIfNeeded/Required?
                    if ($sessionSupport -ne $deliveryGroup.SessionSupport) {
                        ThrowInvalidOperationException -ErrorId 'ImmutableProperty' -ErrorMessage ($using:localizedData.ImmutablePropertyError -f 'IsMultiSession');
                    }
                    elseif ($DesktopType -ne $deliveryGroup.DesktopKind) {
                        ThrowInvalidOperationException -ErrorId 'ImmutableProperty' -ErrorMessage ($using:localizedData.ImmutablePropertyError -f 'DesktopType');
                    }
                    Write-Verbose ($using:localizedData.UpdatingDeliveryGroup -f $using:Name);
                    Set-BrokerDesktopGroup @brokerDeliveryGroupParams;
                }
                else {
                    if ($using:IsMultiSession) {
                        $brokerDeliveryGroupParams['SessionSupport'] = 'MultiSession';
                    }
                    else {
                        $brokerDeliveryGroupParams['SessionSupport'] = 'SingleSession';
                    }
                    $brokerDeliveryGroupParams['DesktopKind'] = $using:DesktopType;
                    Write-Verbose ($using:localizedData.AddingDeliveryGroup -f $using:Name);
                    New-BrokerDesktopGroup @brokerDeliveryGroupparams;
                }
            }
            elseif ($deliveryGroup -and ($using:Ensure -eq 'Absent')) {
                Write-Verbose ($using:localizedData.RemovingDeliveryGroup -f $using:Name);
                Remove-BrokerDesktopGroup -InputObject $deliveryGroup;
            }
        } #end scriptBlock

        $invokeCommandParams = @{
            ScriptBlock = $scriptBlock;
            ErrorAction = 'Stop';
        }
        if ($Credential) {
            AddInvokeScriptBlockCredentials -Hashtable $invokeCommandParams -Credential $Credential;
        }
        else {
            $invokeCommandParams['ScriptBlock'] = [System.Management.Automation.ScriptBlock]::Create($scriptBlock.ToString().Replace('$using:','$'));
        }
        $scriptBlockParams = @($Name, $Description, $DeliveryType, $PublishedName, $ColorDepth, $Enabled, $IsMaintenanceMode, $IsRemotePC,
                                $IsSecureIca,$ShutdownDesktopsAfterUse,$TurnOnAddedMachine);
        Write-Verbose ($localizedData.InvokingScriptBlockWithParams -f [System.String]::Join("','", $scriptBlockParams));
        [ref] $null = Invoke-Command  @invokeCommandParams;

    } #end process
} #end function Set-TargetResource


$moduleRoot = Split-Path -Path $MyInvocation.MyCommand.Path -Parent;

## Import the XD7Common library functions
$moduleParent = Split-Path -Path $moduleRoot -Parent;
Import-Module (Join-Path -Path $moduleParent -ChildPath 'VE_XD7Common');

Export-ModuleMember -Function *-TargetResource;