Public/set-alImage.ps1

function Set-ALImage {
  <#
.SYNOPSIS
  Edits values of a image(template)
.DESCRIPTION
  Edits values of a image(template)
.PARAMETER websession
  Existing Webrequest session for ELM Appliance
.PARAMETER id
  ID of image
.PARAMETER name
  Name of the image
.PARAMETER description
  Description of the image
.PARAMETER connectorid
  ID of Connector to use
.PARAMETER osrevid
  Operating system layer version ID
.PARAMETER platrevid
  Platform layer version ID
.PARAMETER appLayerid
  Application layer ID
.PARAMETER apprevid
  Application layer version ID
.PARAMETER ElasticLayerMode
  Elastic Layer setting for the image. Options "None","Session","Office365","SessionOffice365","Desktop"
.PARAMETER diskformat
  Disk format of the image
.PARAMETER size
  Size of layer in MB
.PARAMETER icon
  Icon ID
.PARAMETER syspreptype
  Syspreptype for the Image. Options "None","Offline"
.EXAMPLE
  $fileshare = Get-ALRemoteshare -websession $websession
  $connector = Get-ALconnector -websession $websession -type Create|where{$_.name -eq "MYvCenter"}
  $oss = Get-ALOsLayer -websession $websession|where{$_.name -eq "Windows 10 x64"}
  $osrevs = get-aloslayerdetail -websession $websession -id $oss.id
  $osrevid = $osrevs.Revisions.OsLayerRevisionDetail|where{$_.state -eq "Deployable"}|Sort-Object revision -Descending|select -First 1
  $plats = Get-ALPlatformlayer -websession $websession|where{$_.name -eq "Windows 10 VDA"}
  $platrevs = get-alplatformlayerdetail -websession $websession -id $plats.id
  $platformrevid = $platrevs.Revisions.PlatformLayerRevisionDetail|where{$_.state -eq "Deployable"}|Sort-Object revision -Descending|select -First 1
  $image = Get-ALimage -websession $websession|where{$_.name -eq "Windows 10 Accounting"}
  Set-alimage -websession $websession -name $images.Name -description "My new description" -connectorid $connector.id -osrevid $osrevid.Id -platrevid $platformrevid.id -id $image.Id -ElasticLayerMode Session -diskformat $connector.ValidDiskFormats.DiskFormat -syspreptype Offline
  
  ### Edit image with latest revision for a specific app or apps ***
  $apps = @("Winscp","7-zip")
  $applayerids = foreach ($app in $apps){Get-ALapplayer -websession $websession|where{$_.name -eq $app}}
  $apprevs = foreach ($applayerid in $applayerids){get-alapplayerDetail -websession $websession -id $applayerid.Id}
  $apprevid = foreach ($apprev in $apprevs){$apprev.Revisions.AppLayerRevisionDetail|where{$_.state -eq "Deployable"}|Sort-Object DisplayedVersion -Descending|select -First 1}
  Set-alimage -websession $websession -name $images.Name -description "My new description" -connectorid $connector.id -osrevid $osrevid.Id -platrevid $platformrevid.id -id $image.Id -ElasticLayerMode Session -diskformat $connector.ValidDiskFormats.DiskFormat -applayerid $apprevid.LayerId -apprevid $apprevid.Id -syspreptype Offline
#>


  [cmdletbinding(SupportsShouldProcess = $true, ConfirmImpact = 'High')]
  Param(
    [Parameter(Mandatory = $true)]$websession,
    [Parameter(Mandatory = $true)][string]$id,
    [Parameter(Mandatory = $false)][string]$name,
    [Parameter(Mandatory = $false)][string]$description,
    [Parameter(Mandatory = $false)][string]$connectorid,
    [Parameter(Mandatory = $false)][string]$osrevid,
    [Parameter(Mandatory = $false)][string]$platrevid,
    [Parameter(Mandatory = $false)][array]$applayerid,
    [Parameter(Mandatory = $false)][array]$apprevid,
    [Parameter(Mandatory = $false)][ValidateSet("None", "Session", "Office365", "SessionOffice365", "Desktop")][string]$ElasticLayerMode,
    [Parameter(Mandatory = $false)][string]$diskformat,
    [Parameter(Mandatory = $false)][string]$size,
    [Parameter(Mandatory = $false)][string]$icon,
    [Parameter(Mandatory = $false)][ValidateSet("None", "Offline")][string]$syspreptype
  )
  Begin {
    Write-Verbose "BEGIN: $($MyInvocation.MyCommand)"
    Test-ALWebsession -WebSession $websession
  }
  Process {

    $image = get-alimagedetail -websession $websession -id $id

    #Check for existing params
    if ([string]::IsNullOrWhiteSpace($name)) {
      $name = $image.Name
      Write-Verbose "Using existing name value $name"
    }

    if ([string]::IsNullOrWhiteSpace($description)) {
 
      $description = $image.$description
      if ([string]::IsNullOrWhiteSpace($image.$description)) {
        $description = ""
      }
      else {
        $description = $image.description
      }
      Write-Verbose "Using existing description value $description"
    }

    if ([string]::IsNullOrWhiteSpace($connectorid)) {
      $connectorid = $image.PlatformConnectorConfigId
      Write-Verbose "Using existing PlatformConnectorId value $connectorid"
    }

    if ([string]::IsNullOrWhiteSpace($osrevid)) {
      $osrevid = $image.OsRev.Revisions.RevisionResult.Id
      Write-Verbose "Using existing osrevid value $osrevid"
    }

    if ([string]::IsNullOrWhiteSpace($platrevid)) {
      $platrevid = $image.PlatformLayer.Revisions.RevisionResult.Id
      Write-Verbose "Using existing platrevid value $platrevid"
    }

    if ([string]::IsNullOrWhiteSpace($ElasticLayerMode)) {
      $ElasticLayerMode = $image.ElasticLayerMode
      Write-Verbose "Using existing ElasticLayerMode value $ElasticLayerMode"
    }

    if ([string]::IsNullOrWhiteSpace($diskformat)) {
      $diskformat = $image.LayeredImageDiskFormat
      Write-Verbose "Using existing diskformat value $diskformat"
    }

    if ([string]::IsNullOrWhiteSpace($size)) {
      $size = $image.LayeredImagePartitionSizeMiB
      Write-Verbose "Using existing size value $size"
    }

    if ([string]::IsNullOrWhiteSpace($icon)) {
      $icon = $image.ImageId
      Write-Verbose "Using existing icon value $icon"
    }
    
    if ([string]::IsNullOrWhiteSpace($syspreptype)) {
      $icon = $image.syspreptype
      Write-Verbose "Using existing syspreptype value $syspreptype"
    }

    [xml]$xml = @"
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <EditImage xmlns="http://www.unidesk.com/">
      <command>
        <Id>$id</Id>
        <ImageName>$name</ImageName>
        <Description>$description</Description>
        <IconId>$icon</IconId>
        <OsLayerRevId>$osrevid</OsLayerRevId>
        <PlatformConnectorConfigId>$connectorid</PlatformConnectorConfigId>
        <PlatformLayerRevId>$platrevid</PlatformLayerRevId>
        <AppLayerRevIds/>
        <SysprepType>$syspreptype</SysprepType>
        <LayeredImageDiskFilename>$name</LayeredImageDiskFilename>
        <LayeredImageDiskFormat>$diskformat</LayeredImageDiskFormat>
        <LayeredImagePartitionSizeMiB>$size</LayeredImagePartitionSizeMiB>
        <ElasticLayerMode>$ElasticLayerMode</ElasticLayerMode>
        <Reason>
          <ReferenceNumber>0</ReferenceNumber>
        </Reason>
      </command>
    </EditImage>
  </s:Body>
</s:Envelope>
"@


    # If ApplayerId and AppRevId are provided merge the two xml blocks
    if ((![string]::IsNullOrWhiteSpace($applayerid)) -and (![string]::IsNullOrWhiteSpace($apprevid))) {
      # Remove AppLayerRevIds to be able to recreate as new element
      $DeleteNames = "AppLayerRevIds"
      ($xml.envelope.body.editimage.command.ChildNodes | Where-Object { $DeleteNames -contains $_.Name }) | ForEach-Object { [void]$_.ParentNode.RemoveChild($_) }

      # Retrieve NamespaceUri from parent
      $xdNS = $xml.envelope.body.editimage.command.NamespaceURI

      # Define Root Element
      $AppLayerRevIds = $xml.CreateNode([Xml.XmlNodeType]::Element, "AppLayerRevIds", $xdNS);
    
      # Define Element and values for each provided applayerid
      for ($i = 0; $i -lt $applayerid.Length; $i++) {
    
        $KeyValueOfInt64 = $xml.CreateNode([Xml.XmlNodeType]::Element, "KeyValueOfInt64", $xdNS);
        $ElementName = $xml.CreateNode([Xml.XmlNodeType]::Element, "Name", $xdNS);
        $ElementName.InnerText = $applayerid[$i]
        $ElementValue = $xml.CreateNode([Xml.XmlNodeType]::Element, "Value", $xdNS);
        $ElementValue.InnerText = $apprevid[$i]

        # Append the elements with their values
        $KeyValueOfInt64.AppendChild($ElementName);
        $KeyValueOfInt64.AppendChild($ElementValue);
        $AppLayerRevIds.AppendChild($KeyValueOfInt64);

      }

      # Merge with origin
      $xml.envelope.body.editimage.command.AppendChild($AppLayerRevIds)
    }
    Write-Verbose $xml
    $headers = @{
      SOAPAction     = "http://www.unidesk.com/EditImage";
      "Content-Type" = "text/xml; charset=utf-8";
      UNIDESK_TOKEN  = $websession.token;
    }
    $url = "https://" + $websession.aplip + "/Unidesk.Web/API.asmx"
    if ($PSCmdlet.ShouldProcess("Setting image $name")) {
      $return = Invoke-WebRequest -Uri $url -Method Post -Body $xml -Headers $headers -WebSession $websession
      [xml]$obj = $return.Content



      if ($obj.Envelope.Body.EditImageResponse.EditImageResult.Error) {
        throw $obj.Envelope.Body.EditImageResponse.EditImageResult.Error.message

      }
      else {
        Write-Verbose "WORKTICKET: $($obj.Envelope.Body.EditImageResponse.EditImageResult.WorkTicketId)"
        return $obj.Envelope.Body.EditImageResponse.EditImageResult.ImageSummary
      }
    }
  }

  end { Write-Verbose "END: $($MyInvocation.MyCommand)" }
}