CitrixPVSModule.psm1

function Set-PVSVdiskProperties
{
    [CmdletBinding()]
    param (
        $PVSStore,
        $PVSSite,
        $VdiskName,
        [ValidateSet("PrivateMode", "CacheOnServer", "CacheInDeviceRAM", "CacheOnDeviceHD", "CacheOnDeviceRAMDisk", "CacheOnServerPersistent", "CacheInRAMOverflowToDisk")]
        [string]$CacheType,
        [ValidateSet("None", "MAK", "KMS")]
        [string]$LicenseType,
        $CacheSizeInMB
    )
    begin
    {
        try 
        {
            Import-Module "C:\Program Files\Citrix\Provisioning Services Console\Citrix.PVS.SnapIn.dll" -ErrorAction Stop
        }
        catch 
        {
            Write-Host "PVS PowerShell module not found"
        }
        If ($CacheType -eq "PrivateMode")
        {
            $WriteCacheType = "0"
        }
        elseif ($CacheType -eq "CacheOnServer")
        {
            $WriteCacheType = "1"
        }
        elseif ($CacheType -eq "CacheInDeviceRAM")
        {
            $WriteCacheType = "3"
        }
        elseif ($CacheType -eq "CacheOnDeviceHD")
        {
            $WriteCacheType = "4"
        }
        elseif ($CacheType -eq "CacheOnDeviceRAMDisk")
        {
            $WriteCacheType = "6"
        }
        elseif ($CacheType -eq "CacheOnServerPersistent")
        {
            $WriteCacheType = "7"
        }
        elseif ($CacheType -eq "CacheInRAMOverflowToDisk")
        {
            $WriteCacheType = "9"
        }
        If ($LicenseType -eq "None")
        {
            $LicenseMode = 0
        }
        elseif ($LicenseType -eq "MAK")
        {
            $LicenseMode = 1
        }
        elseif ($LicenseType -eq "KMS")
        {
            $LicenseMode = 2
        }
        
    }
    Process
    {
        Set-PvsDisk -Name "$VdiskName" -StoreName "$PVSStore" -SiteName "$PVSSite" -WriteCacheType "$WriteCacheType" -WriteCacheSize $CacheSizeInMB -LicenseMode $LicenseMode
    }
    End
    {
    }
}
function New-PVSXMLFile
{
    [CmdletBinding()]
    Param(
        $VHDXPath,
        $NewVDiskName,
        $vDiskSize,
        $LastWriteTime,
        $vDiskCreateDate
    )
    begin
    {
        try 
        {
            Import-Module "C:\Program Files\Citrix\Provisioning Services Console\Citrix.PVS.SnapIn.dll" -ErrorAction Stop
        }
        catch 
        {
            Write-Host "PVS PowerShell module not found"
        }
    }
    Process
    {
        $XMLFile = @"
<?xml version="1.0" encoding="utf-8"?>
<versionManifest>
  <startingVersion>
  </startingVersion>
  <version>
    <versionNumber>0</versionNumber>
    <description>
    </description>
    <type>0</type>
    <access>0</access>
    <createDate>$vDiskCreateDate</createDate>
    <scheduledDate>
    </scheduledDate>
    <deleteWhenFree>0</deleteWhenFree>
    <diskFileName>$NewVDiskName.vhdx</diskFileName>
    <size>$vDiskSize</size>
    <lastWriteTime>$LastWriteTime</lastWriteTime>
  </version>
</versionManifest>
"@

    }
    End
    {
        $XMLFile | Out-File -FilePath $VHDXPath\$NewVDiskName.xml -Encoding utf8 -Force 
    }
}
Function Import-PVSVDisk
{
    [CmdletBinding()]
    param
    (
        [string]$NewVDiskName,
        [string]$PVSStore,
        [string]$PVSServerName,
        [string]$PVSSiteName,
        [string]$VHDXPath
    )
    begin
    {
        try 
        {
            $PathValid = Test-Path $VHDXPath -ErrorAction Stop 
            if (!($PathValid))
            {                
                throw "Path not found"
            } 
        } 
        Catch 
        {
            Write-Host "Vdisk path is not present"
            break            
        }
        try {
            $PVSStoreValid = Get-PVSstore -StoreName $PVSStore -ErrorAction Stop
            if (!($PVSStoreValid)) 
            {
                throw "PVS store not present"
            } 
        } 
        catch
        {
            Write-Host "PVS store is not present"
            break
        } 
        try 
        {
            $VdiskDiskLocator = (Get-PvsDiskLocator -SiteName $PVSSiteName -StoreName $PVSStore).DiskLocatorId 
            If (($VdiskDiskLocator).length -ne 0) 
            {
                $FileName = (Get-PvsDisk -DiskLocatorId $VdiskDiskLocator).OriginalFile 
                if ("$FileName" -match "$NewVDiskName") 
                {
                    Write-Host "vDisk already present on PVS server"
                    Throw "vDisk already found" 
                }            
            }                 
        }
        catch 
        {
            Write-Verbose "PVS vdisk already present with the same name"
            break
        }
        try 
        {
            Get-PVSSite -SiteName $PVSSiteName -ErrorAction Stop
        }
        catch 
        {
            Write-Verbose "The PVS site is not preset"
        }
        $PVSvDiskInfo = Get-PVSVdiskInfo -VHDXPath $VHDXPath -NewVDiskName $NewVDiskName
        $vDiskSize = $PVSvDiskInfo.Size
        $LastWriteTime = $PVSvDiskInfo.LastWriteTime
        $vDiskCreateDate = $PVSvDiskInfo.CreationTime
        New-PVSXMLFile -VHDXPath $VHDXPath -NewVDiskName $NewVDiskName -vDiskSize $vDiskSize -LastWriteTime $LastWriteTime -vDiskCreateDate $vDiskCreateDate
        
    }
    Process
    {        
        Import-PvsDisk -Name $NewVDiskName -StoreName $PVSStore -ServerName $PVSServerName -SiteName $PVSSiteName -VHDX
    }
    End
    {
        
    }
}
function Get-PVSVdiskInfo
{
    param (
        $VHDXPath,
        $NewVDiskName
    )
    begin
    {
        $vDiskInfo = Get-ChildItem -Path "$VHDXPath\$NewVDiskName.vhdx"
        $PVSVDiskInfo = "" | Select-Object -Property Size, LastWriteTime, CreationTime
    }
    Process
    {
        
        $PVSVDiskInfo.Size = $vDiskInfo.Length
        $PVSVDiskInfo.CreationTime = ($vDiskInfo).CreationTimeUtc.ToString("yyyy-MM-dd HH:mm:ss")
        $PVSVDiskInfo.LastWriteTime = ($vDiskInfo).LastWriteTimeUtc.ToString("yyyy-MM-ddTHH:mm:ss")       
    }
    End
    {
        Return $PVSVDiskInfo
    }
}
# SIG # Begin signature block
# MIINFAYJKoZIhvcNAQcCoIINBTCCDQECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU+j8eO4QDDHu1MUafprQdxjhA
# 9TigggpWMIIFHjCCBAagAwIBAgIQDlKAkCblwyuuo05VV2HtmjANBgkqhkiG9w0B
# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz
# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE4MDMyNTAwMDAwMFoXDTE5MDIx
# MzEyMDAwMFowWzELMAkGA1UEBhMCREsxFDASBgNVBAcTC1NrYW5kZXJib3JnMRow
# GAYDVQQKExFNYXJ0aW4gVGhlcmtlbHNlbjEaMBgGA1UEAxMRTWFydGluIFRoZXJr
# ZWxzZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCryQZWVzIoxaw1
# CBZ60+rRUxjPexrE6p/BR5aiCIc7mT++6TK1vW6XzVDJk+rj8ktb/U09gOjV9XqT
# PtzUg866VPPVKy00BH2R2v7E3mLzFN/ZN59wG/fcEScb9/S+D3W+meU8IoHJD39p
# +6BaN2N+tt2sFmjHTfD1RI/k2LNeqRLE9V40JnsEkCismw+wPLr7j9t8+cpukhCq
# rxIhABorK0FssNXrBn5nlcTmb73ObEnFHTUZj0sNjEDZy4+wMXpKWqJtO/cheHI3
# w3UGIx+voCgLw0oZdnQ6zszNubrDMvu2U96gj91cJkmBofZS/KU4AFtxXRveNd6t
# xEeYcwLBAgMBAAGjggHFMIIBwTAfBgNVHSMEGDAWgBRaxLl7KgqjpepxA8Bg+S32
# ZXUOWDAdBgNVHQ4EFgQUjUBl7fObeeO9EfVXk/JZMnAo6JQwDgYDVR0PAQH/BAQD
# AgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGA1UdHwRwMG4wNaAzoDGGL2h0dHA6
# Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtY3MtZzEuY3JsMDWgM6Ax
# hi9odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcxLmNy
# bDBMBgNVHSAERTBDMDcGCWCGSAGG/WwDATAqMCgGCCsGAQUFBwIBFhxodHRwczov
# L3d3dy5kaWdpY2VydC5jb20vQ1BTMAgGBmeBDAEEATCBhAYIKwYBBQUHAQEEeDB2
# MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wTgYIKwYBBQUH
# MAKGQmh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJBc3N1
# cmVkSURDb2RlU2lnbmluZ0NBLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEB
# CwUAA4IBAQAbL8QqsIr4wBx6lQWzj9f3GhGJHutcyJKOgSKa9jj33SBWJTA3qYlG
# fXH1W6YG4nfI7yty/pLx2mRsZ9jr+r4eKTB639sWIq6c62Tmgw3zVeF7emJvtAQi
# Iv20m2kGtPVXIrqFv7GRBq4qcs0dB+wdTcO5yX36Ph5n/bTDqXuppWKmDjlMUUfM
# BMmipofZgQZxlHHDePxgCNwh8s7IpNV4pTsGAhJQ+o5qoOpbUsehmHi1H/HQll4K
# obZglNKfOenydRZWq4zFKvfFAxRHqmggEgjybG6fPaTiidIzUqZwU++9TTkxlbg+
# +JrN5TeFNAYjrGdQo88yM+J6nYyL+19GMIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1
# U0O1b5VQCDANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQD
# ExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcN
# MjgxMDIyMTIwMDAwWjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg
# SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2Vy
# dCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B
# AQEFAAOCAQ8AMIIBCgKCAQEA+NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid
# 2zLXcep2nQUut4/6kkPApfmJ1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sj
# lOSRI5aQd4L5oYQjZhJUM1B0sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjf
# DPXiTWAYvqrEsq5wMWYzcT6scKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzL
# fnQ5Ng2Q7+S1TqSp6moKq4TzrGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR
# 93O8vYWxYoNzQYIH5DiLanMg0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckw
# EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYI
# KwYBBQUHAwMweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
# cC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2lj
# ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgw
# OqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ
# RFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdp
# Q2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIE
# MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYI
# YIZIAYb9bAMwHQYDVR0OBBYEFFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQY
# MBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1a
# JLPzItEVyCx8JSl2qB1dHC06GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUP
# UbRupY5a4l4kgU4QpO4/cY5jDhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1
# UcKNJK4kxscnKqEpKBo6cSgCPC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjF
# Emifz0DLQESlE/DmZAwlCEIysjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM
# 1ekN3fYBIM6ZMWM9CBoYs4GbT8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhs
# RDKyZqHnGKSaZFHvMYICKDCCAiQCAQEwgYYwcjELMAkGA1UEBhMCVVMxFTATBgNV
# BAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8G
# A1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQQIQ
# DlKAkCblwyuuo05VV2HtmjAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAig
# AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL
# MQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUNIOk5rnKkmIWvoOc4Kaw
# iE/AxJAwDQYJKoZIhvcNAQEBBQAEggEAVc8Ae1FPPiuQbprxgyaObHMn47hSDEDU
# ni64G/L4ig+UQ8DIAEDG2dJ7LutWYDxqgla0sV7n3IsbRYbCfJel+aGqE9TxWTPX
# YBHRVrvIOe5SLMyNUW1ouCbe7tflwaf811a9KOoriBdWfymNWcHGPmkxLFMqT2ay
# SL61qaJTYW8PWoii3h4zjP8ZxU6jr/MLpDyR6Fi+g9GTvvUgUYIEmQVcGA2oGBIu
# VhEFXN2uU+BXxdTdaHXMdjo1ScZR+AgxtjWiGthvuJUZROzwY4T9vH+XJFyhvBMu
# FSOgosSOZtmn4G2bDHpLSWOw1uL/EPAxMzJ72HZNCvUF0aOa2L6NFA==
# SIG # End signature block