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 |