Public/Export-CloudPCProvisioningPolicy.ps1
|
function Export-CloudPCProvisioningPolicy { <# .SYNOPSIS Exports a Windows 365 Cloud PC provisioning policy as reusable JSON. .DESCRIPTION Exports the create-safe provisioning policy body and assignment targets for a policy returned by Microsoft Graph beta. Read-only Graph fields are not placed in CreateBody, so the JSON can be passed to New-CloudPCProvisioningPolicy. Assignments are exported separately because Graph creates the provisioning policy first, then assigns it with /provisioningPolicies/{id}/assign. .PARAMETER Policy A WindowsCloudPC.ProvisioningPolicy object returned by Get-CloudPCProvisioningPolicy. .PARAMETER Id The provisioning policy ID to export. .PARAMETER Path Optional JSON file path to write. If omitted, the export object is emitted. .PARAMETER Force Overwrite Path when it already exists. .EXAMPLE Get-CloudPCProvisioningPolicy -Id '<policy-id>' | Export-CloudPCProvisioningPolicy -Path .\policy.json .EXAMPLE Export-CloudPCProvisioningPolicy -Id '<policy-id>' | New-CloudPCProvisioningPolicy -DisplayName 'Copy of source policy' -WhatIf #> [CmdletBinding(DefaultParameterSetName = 'ById')] [OutputType('WindowsCloudPC.ProvisioningPolicyExport', 'WindowsCloudPC.ProvisioningPolicyExportResult')] param( [Parameter(Mandatory, ValueFromPipeline, ParameterSetName = 'ByObject')] [object]$Policy, [Parameter(Mandatory, ValueFromPipelineByPropertyName, ParameterSetName = 'ById')] [Alias('ProvisioningPolicyId')] [string]$Id, [string]$Path, [switch]$Force ) begin { Connect-CloudPC | Out-Null } process { $resolvedPolicy = if ($PSCmdlet.ParameterSetName -eq 'ByObject') { if ($Policy.PSObject.Properties['Raw']) { $Policy } elseif ($Policy.PSObject.Properties['Id']) { Get-CloudPCProvisioningPolicy -Id $Policy.Id } else { Write-Error 'Export-CloudPCProvisioningPolicy: input object must have a Raw or Id property.' return } } else { Get-CloudPCProvisioningPolicy -Id $Id } if (-not $resolvedPolicy) { Write-Error 'Export-CloudPCProvisioningPolicy: provisioning policy was not found.' return } $export = ConvertTo-CloudPCProvisioningPolicyExport -Policy $resolvedPolicy if ($Path) { $resolvedPath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path) if ((Test-Path -Path $resolvedPath) -and -not $Force) { Write-Error "Export-CloudPCProvisioningPolicy: '$resolvedPath' already exists. Use -Force to overwrite." return } $parent = Split-Path -Path $resolvedPath -Parent if ($parent -and -not (Test-Path -Path $parent)) { New-Item -ItemType Directory -Path $parent -Force | Out-Null } $export | ConvertTo-Json -Depth 50 | Set-Content -Path $resolvedPath -Encoding utf8NoBOM [pscustomobject]@{ PSTypeName = 'WindowsCloudPC.ProvisioningPolicyExportResult' PolicyId = $export.SourceId DisplayName = $export.DisplayName Path = $resolvedPath } } else { $export } } end { } } |