<?xml version="1.0"?>
<rss version="2.0"><channel><title>Provisioning Latest Topics</title><link>https://community.stage.citrix.com/forums/forum/1194-provisioning/</link><description>Provisioning Latest Topics</description><language>en</language><item><title>PVS boot fails for Windows Server 2025 based PVS vdisks running Hyper-V after windows update</title><link>https://community.stage.citrix.com/forums/topic/256596-pvs-boot-fails-for-windows-server-2025-based-pvs-vdisks-running-hyper-v-after-windows-update/</link><description><![CDATA[<p>Hi,</p><p>I'm deploying a new Windows Server 2025 image and run into the boot problem after windows update installation (BSOD CvhdMp.sys).</p><p><span style='font-family: "Helvetica", "Arial", sans-serif'>According to </span>Citrix I should reverse image vdisk, uninstall PVS target device software, apply windows updates, reboot, reinstall PVS target device software and capture a new vdisk.<br><a rel="external nofollow" href="https://support.citrix.com/external/article?articleUrl=CTX693222-pvs-boot-fails-for-server-2025-based-pvs-vdisks-running-on-azure-and-hyperv-after-windows-update&amp;language=en_US#:~:text=Azure%20and%20Hyper-V%20based,from%20this%20updated%20windows%20install.">PVS boot fails for Server 2025 based PVS vdisks running on Azure and Hyperv after windows update</a><br><br>That would mean, reverse imaging every month or use a master target device and capture a new vdisk every month. This is not really a solution, isn't it? <span style='font-family: "Helvetica", "Arial", sans-serif'>Will this issue be resolved in the near future?</span></p><p>Infrastructure:<br>Hyper-V / SCVMM 2019<br>CVAD 2411 </p><p>Thanks for any opinions.</p><p>Patrick </p>]]></description><guid isPermaLink="false">256596</guid><pubDate>Fri, 13 Jun 2025 11:50:38 +0000</pubDate></item><item><title>EFI system partition (ESP) error: Unsupported - Streaming aborted Citrix Hypervisor PVS UEFI vDisk</title><link>https://community.stage.citrix.com/forums/topic/249538-efi-system-partition-esp-error-unsupported-streaming-aborted-citrix-hypervisor-pvs-uefi-vdisk/</link><description><![CDATA[<p>
	Hi there,
</p>

<p>
	i am trying to setup a new PVS environment with following specs:
</p>

<p>
	Hypervisor: Citrix Hypervisor 8.2
</p>

<p>
	Boot Mode VM: DHCP Options 66/67/11 with UEFI Boot
</p>

<p>
	Citrix PVS Version: 2203 LTSR 
</p>

<p>
	Server OS: Windows Server 2019 Datacentre
</p>

<p>
	 
</p>

<p>
	I created an image from the virtual machine via the PVS Imaging Wizard. The virtual machine was setup in UEFI Boot Mode.
</p>

<p>
	After the vDisk was created successfully i created another blank virtual machine on Citrix Hypervisor without a Disk, with network boot enabled.
</p>

<p>
	The network boot with DHCP Options works fine. Its using the pvsnbpx64.efi bootfile. 
</p>

<p>
	 
</p>

<p>
	Then the error message as attached appears: EFI system partition (ESP) error: Unsupported.
</p>

<p>
	 
</p>

<p>
	I read several posts but only pointing to the option "Boot from: vDisk" should be set on the host, which i already configued. 
</p>

<p>
	 
</p>

<p>
	I did create another vDisk just to be sure the imaging wizard did finish correct.
</p>

<p>
	 
</p>

<p>
	If anyone faced the same issues, id be happy to hear the solution.
</p>

<p>
	 
</p>

<p>
	Regards,
</p>

<p>
	Michael
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//media.invisioncic.com/r328636/monthly_2022_07/59700468_Screenshot2022-07-26100155.png.275f1e089bdfbd196c762b1fc634f941.png" data-fileid="47184" data-fileext="png" rel=""><img alt="Screenshot 2022-07-26 100155.png" class="ipsImage ipsImage_thumbnailed" data-fileid="47184" width="400" src="//media.invisioncic.com/r328636/monthly_2022_07/794640091_Screenshot2022-07-26100155.thumb.png.f22f4b69ddd4a156b57e28609c8dd647.png" loading="lazy" height="108"></a>
</p>

<p><a href="//media.invisioncic.com/r328636/monthly_2022_07/booterror.png.e661942081908e9a4bd80934ac47fbea.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="47185" src="//media.invisioncic.com/r328636/monthly_2022_07/booterror.thumb.png.f43cb80b65f7cabfa9096cf2b629826b.png" width="400" class="ipsImage ipsImage_thumbnailed" alt="booterror.png" loading="lazy" height="92"></a></p>]]></description><guid isPermaLink="false">249538</guid><pubDate>Tue, 26 Jul 2022 07:49:44 +0000</pubDate></item><item><title>Updating VMware Tools in PVS using e1000, not working for me</title><link>https://community.stage.citrix.com/forums/topic/229311-updating-vmware-tools-in-pvs-using-e1000-not-working-for-me/</link><description><![CDATA[
<p>
	Greetings all,
</p>

<p>
	 
</p>

<p>
	I’m trying to update VMtools and target device software on a much-needed system using Aaron Silber’s <a href="https://www.helient.com/2017/10/updating-vmware-tools-pvs-secrets-revealed/" rel="external nofollow">method</a>.  The ideas seems solid, however I think this is written only for PXE connections and not BDM .isos and of course… the organization I’m at only uses boot isos for their PVS environment.
</p>

<p>
	 
</p>

<p>
	I can get all the way up to step #8. In his article it should boot no problem on the E1000, but in my situation, I’m presented with the attached error.
</p>

<p>
	 
</p>

<p>
	No matter what I do to try and manipulate I keep getting this error. Funny thing is, if I remove the E1000 NIC and put everything back to the way it was the boot iso will boot just fine off VMx3
</p>

<p>
	Any thoughts? I’m not looking forward to reverse imaging anything if I do not have to.
</p>

<p>
	 
</p>

<p>
	Thanks.
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//media.invisioncic.com/r328636/monthly_2018_05/image.png.dc5ceaf8286d442c7e26559199233791.png" data-fileid="35023" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="35023" src="//media.invisioncic.com/r328636/monthly_2018_05/image.thumb.png.e149c6f1323eae4f44ab2c96e5500516.png" alt="image.thumb.png.e149c6f1323eae4f44ab2c96e5500516.png" loading="lazy"></a>
</p>
]]></description><guid isPermaLink="false">229311</guid><pubDate>Thu, 24 May 2018 15:23:03 +0000</pubDate></item><item><title>Attempting to set IP address on boot nic - Message after VMware driver update via WU</title><link>https://community.stage.citrix.com/forums/topic/251082-attempting-to-set-ip-address-on-boot-nic-message-after-vmware-driver-update-via-wu/</link><description><![CDATA[<p>
	Hi all,
</p>

<p>
	 
</p>

<p>
	after VMware driver update via windows update image won't boot anymore.<br>
	Stuck at "Attempting to set IP address on boot nic".
</p>

<p>
	I can delete the version and start over.
</p>

<p>
	<br>
	I remember that this VMware driver updates were running fine in the past.<br>
	But this time....
</p>

<p>
	Maybe anyone has an idea how i can fix this or where i have to start to troubleshoot?
</p>

<p>
	 
</p>

<p>
	Best regards.<br>
	Gero
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//media.invisioncic.com/r328636/monthly_2023_03/1870560376_image(1).png.ef961534288aaacd6ab64b0efd190561.png" data-fileid="48220" data-fileext="png" rel=""><img alt="image (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="48220" width="400" src="//media.invisioncic.com/r328636/monthly_2023_03/1484775406_image(1).thumb.png.fa169d30a30879861dbc5ce2867ca50b.png" loading="lazy" height="144"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//media.invisioncic.com/r328636/monthly_2023_03/image.png.ac16023624fcdc1443901b8ab30e859d.png" data-fileid="48221" data-fileext="png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="48221" width="400" src="//media.invisioncic.com/r328636/monthly_2023_03/image.thumb.png.e459aeb6d7ec322af5a9de234cf95769.png" loading="lazy" height="80"></a>
</p>
]]></description><guid isPermaLink="false">251082</guid><pubDate>Mon, 20 Mar 2023 17:05:11 +0000</pubDate></item><item><title>pvs health</title><link>https://community.stage.citrix.com/forums/topic/251558-pvs-health/</link><description><![CDATA[<p>
	#==============================================================================================
</p>

<p>
	#Don't change below here if you don't know what you are doing ...
</p>

<p>
	#==============================================================================================
</p>

<p>
	if ((Get-PSSnapin "Citrix.PVS.SnapIn" -EA silentlycontinue) -eq $null) {
</p>

<p>
	try { Add-PSSnapin Citrix.PVS.SnapIn -ErrorAction Stop }
</p>

<p>
	catch { write-error "Error loading Citrix.PVS.SnapIn PowerShell snapin"; Return }
</p>

<p>
	}
</p>

<p>
	#==============================================================================================
</p>

<p>
	# Import Variables from XML:
</p>

<p>
	If (![string]::IsNullOrEmpty($hostinvocation)) {
</p>

<p>
	[string]$Script:ScriptPath = [System.IO.Path]::GetDirectoryName([System.Windows.Forms.Application]::ExecutablePath)
</p>

<p>
	[string]$Script:ScriptFile = [System.IO.Path]::GetFileName([System.Windows.Forms.Application]::ExecutablePath)
</p>

<p>
	[string]$Script:ScriptName = [System.IO.Path]::GetFileNameWithoutExtension([System.Windows.Forms.Application]::ExecutablePath)
</p>

<p>
	} ElseIf ($Host.Version.Major -lt 3) {
</p>

<p>
	[string]$Script:ScriptPath = Split-Path -parent $MyInvocation.MyCommand.Definition
</p>

<p>
	[string]$Script:ScriptFile = Split-Path -Leaf $script:MyInvocation.MyCommand.Path
</p>

<p>
	[string]$Script:ScriptName = $ScriptFile.Split('.')[0].Trim()
</p>

<p>
	} Else {
</p>

<p>
	[string]$Script:ScriptPath = $PSScriptRoot
</p>

<p>
	[string]$Script:ScriptFile = Split-Path -Leaf $PSCommandPath
</p>

<p>
	[string]$Script:ScriptName = $ScriptFile.Split('.')[0].Trim()
</p>

<p>
	}
</p>

<p>
	#Set-StrictMode -Version Latest
</p>

<p>
	# Import parameter file
</p>

<p>
	$Script:ParameterFile = $ScriptName + "_Parameters.xml"
</p>

<p>
	$Script:ParameterFilePath = $ScriptPath
</p>

<p>
	[xml]$cfg = Get-Content ($ParameterFilePath + "\" + $ParameterFile) # Read content of XML file
</p>

<p>
	# Import variables
</p>

<p>
	Function New-XMLVariables {
</p>

<p>
	# Create a variable reference to the XML file
</p>

<p>
	$cfg.Settings.Variables.Variable | foreach {
</p>

<p>
	# Set Variables contained in XML file
</p>

<p>
	$VarValue = $_.Value
</p>

<p>
	$CreateVariable = $True # Default value to create XML content as Variable
</p>

<p>
	switch ($_.Type) {
</p>

<p>
	# Format data types for each variable
</p>

<p>
	'[string]' { $VarValue = [string]$VarValue } # Fixed-length string of Unicode characters
</p>

<p>
	'[char]' { $VarValue = [char]$VarValue } # A Unicode 16-bit character
</p>

<p>
	'[byte]' { $VarValue = [byte]$VarValue } # An 8-bit unsigned character
</p>

<p>
	'[bool]' { If ($VarValue.ToLower() -eq 'false'){$VarValue = [bool]$False} ElseIf ($VarValue.ToLower() -eq 'true'){$VarValue = [bool]$True} } # An boolean True/False value
</p>

<p>
	'[int]' { $VarValue = [int]$VarValue } # 32-bit signed integer
</p>

<p>
	'[long]' { $VarValue = [long]$VarValue } # 64-bit signed integer
</p>

<p>
	'[decimal]' { $VarValue = [decimal]$VarValue } # A 128-bit decimal value
</p>

<p>
	'[single]' { $VarValue = [single]$VarValue } # Single-precision 32-bit floating point number
</p>

<p>
	'[double]' { $VarValue = [double]$VarValue } # Double-precision 64-bit floating point number
</p>

<p>
	'[DateTime]' { $VarValue = [DateTime]$VarValue } # Date and Time
</p>

<p>
	'[Array]' { $VarValue = [Array]$VarValue.Split(',') } # Array
</p>

<p>
	'[Command]' { $VarValue = Invoke-Expression $VarValue; $CreateVariable = $False } # Command
</p>

<p>
	}
</p>

<p>
	If ($CreateVariable) { New-Variable -Name $_.Name -Value $VarValue -Scope $_.Scope -Force }
</p>

<p>
	}
</p>

<p>
	}
</p>

<p>
	New-XMLVariables
</p>

<p>
	$ReportDate = (Get-Date -UFormat "%A, %d. %B %Y %R")
</p>

<p>
	#==============================================================================================
</p>

<p>
	$currentDir = Split-Path $MyInvocation.MyCommand.Path
</p>

<p>
	$outputpath = Join-Path $currentDir "" #add here a custom output folder if you wont have it on the same directory
</p>

<p>
	$outputdate = Get-Date -Format 'yyyyMMddHHmm'
</p>

<p>
	$logfile = Join-Path $outputpath ("PVSHealthCheck.log")
</p>

<p>
	$resultsHTM = Join-Path $outputpath ("PVSFarmReport.htm") #add $outputdate in filename if you like
</p>

<p>
	$errorsHTM = Join-Path $currentDir ("PVSHealthCheckErrors.htm")
</p>

<p>
	if ($PerformPVSTargetCheck -eq "yes") {
</p>

<p>
	#Header for Table 1 "Target Device Checks"
</p>

<p>
	$TargetfirstheaderName = "TargetDeviceName"
</p>

<p>
	$TargetheaderNames = "CollectionName", "Ping", "Retry", "vDisk_PVS", "vDisk_Version", "WriteCache", "PVSServer","BootTime","PVSClientVersion"
</p>

<p>
	$TargetheaderWidths = "4", "4", "4", "4", "2" , "4", "4"
</p>

<p>
	$Targettablewidth = 1200
</p>

<p>
	}
</p>

<p>
	if ($PerformPVSvDiskCheck -eq "yes") {
</p>

<p>
	#Header for Table 2 "vDisk Checks"
</p>

<p>
	$vDiksFirstheaderName = "vDiskName"
</p>

<p>
	$vDiskheaderNames = "Site", "Store", "vDiskFileName", "deviceCount", "CreateDate" , "ReplState", "LoadBalancingAlgorithm", "WriteCacheType"
</p>

<p>
	$vDiskheaderWidths = "4","4", "8", "2","4", "4", "4", "4"
</p>

<p>
	$vDisktablewidth = 1200
</p>

<p>
	}
</p>

<p>
	#Header for Table 3 "PVS Server"
</p>

<p>
	$PVSfirstheaderName = "PVS Server"
</p>

<p>
	$PVSHeaderNames = "Ping", "Active", "deviceCount","SoapService","StreamService","TFTPService"
</p>

<p>
	$PVSheaderWidths = "8", "4", "4","4","4","4"
</p>

<p>
	$PVStablewidth = 800
</p>

<p>
	foreach ($disk in $diskLetters)
</p>

<p>
	{
</p>

<p>
	$PVSHeaderNames += "$($disk)Freespace"
</p>

<p>
	$PVSheaderWidths += "4"
</p>

<p>
	}
</p>

<p>
	$PVSHeaderNames += "AvgCPU","MemUsg"
</p>

<p>
	$PVSheaderWidths += "4","4"
</p>

<p>
	#Header for Table 4 "Farm"
</p>

<p>
	$PVSFirstFarmheaderName = "Farm"
</p>

<p>
	$PVSFarmHeaderNames = "DBServerName", "DatabaseName", "OfflineDB", "LicenseServer"
</p>

<p>
	$PVSFarmWidths = "4", "4", "4", "4"
</p>

<p>
	$PVSFarmTablewidth = 400
</p>

<p>
	#==============================================================================================
</p>

<p>
	#log function
</p>

<p>
	function LogMe() {
</p>

<p>
	Param(
</p>

<p>
	[parameter(Mandatory = $true, ValueFromPipeline = $true)] $logEntry,
</p>

<p>
	[switch]$display,
</p>

<p>
	[switch]$error,
</p>

<p>
	[switch]$warning,
</p>

<p>
	[switch]$progress
</p>

<p>
	)
</p>

<p>
	if ($error) {
</p>

<p>
	$logEntry = "[ERROR] $logEntry" ; Write-Host "$logEntry" -Foregroundcolor Red}
</p>

<p>
	elseif ($warning) {
</p>

<p>
	Write-Warning "$logEntry" ; $logEntry = "[WARNING] $logEntry"}
</p>

<p>
	elseif ($progress) {
</p>

<p>
	Write-Host "$logEntry" -Foregroundcolor Green}
</p>

<p>
	elseif ($display) {
</p>

<p>
	Write-Host "$logEntry" }
</p>

<p>
	#$logEntry = ((Get-Date -uformat "%D %T") + " - " + $logEntry)
</p>

<p>
	$logEntry | Out-File $logFile -Append
</p>

<p>
	}
</p>

<p>
	#==============================================================================================
</p>

<p>
	function Ping([string]$hostname, [int]$timeout = 200) {
</p>

<p>
	$ping = new-object System.Net.NetworkInformation.Ping #creates a ping object
</p>

<p>
	try {
</p>

<p>
	$result = $ping.send($hostname, $timeout).Status.ToString()
</p>

<p>
	} catch {
</p>

<p>
	$result = "Failure"
</p>

<p>
	}
</p>

<p>
	return $result
</p>

<p>
	}
</p>

<p>
	#==============================================================================================
</p>

<p>
	# The function will check the processor counter and check for the CPU usage. Takes an average CPU usage for 5 seconds. It check the current CPU usage for 5 secs.
</p>

<p>
	Function CheckCpuUsage()
</p>

<p>
	{
</p>

<p>
	param ($hostname)
</p>

<p>
	Try { $CpuUsage=(get-counter -ComputerName $hostname -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 5 -ErrorAction Stop | select -ExpandProperty countersamples | select -ExpandProperty cookedvalue | Measure-Object -Average).average
</p>

<p>
	$CpuUsage = "{0:N1}" -f $CpuUsage; return $CpuUsage
</p>

<p>
	} Catch { "Error returned while checking the CPU usage. Perfmon Counters may be fault" | LogMe -error; return 101 }
</p>

<p>
	}
</p>

<p>
	#==============================================================================================
</p>

<p>
	# The function check the memory usage and report the usage value in percentage
</p>

<p>
	Function CheckMemoryUsage()
</p>

<p>
	{
</p>

<p>
	param ($hostname)
</p>

<p>
	Try
</p>

<p>
	{ $SystemInfo = (Get-WmiObject -computername $hostname -Class Win32_OperatingSystem -ErrorAction Stop | Select-Object TotalVisibleMemorySize, FreePhysicalMemory)
</p>

<p>
	$TotalRAM = $SystemInfo.TotalVisibleMemorySize/1MB
</p>

<p>
	$FreeRAM = $SystemInfo.FreePhysicalMemory/1MB
</p>

<p>
	$UsedRAM = $TotalRAM - $FreeRAM
</p>

<p>
	$RAMPercentUsed = ($UsedRAM / $TotalRAM)
</p>

<p>
	return $RAMPercentUsed
</p>

<p>
	} Catch { "Error returned while checking the Memory usage. Perfmon Counters may be fault" | LogMe -error; return 1.01f }
</p>

<p>
	}
</p>

<p>
	#==============================================================================================
</p>

<p>
	Function writeHtmlHeader
</p>

<p>
	{
</p>

<p>
	param($title, $fileName)
</p>

<p>
	$date = $ReportDate
</p>

<p>
	$head = @"
</p>

<p>
	&lt;html&gt;
</p>

<p>
	&lt;head&gt;
</p>

<p>
	&lt;meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'&gt;
</p>

<p>
	&lt;title&gt;$title&lt;/title&gt;
</p>

<p>
	&lt;STYLE TYPE="text/css"&gt;
</p>

<p>
	&lt;!--
</p>

<p>
	td {
</p>

<p>
	font-family: Tahoma;
</p>

<p>
	font-size: 11px;
</p>

<p>
	border-top: 1px solid #999999;
</p>

<p>
	border-right: 1px solid #999999;
</p>

<p>
	border-bottom: 1px solid #999999;
</p>

<p>
	border-left: 1px solid #999999;
</p>

<p>
	padding-top: 0px;
</p>

<p>
	padding-right: 0px;
</p>

<p>
	padding-bottom: 0px;
</p>

<p>
	padding-left: 0px;
</p>

<p>
	overflow: hidden;
</p>

<p>
	}
</p>

<p>
	body {
</p>

<p>
	margin-left: 5px;
</p>

<p>
	margin-top: 5px;
</p>

<p>
	margin-right: 0px;
</p>

<p>
	margin-bottom: 10px;
</p>

<p>
	table {
</p>

<p>
	table-layout:fixed;
</p>

<p>
	border: thin solid #000000;
</p>

<p>
	}
</p>

<p>
	--&gt;
</p>

<p>
	&lt;/style&gt;
</p>

<p>
	&lt;/head&gt;
</p>

<p>
	&lt;body&gt;
</p>

<p>
	&lt;table width='1200'&gt;
</p>

<p>
	&lt;tr bgcolor='#CCCCCC'&gt;
</p>

<p>
	&lt;td colspan='7' height='48' align='center' valign="middle"&gt;
</p>

<p>
	&lt;font face='tahoma' color='#003399' size='4'&gt;
</p>

<p>
	&lt;strong&gt;$title - $date&lt;/strong&gt;&lt;/font&gt;
</p>

<p>
	&lt;/td&gt;
</p>

<p>
	&lt;/tr&gt;
</p>

<p>
	&lt;/table&gt;
</p>

<p>
	"@
</p>

<p>
	$head | Out-File $fileName
</p>

<p>
	}
</p>

<p>
	# ==============================================================================================
</p>

<p>
	Function writeTableHeader
</p>

<p>
	{
</p>

<p>
	param($fileName, $firstheaderName, $headerNames, $headerWidths, $tablewidth)
</p>

<p>
	$tableHeader = @"
</p>

<p>
	&lt;table width='$tablewidth'&gt;&lt;tbody&gt;
</p>

<p>
	&lt;tr bgcolor=#CCCCCC&gt;
</p>

<p>
	&lt;td width='6%' align='center'&gt;&lt;strong&gt;$firstheaderName&lt;/strong&gt;&lt;/td&gt;
</p>

<p>
	"@
</p>

<p>
	$i = 0
</p>

<p>
	while ($i -lt $headerNames.count) {
</p>

<p>
	$headerName = $headerNames[$i]
</p>

<p>
	$headerWidth = $headerWidths[$i]
</p>

<p>
	$tableHeader += "&lt;td width='" + $headerWidth + "%' align='center'&gt;&lt;strong&gt;$headerName&lt;/strong&gt;&lt;/td&gt;"
</p>

<p>
	$i++
</p>

<p>
	}
</p>

<p>
	$tableHeader += "&lt;/tr&gt;"
</p>

<p>
	$tableHeader | Out-File $fileName -append
</p>

<p>
	}
</p>

<p>
	# ==============================================================================================
</p>

<p>
	Function writeTableFooter
</p>

<p>
	{
</p>

<p>
	param($fileName)
</p>

<p>
	"&lt;/table&gt;&lt;br/&gt;"| Out-File $fileName -append
</p>

<p>
	}
</p>

<p>
	#==============================================================================================
</p>

<p>
	Function writeData
</p>

<p>
	{
</p>

<p>
	param($data, $fileName, $headerNames)
</p>

<p>
	$data.Keys | sort | foreach {
</p>

<p>
	$tableEntry += "&lt;tr&gt;"
</p>

<p>
	$computerName = $_
</p>

<p>
	$tableEntry += ("&lt;td bgcolor='#CCCCCC' align=center&gt;&lt;font color='#003399'&gt;$computerName&lt;/font&gt;&lt;/td&gt;")
</p>

<p>
	#$data.$_.Keys | foreach {
</p>

<p>
	$headerNames | foreach {
</p>

<p>
	#"$computerName : $_" | LogMe -display
</p>

<p>
	try {
</p>

<p>
	if ($data.$computerName.$_[0] -eq "SUCCESS") { $bgcolor = "#387C44"; $fontColor = "#FFFFFF" }
</p>

<p>
	elseif ($data.$computerName.$_[0] -eq "WARNING") { $bgcolor = "#FF7700"; $fontColor = "#FFFFFF" }
</p>

<p>
	elseif ($data.$computerName.$_[0] -eq "ERROR") { $bgcolor = "#FF0000"; $fontColor = "#FFFFFF" }
</p>

<p>
	else { $bgcolor = "#CCCCCC"; $fontColor = "#003399" }
</p>

<p>
	$testResult = $data.$computerName.$_[1]
</p>

<p>
	}
</p>

<p>
	catch {
</p>

<p>
	$bgcolor = "#CCCCCC"; $fontColor = "#003399"
</p>

<p>
	$testResult = ""
</p>

<p>
	}
</p>

<p>
	$tableEntry += ("&lt;td bgcolor='" + $bgcolor + "' align=center&gt;&lt;font color='" + $fontColor + "'&gt;$testResult&lt;/font&gt;&lt;/td&gt;")
</p>

<p>
	}
</p>

<p>
	$tableEntry += "&lt;/tr&gt;"
</p>

<p>
	}
</p>

<p>
	$tableEntry | Out-File $fileName -append
</p>

<p>
	}
</p>

<p>
	# ==============================================================================================
</p>

<p>
	Function writeHtmlFooter
</p>

<p>
	{
</p>

<p>
	param($fileName)
</p>

<p>
	@"
</p>

<p>
	&lt;table&gt;
</p>

<p>
	&lt;table width='1200'&gt;
</p>

<p>
	&lt;tr bgcolor='#CCCCCC'&gt;
</p>

<p>
	&lt;td colspan='7' height='25' align='left'&gt;
</p>

<p>
	&lt;br&gt;
</p>

<p>
	&lt;font face='courier' color='#000000' size='2'&gt;&lt;strong&gt;Retry Threshold =&lt;/strong&gt;&lt;/font&gt;&lt;font color='#003399' face='courier' size='2'&gt; $retrythresholdWarning&lt;tr&gt;&lt;/font&gt;&lt;br&gt;
</p>

<p>
	&lt;tr bgcolor='#CCCCCC'&gt;
</p>

<p>
	&lt;/td&gt;
</p>

<p>
	&lt;/tr&gt;
</p>

<p>
	&lt;tr bgcolor='#CCCCCC'&gt;
</p>

<p>
	&lt;/tr&gt;
</p>

<p>
	&lt;/table&gt;
</p>

<p>
	&lt;/body&gt;
</p>

<p>
	&lt;/html&gt;
</p>

<p>
	"@ | Out-File $FileName -append
</p>

<p>
	}
</p>

<p>
	function Farmcheck() {
</p>

<p>
	# ======= PVS Farm Check ====================================================================
</p>

<p>
	"Read some PVS Farm Parameters" | LogMe -display -progress
</p>

<p>
	" " | LogMe -display -progress
</p>

<p>
	$global:PVSFarmResults = @{}
</p>

<p>
	$PVSfarm = Get-PVSFarm
</p>

<p>
	$global:farmname_short = $PVSfarm.FarmName
</p>

<p>
	$PVSFarmtests = @{}
</p>

<p>
	$DBServer = $PVSFarm | %{ $_.DatabaseServerName }
</p>

<p>
	$PVSFarmtests.DBServerName = "NEUTRAL", $DBServer
</p>

<p>
	$dbname = $PVSFarm | %{ $_.DatabaseName }
</p>

<p>
	$PVSFarmtests.databaseName = "NEUTRAL", $dbname
</p>

<p>
	$OfflineDB = $PVSFarm | %{ $_.OfflineDatabaseSupportEnabled }
</p>

<p>
	$PVSFarmtests.OfflineDB = "NEUTRAL", $OfflineDB
</p>

<p>
	$LicenseServer = $PVSFarm | %{ $_.LicenseServer }
</p>

<p>
	$PVSFarmtests.LicenseServer = "NEUTRAL", $LicenseServer
</p>

<p>
	$global:PVSFarmResults.$global:farmname_short = $PVSFarmtests
</p>

<p>
	}
</p>

<p>
	function PVSServerCheck() {
</p>

<p>
	# ======= PVS Server Check ==================================================================
</p>

<p>
	"Check PVS Servers" | LogMe -display -progress
</p>

<p>
	" " | LogMe -display -progress
</p>

<p>
	$global:PVSResults = @{}
</p>

<p>
	$allPVSServer = Get-PvsServer
</p>

<p>
	foreach($PVServerName in $allPVSServer){
</p>

<p>
	$PVStests = @{}
</p>

<p>
	$PVServerName_short = $PVServerName | %{ $_.ServerName }
</p>

<p>
	"PVS-Server: $PVServerName_short" | LogMe -display -progress
</p>

<p>
	$PVServerName_short
</p>

<p>
	# Ping server
</p>

<p>
	$result = Ping $PVServerName_short 100
</p>

<p>
	"Ping: $result" | LogMe -display -progress
</p>

<p>
	if ($result -ne "SUCCESS") { $PVStests.Ping = "ERROR", $result }
</p>

<p>
	else { $PVStests.Ping = "SUCCESS", $result
</p>

<p>
	# Check services
</p>

<p>
	if ((Get-Service -Name "soapserver" -ComputerName $PVServerName_short).Status -Match "Running") {
</p>

<p>
	"SoapService running..." | LogMe
</p>

<p>
	$PVStests.SoapService = "SUCCESS", "Success"
</p>

<p>
	} else {
</p>

<p>
	"SoapService service stopped" | LogMe -display -error
</p>

<p>
	$PVStests.SoapService = "ERROR", "Error"
</p>

<p>
	}
</p>

<p>
	if ((Get-Service -Name "StreamService" -ComputerName $PVServerName_short).Status -Match "Running") {
</p>

<p>
	"StreamService service running..." | LogMe
</p>

<p>
	$PVStests.StreamService = "SUCCESS","Success"
</p>

<p>
	} else {
</p>

<p>
	"StreamService service stopped" | LogMe -display -error
</p>

<p>
	$PVStests.StreamService = "ERROR","Error"
</p>

<p>
	}
</p>

<p>
	if ((Get-Service -Name "BNTFTP" -ComputerName $PVServerName_short).Status -Match "Running") {
</p>

<p>
	"TFTP service running..." | LogMe
</p>

<p>
	$PVStests.TFTPService = "SUCCESS","Success"
</p>

<p>
	} else {
</p>

<p>
	"TFTP service stopped" | LogMe -display -error
</p>

<p>
	$PVStests.TFTPService = "ERROR","Error"
</p>

<p>
	}
</p>

<p>
	#==============================================================================================
</p>

<p>
	# CHECK CPU AND MEMORY USAGE
</p>

<p>
	#==============================================================================================
</p>

<p>
	# Check the AvgCPU value for 5 seconds
</p>

<p>
	$AvgCPUval = CheckCpuUsage ($PVServerName_short)
</p>

<p>
	#$VDtests.LoadBalancingAlgorithm = "SUCCESS", "LB is set to BEST EFFORT"}
</p>

<p>
	if( [int] $AvgCPUval -lt 75) { "CPU usage is normal [ $AvgCPUval % ]" | LogMe -display; $PVStests.AvgCPU = "SUCCESS", "$AvgCPUval %" }
</p>

<p>
	elseif([int] $AvgCPUval -lt 85) { "CPU usage is medium [ $AvgCPUval % ]" | LogMe -warning; $PVStests.AvgCPU = "WARNING", "$AvgCPUval %" }
</p>

<p>
	elseif([int] $AvgCPUval -lt 95) { "CPU usage is high [ $AvgCPUval % ]" | LogMe -error; $PVStests.AvgCPU = "ERROR", "$AvgCPUval %" }
</p>

<p>
	elseif([int] $AvgCPUval -eq 101) { "CPU usage test failed" | LogMe -error; $PVStests.AvgCPU = "ERROR", "Err" }
</p>

<p>
	else { "CPU usage is Critical [ $AvgCPUval % ]" | LogMe -error; $PVStests.AvgCPU = "ERROR", "$AvgCPUval %" }
</p>

<p>
	$AvgCPUval = 0
</p>

<p>
	# Check the Physical Memory usage
</p>

<p>
	$UsedMemory = CheckMemoryUsage ($PVServerName_short)
</p>

<p>
	if( $UsedMemory -lt 0.75) { "Memory usage is normal [ {0:p2} ]" -f $UsedMemory | LogMe -display; $PVStests.MemUsg = "SUCCESS", "{0:p2} ]" -f $UsedMemory }
</p>

<p>
	elseif($UsedMemory -lt 0.85) { "Memory usage is medium [ {0:p2} ]" -f $UsedMemory | LogMe -warning; $PVStests.MemUsg = "WARNING", "{0:p2} ]" -f $UsedMemory }
</p>

<p>
	elseif($UsedMemory -lt 0.95) { "Memory usage is high [ {0:p2} ]" -f $UsedMemory | LogMe -error; $PVStests.MemUsg = "ERROR", "{0:p2} ]" -f $UsedMemory }
</p>

<p>
	elseif($UsedMemory -eq 1.01) { "Memory usage test failed" | LogMe -error; $PVStests.MemUsg = "ERROR", "Err" }
</p>

<p>
	else { "Memory usage is Critical [ {0:p2} ]" -f $UsedMemory | LogMe -error; $PVStests.MemUsg = "ERROR", "{0:p2} ]" -f $UsedMemory }
</p>

<p>
	$UsedMemory = 0
</p>

<p>
	foreach ($disk in $diskLetters)
</p>

<p>
	{
</p>

<p>
	# Check Disk Usage
</p>

<p>
	$HardDisk = Get-WmiObject Win32_LogicalDisk -ComputerName $PVServerName_short -Filter "DeviceID='$($disk):'" | Select-Object Size,FreeSpace
</p>

<p>
	$DiskTotalSize = $HardDisk.Size
</p>

<p>
	$DiskFreeSpace = $HardDisk.FreeSpace
</p>

<p>
	$frSpace=[Math]::Round(($DiskFreeSpace/1073741824),2)
</p>

<p>
	$PercentageDS = (($DiskFreeSpace / $DiskTotalSize ) * 100); $PercentageDS = "{0:N2}" -f $PercentageDS
</p>

<p>
	If ( [int] $PercentageDS -gt 15) { "Disk Free is normal [ $PercentageDS % ]" | LogMe -display; $PVStests."$($disk)Freespace" = "SUCCESS", "$frSpace GB" }
</p>

<p>
	ElseIf ([int] $PercentageDS -lt 15) { "Disk Free is Low [ $PercentageDS % ]" | LogMe -warning; $PVStests."$($disk)Freespace" = "WARNING", "$frSpace GB" }
</p>

<p>
	ElseIf ([int] $PercentageDS -lt 5) { "Disk Free is Critical [ $PercentageDS % ]" | LogMe -error; $PVStests."$($disk)Freespace" = "ERROR", "$frSpace GB" }
</p>

<p>
	ElseIf ([int] $PercentageDS -eq 0) { "Disk Free test failed" | LogMe -error; $PVStests."$($disk)Freespace" = "ERROR", "Err" }
</p>

<p>
	Else { "Disk Free is Critical [ $PercentageDS % ]" | LogMe -error; $PVStests."$($disk)Freespace" = "ERROR", "$frSpace GB" }
</p>

<p>
	$PercentageDS = 0
</p>

<p>
	}
</p>

<p>
	#Check PVS Activity Status (over PVS Framework)
</p>

<p>
	$serverstatus = Get-PvsServerStatus -ServerName $PVServerName_short
</p>

<p>
	$actviestatus = $serverstatus.Status
</p>

<p>
	if ($actviestatus -eq 1) { $PVStests.Active = "SUCCESS", "active" }
</p>

<p>
	else { $PVStests.Active = "Error","inactive" }
</p>

<p>
	"PVS-Active-Status: $actviestatus" | LogMe -display -progress
</p>

<p>
	#Check PVS deviceCount
</p>

<p>
	$numberofdevices = $serverstatus.DeviceCount
</p>

<p>
	if ($numberofdevices -ge 1) { $PVStests.deviceCount = "SUCCESS", " $numberofdevices active" }
</p>

<p>
	else { $PVStests.deviceCount = "WARNING","No devices on this server" }
</p>

<p>
	"Number of devices: $numberofdevices" | LogMe -display -progress
</p>

<p>
	$global:PVSResults.$PVServerName_short = $PVStests
</p>

<p>
	}
</p>

<p>
	}
</p>

<p>
	}
</p>

<p>
	function PVSvDiskCheck() {
</p>

<p>
	# ======= PVS vDisk Check #==================================================================
</p>

<p>
	"Check PVS vDisks" | LogMe -display -progress
</p>

<p>
	" " | LogMe -display -progress
</p>

<p>
	$AllvDisks = Get-PvsDiskInfo -SiteName $siteName
</p>

<p>
	$global:vdiskResults = @{}
</p>

<p>
	foreach($vDisk in $AllvDisks )
</p>

<p>
	{
</p>

<p>
	$VDtests = @{}
</p>

<p>
	#VdiskName
</p>

<p>
	$vDiskName = $vDisk | %{ $_.Name }
</p>

<p>
	"Name of vDisk: $vDiskName" | LogMe -display -progress
</p>

<p>
	$vDiskName
</p>

<p>
	#VdiskSite
</p>

<p>
	$VdiskSite = $vDisk | %{ $_.sitename }
</p>

<p>
	"vDiskDtore: $VdiskSite" | LogMe -display -progress
</p>

<p>
	$VDtests.Site = "NEUTRAL", $VdiskSite
</p>

<p>
	#VdiskStore
</p>

<p>
	$vDiskStore = $vDisk | %{ $_.StoreName }
</p>

<p>
	"vDiskDtore: $vDiskStore" | LogMe -display -progress
</p>

<p>
	$VDtests.Store = "NEUTRAL", $vDiskStore
</p>

<p>
	#Get details of each version of the vDisk:
</p>

<p>
	$vDiskVersions = Get-PvsDiskVersion -Name $vDiskName -SiteName $VdiskSite -StoreName $vDiskStore
</p>

<p>
	$vDiskVersionTable = @{}
</p>

<p>
	foreach($diskVersion in $vDiskVersions){
</p>

<p>
	#VdiskVersionFilename
</p>

<p>
	$diskversionfilename = $diskVersion | %{ $_.DiskFileName }
</p>

<p>
	"Filename of Version: $diskversionfilename" | LogMe -display -progress
</p>

<p>
	$vDiskVersionTable.diskversionfilename += $diskversionfilename +="&lt;br&gt;"
</p>

<p>
	#VdiskVersionVersion
</p>

<p>
	$diskversionDeviceCount = $diskVersion | %{ $_.DeviceCount }
</p>

<p>
	$StringDiskversionDeviceCount = $diskversionDeviceCount | Out-String
</p>

<p>
	"Version: $StringDiskversionDeviceCount" | LogMe -display -progress
</p>

<p>
	$vDiskVersionTable.StringDiskversionDeviceCount += $StringDiskversionDeviceCount +="&lt;br&gt;"
</p>

<p>
	#VdiskVersionCreateDate
</p>

<p>
	$diskversionCreateDate = $diskVersion | %{ $_.CreateDate }
</p>

<p>
	"Filename of Version: $diskversionCreateDate" | LogMe -display -progress
</p>

<p>
	$vDiskVersionTable.diskversionCreateDate += $diskversionCreateDate +="&lt;br&gt;"
</p>

<p>
	#VdiskVersion ReplState (GoodInventoryStatus)
</p>

<p>
	$diskversionGoodInventoryStatus = $diskVersion | %{ $_.GoodInventoryStatus }
</p>

<p>
	$StringDiskversionGoodInventoryStatus = $diskversionGoodInventoryStatus | Out-String
</p>

<p>
	"Filename of Version: $StringDiskversionGoodInventoryStatus" | LogMe -display -progress
</p>

<p>
	#Check if correct replicated, count Replication Errors
</p>

<p>
	Write-Host "Schreibe hier: " $DiskversionGoodInventoryStatus
</p>

<p>
	$ReplErrorCount = 0
</p>

<p>
	if($DiskversionGoodInventoryStatus -like "True" ){
</p>

<p>
	$ReplErrorCount += 0
</p>

<p>
	} else {
</p>

<p>
	$ReplErrorCount += 1}
</p>

<p>
	$vDiskVersionTable.StringDiskversionGoodInventoryStatus += $StringDiskversionGoodInventoryStatus +="&lt;br&gt;"
</p>

<p>
	#Check if correct replicated THE LAST DISK
</p>

<p>
	if($ReplErrorCount -eq 0 ){
</p>

<p>
	"$diskversionfilename correct replicated" | LogMe
</p>

<p>
	$ReplStateStatus = "SUCCESS"
</p>

<p>
	} else {
</p>

<p>
	"$diskversionfilename not correct replicated $ReplErrorCount errors" | LogMe -display -error
</p>

<p>
	$ReplStateStatus = "ERROR"}
</p>

<p>
	}
</p>

<p>
	$VDtests.vDiskFileName = "Neutral", $vDiskVersionTable.diskversionfilename
</p>

<p>
	$VDtests.DeviceCount = "Neutral", $vDiskVersionTable.StringDiskversionDeviceCount
</p>

<p>
	$VDtests.CreateDate = "Neutral", $vDiskVersionTable.diskversionCreateDate
</p>

<p>
	$VDtests.ReplState = "$ReplStateStatus", $vDiskVersionTable.StringDiskversionGoodInventoryStatus
</p>

<p>
	#Check for WriteCacheType
</p>

<p>
	# -----------------------
</p>

<p>
	# Feel free to change it to the the from you desired State (e.g.Exchange a SUCCESS with a WARNING)
</p>

<p>
	# In this default configuration, only "Cache to Ram with overflow" and "Cache to Device Hard disk" is desired and appears green on the output.
</p>

<p>
	#
</p>

<p>
	# $WriteCacheType 9=RamOfToHD 0=PrivateMode 4=DeviceHD 8=DeviceHDPersistent 3=DeviceRAM 1=PVSServer 7=ServerPersistent
</p>

<p>
	$vDiskWriteCacheType = $vDisk | %{ $_.WriteCacheType }
</p>

<p>
	if($vDiskWriteCacheType -eq 9 ){
</p>

<p>
	"WC is set to Cache to Device Ram with overflow to HD" | LogMe
</p>

<p>
	$VDtests.WriteCacheType = "SUCCESS", "WC Cache to Ram with overflow to HD"}
</p>

<p>
	elseif($vDiskWriteCacheType -eq 0 ){
</p>

<p>
	"WC is not set because vDisk is in PrivateMode (R/W)" | LogMe
</p>

<p>
	$VDtests.WriteCacheType = "Error", "vDisk is in PrivateMode (R/W) "}
</p>

<p>
	elseif($vDiskWriteCacheType -eq 4 ){
</p>

<p>
	"WC is set to Cache to Device Hard Disk" | LogMe
</p>

<p>
	$VDtests.WriteCacheType = "SUCCESS", "WC is set to Cache to Device Hard Disk"}
</p>

<p>
	elseif($vDiskWriteCacheType -eq 8 ){
</p>

<p>
	"WC is set to Cache to Device Hard Disk Persistent" | LogMe
</p>

<p>
	$VDtests.WriteCacheType = "Error", "WC is set to Cache to Device Hard Disk Persistent"}
</p>

<p>
	elseif($vDiskWriteCacheType -eq 3 ){
</p>

<p>
	"WC is set to Cache to Device Ram" | LogMe
</p>

<p>
	$VDtests.WriteCacheType = "WARNING", "WC is set to Cache to Device Ram"}
</p>

<p>
	elseif($vDiskWriteCacheType -eq 1 ){
</p>

<p>
	"WC is set to Cache to PVS Server HD" | LogMe
</p>

<p>
	$VDtests.WriteCacheType = "Error", "WC is set to Cache to PVS Server HD"}
</p>

<p>
	elseif($vDiskWriteCacheType -eq 7 ){
</p>

<p>
	"WC is set to Cache to PVS Server HD Persistent" | LogMe
</p>

<p>
	$VDtests.WriteCacheType = "Error", "WC is set to Cache to PVS Server HD Persistent"}
</p>

<p>
	#Vdisk SubnetAffinity or fixed ServerName
</p>

<p>
	$vDiskfixServerName = $vDisk | %{ $_.ServerName }
</p>

<p>
	"vDisk is fix assigned to Server: $vDiskfixServerName" | LogMe -display -progress
</p>

<p>
	if($vDiskfixServerName -eq "" )
</p>

<p>
	{
</p>

<p>
	$vDiskSubnetAffinity = $vDisk | %{ $_.SubnetAffinity }
</p>

<p>
	"vDiskDtore: $vDiskSubnetAffinity" | LogMe -display -progress
</p>

<p>
	#SubnetAffinity: 1=Best Effort, 2= fixed, 0=none
</p>

<p>
	if($vDiskSubnetAffinity -eq 1 ){
</p>

<p>
	"LB-Algorythm is set to BestEffort" | LogMe
</p>

<p>
	$VDtests.LoadBalancingAlgorithm = "SUCCESS", "LB is set to BEST EFFORT"}
</p>

<p>
	elseif($vDiskSubnetAffinity -eq 2 ){
</p>

<p>
	"LB-Algorythm is set to fixed" | LogMe
</p>

<p>
	$VDtests.LoadBalancingAlgorithm = "WARNING", "LB is set to FIXED"}
</p>

<p>
	elseif($vDiskSubnetAffinity -eq 0 ){
</p>

<p>
	"LB-Algorythm is set to none" | LogMe
</p>

<p>
	$VDtests.LoadBalancingAlgorithm = "SUCCESS", "LB is set to NONE, least busy server is used"}
</p>

<p>
	}
</p>

<p>
	else{
</p>

<p>
	$VDtests.LoadBalancingAlgorithm = "ERROR", "No LoadBalancing! Server is fix assigned to $vDiskfixServerName"}
</p>

<p>
	#image name adds Site name in multi site reports
</p>

<p>
	if ($siteName.count -ne 1) {$global:vdiskResults."$vDiskName ($VdiskSite)" = $VDtests}
</p>

<p>
	else {$global:vdiskResults.$vDiskName = $VDtests}
</p>

<p>
	}
</p>

<p>
	}
</p>

<p>
	function PVSTargetCheck() {
</p>

<p>
	# ======= PVS Target Device Check ========
</p>

<p>
	"Check PVS Target Devices" | LogMe -display -progress
</p>

<p>
	" " | LogMe -display -progress
</p>

<p>
	$global:allResults = @{}
</p>

<p>
	$pvsdevices = Get-PvsDevice
</p>

<p>
	foreach($target in $pvsdevices) {
</p>

<p>
	$tests = @{}
</p>

<p>
	# Check to see if the server is in an excluded folder path
</p>

<p>
	$CollectionName = $target | %{ $_.CollectionName }
</p>

<p>
	#Only Check Servers in defined Collections:
</p>

<p>
	if ($Collections -contains $CollectionName -Or $Collections -contains "every") {
</p>

<p>
	$targetName = $target | %{ $_.Name }
</p>

<p>
	$targetName
</p>

<p>
	#Name of CollectionName
</p>

<p>
	$CollectionName = $target | %{ $_.CollectionName }
</p>

<p>
	"Collection: $CollectionName" | LogMe -display -progress
</p>

<p>
	$tests.CollectionName = "NEUTRAL", "$CollectionName"
</p>

<p>
	$targetNamePvsDeviceInfo = Get-PvsDeviceInfo -Name $targetName
</p>

<p>
	$DeviceUsedDiskVersion = $targetNamePvsDeviceInfo.DiskVersion
</p>

<p>
	"Used DiskVersion: $DeviceUsedDiskVersion" | LogMe -display -progress
</p>

<p>
	$tests.vDisk_Version = "NEUTRAL", "$DeviceUsedDiskVersion"
</p>

<p>
	$DeviceUsedServerName= $targetNamePvsDeviceInfo.ServerName
</p>

<p>
	"Used Server: $DeviceUsedServerName" | LogMe -display -progress
</p>

<p>
	$tests.PVSServer = "NEUTRAL", "$DeviceUsedServerName"
</p>

<p>
	$TargetDeviceWMIData = (Get-WmiObject -Namespace root/Citrix/PVS -Class PVS_Target -ComputerName $targetName)
</p>

<p>
	$Boot_Time = $TargetDeviceWMIData.Boot_Time_In_Sec
</p>

<p>
	"BootTime: $Boot_Time sec" | LogMe -display -progress
</p>

<p>
	$tests.BootTime = "NEUTRAL", "$Boot_Time sec"
</p>

<p>
	$TargetSw = $TargetDeviceWMIData.Target_Software_Version
</p>

<p>
	"PVSClientVersion: $TargetSw" | LogMe -display -progress
</p>

<p>
	$tests.PVSClientVersion = "NEUTRAL", "$TargetSw"
</p>

<p>
	$targetNamePvsDeviceStatus = Get-PvsDeviceStatus -Name $targetName
</p>

<p>
	$RetryStatus = $targetNamePvsDeviceStatus.Status
</p>

<p>
	"Retry: $RetryStatus" | LogMe -display -progress
</p>

<p>
	$tests.Retry = "NEUTRAL", "$RetryStatus"
</p>

<p>
	# Ping target
</p>

<p>
	$result = Ping $targetName 100
</p>

<p>
	if ($result -ne "SUCCESS") { $tests.Ping = "ERROR", $result }
</p>

<p>
	else { $tests.Ping = "SUCCESS", $result
</p>

<p>
	}
</p>

<p>
	$DiskFileNameStatus = $targetNamePvsDeviceStatus.DiskFileName
</p>

<p>
	"Retry: $DiskFileNameStatus" | LogMe -display -progress
</p>

<p>
	$tests.vDisk_PVS = "NEUTRAL", "$DiskFileNameStatus"
</p>

<p>
	$TargetDeviceDiskWMIData = (Get-WmiObject -Namespace root/Citrix/PVS -Class PVS_VDisk -ComputerName $targetName)
</p>

<p>
	$vDisk_PVS = $TargetDeviceDiskWMIData.VDisk_Name
</p>

<p>
	"vDisk_PVS: $vDisk_PVS" | LogMe -display -progress
</p>

<p>
	$tests.vDisk_PVS = "NEUTRAL", "$vDisk_PVS"
</p>

<p>
	$WriteCache = $TargetDeviceDiskWMIData.Write_Cache_Volume_Size
</p>

<p>
	"vDisk_PVS: $WriteCache MB" | LogMe -display -progress
</p>

<p>
	$tests.WriteCache = "NEUTRAL", "$WriteCache MB"
</p>

<p>
	$global:allResults.$targetName = $tests
</p>

<p>
	}
</p>

<p>
	}
</p>

<p>
	}
</p>

<p>
	#==============================================================================================
</p>

<p>
	#HTML function
</p>

<p>
	function WriteHTML() {
</p>

<p>
	# ======= Write all results to an html file =================================================
</p>

<p>
	Write-Host ("Saving results to html report: " + $resultsHTM)
</p>

<p>
	# STBE writeHtmlHeader "PVS Farm Report $global:farmname_short" $resultsHTM
</p>

<p>
	#$EnvironmentName = "$EnvironmentName $global:farmname_short"
</p>

<p>
	writeHtmlHeader "$EnvName" $resultsHTM
</p>

<p>
	if ($PerformPVSvDiskCheck -eq "yes") {
</p>

<p>
	writeTableHeader $resultsHTM $vDiksFirstheaderName $vDiskheaderNames $vDiskheaderWidths $vDisktablewidth
</p>

<p>
	$global:vdiskResults | sort-object -property ReplState | % { writeData $vdiskResults $resultsHTM $vDiskheaderNames }
</p>

<p>
	writeTableFooter $resultsHTM
</p>

<p>
	}
</p>

<p>
	writeTableHeader $resultsHTM $PVSFirstheaderName $PVSheaderNames $PVSheaderWidths $PVStablewidth
</p>

<p>
	$global:PVSResults | sort-object -property PVServerName_short | % { writeData $PVSResults $resultsHTM $PVSheaderNames}
</p>

<p>
	writeTableFooter $resultsHTM
</p>

<p>
	writeTableHeader $resultsHTM $PVSFirstFarmheaderName $PVSFarmHeaderNames $PVSFarmWidths $PVSFarmTablewidth
</p>

<p>
	$global:PVSFarmResults | % { writeData $PVSFarmResults $resultsHTM $PVSFarmHeaderNames}
</p>

<p>
	writeTableFooter $resultsHTM
</p>

<p>
	if ($PerformPVSTargetCheck -eq "yes") {
</p>

<p>
	writeTableHeader $resultsHTM $TargetFirstheaderName $TargetheaderNames $TargetheaderWidths $TargetTablewidth
</p>

<p>
	$allResults | sort-object -property collectionName | % { writeData $allResults $resultsHTM $TargetheaderNames}
</p>

<p>
	writeTableFooter $resultsHTM
</p>

<p>
	}
</p>

<p>
	writeHtmlFooter $resultsHTM
</p>

<p>
	# STBE #send email
</p>

<p>
	# STBE $emailSubject = ("$emailSubjectStart - $global:farmname_short - " + (Get-Date -format R))
</p>

<p>
	# STBE $global:mailMessageParameters = @{
</p>

<p>
	# STBE From = $emailFrom
</p>

<p>
	# STBE To = $emailTo
</p>

<p>
	# STBE Subject = $emailSubject
</p>

<p>
	# STBE SmtpServer = $smtpServer
</p>

<p>
	# STBE Body = (gc $resultsHTM) | Out-String
</p>

<p>
	# STBE Attachment = $resultsHTM
</p>

<p>
	# STBE }
</p>

<p>
	}
</p>

<p>
	#==============================================================================================
</p>

<p>
	#Mail function
</p>

<p>
	# Send mail
</p>

<p>
	function SendMail() {
</p>

<p>
	Param (
</p>

<p>
	[Parameter(
</p>

<p>
	Mandatory = $True,
</p>

<p>
	Position = 0,
</p>

<p>
	ValueFromPipeline = $True
</p>

<p>
	)]
</p>

<p>
	[System.String[]]
</p>

<p>
	$Subject
</p>

<p>
	)
</p>

<p>
	#send email
</p>

<p>
	$emailMessage = New-Object System.Net.Mail.MailMessage
</p>

<p>
	$emailMessage.From = $emailFrom
</p>

<p>
	$emailMessage.To.Add( $emailTo )
</p>

<p>
	$emailMessage.Subject = $Subject
</p>

<p>
	$emailMessage.IsBodyHtml = $true
</p>

<p>
	$emailMessage.Body = (gc $resultsHTM) | Out-String
</p>

<p>
	$emailMessage.Attachments.Add($resultsHTM)
</p>

<p>
	$emailMessage.Priority = ($emailPrio)
</p>

<p>
	$smtpClient = New-Object System.Net.Mail.SmtpClient( $smtpServer , $smtpServerPort )
</p>

<p>
	$smtpClient.EnableSsl = $smtpEnableSSL
</p>

<p>
	# If you added username an password, add this to smtpClient
</p>

<p>
	If ((![string]::IsNullOrEmpty($smtpUser)) -and (![string]::IsNullOrEmpty($smtpPW))){
</p>

<p>
	$pass = $smtpPW | ConvertTo-SecureString -key $smtpKey
</p>

<p>
	$cred = New-Object System.Management.Automation.PsCredential($smtpUser,$pass)
</p>

<p>
	$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($cred.Password)
</p>

<p>
	$smtpUserName = $cred.Username
</p>

<p>
	$smtpPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
</p>

<p>
	$smtpClient.Credentials = New-Object System.Net.NetworkCredential( $smtpUserName , $smtpPassword );
</p>

<p>
	}
</p>

<p>
	$smtpClient.Send( $emailMessage )
</p>

<p>
	}
</p>

<p>
	#==============================================================================================
</p>

<p>
	# == MAIN SCRIPT ==
</p>

<p>
	#==============================================================================================
</p>

<p>
	$scriptstart = Get-Date
</p>

<p>
	rm $logfile -force -EA SilentlyContinue
</p>

<p>
	"Begin with Citrix Provisioning Services HealthCheck" | LogMe -display -progress
</p>

<p>
	" " | LogMe -display -progress
</p>

<p>
	Farmcheck
</p>

<p>
	$EnvName = "$EnvironmentName $farmname_short"
</p>

<p>
	$emailSubject = ("$EnvName - " + $ReportDate)
</p>

<p>
	if ($PerformPVSTargetCheck -eq "yes") {
</p>

<p>
	"Initiate PVS Target check" | LogMe
</p>

<p>
	PVSTargetCheck
</p>

<p>
	} else {
</p>

<p>
	" PVS Target check skipped" | LogMe
</p>

<p>
	}
</p>

<p>
	if ($PerformPVSvDiskCheck -eq "yes") {
</p>

<p>
	"Initiate PVS Target check" | LogMe
</p>

<p>
	PVSvDiskCheck
</p>

<p>
	} else {
</p>

<p>
	" PVSvDiskCheck check skipped" | LogMe
</p>

<p>
	}
</p>

<p>
	PVSServerCheck
</p>

<p>
	WriteHTML
</p>

<p>
	if ($PerformSendMail -eq "yes") {
</p>

<p>
	"Initiate send of Email " | LogMe
</p>

<p>
	SendMail -Subject $emailSubject
</p>

<p>
	} else {
</p>

<p>
	"send of Email skipped" | LogMe
</p>

<p>
	}
</p>

<p>
	$scriptend = Get-Date
</p>

<p>
	$scriptruntime = $scriptend - $scriptstart | select TotalSeconds
</p>

<p>
	$scriptruntimeInSeconds = $scriptruntime.TotalSeconds
</p>

<p>
	#Write-Host $scriptruntime.TotalSeconds
</p>

<p>
	"Script was running for $scriptruntimeInSeconds " | LogMe -display -progress
</p>
]]></description><guid isPermaLink="false">251558</guid><pubDate>Wed, 14 Jun 2023 17:23:04 +0000</pubDate></item><item><title>PVS boot failes with 'getting devices ready' after Windows June 2025 updates on Windows 11 24H2 - Nutanix</title><link>https://community.stage.citrix.com/forums/topic/256620-pvs-boot-failes-with-getting-devices-ready-after-windows-june-2025-updates-on-windows-11-24h2-nutanix/</link><description><![CDATA[<p>Hi,</p><p>we have a VDI environment with Win11 24H2 VMs on Nutanix (AMD CPUs) with PVS 2402 CU1 (also on Nutanix)</p><p>I have a working golden Image and can make new version of this image with no problem.</p><p>But if I install the latest Windows Updates (June 2025), a new version of my PVS-Disk will fail to boot on 'getting devices ready'.</p><p>The funny thing is, this happens not immediately after creating the new version, but on the next day.</p>]]></description><guid isPermaLink="false">256620</guid><pubDate>Tue, 24 Jun 2025 06:49:12 +0000</pubDate></item><item><title>dedicateddumpfile.sys filled the write cache disk</title><link>https://community.stage.citrix.com/forums/topic/253700-dedicateddumpfilesys-filled-the-write-cache-disk/</link><description><![CDATA[<p>
	Hello,
</p>

<p>
	is there any way to limit the size of the dedicateddumpfile.sys which is consuming 8Gb of the write cache disk for Windows 11 24H2.
</p>

<p>
	I already tried [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\CrashControl]<br />
	"DumpFileSize"=dword:00000002<br />
	"IgnorePagefileSize"=dword:00000001
</p>

<p>
	but it's not helping. Thanks.
</p>
]]></description><guid isPermaLink="false">253700</guid><pubDate>Mon, 24 Mar 2025 10:17:18 +0000</pubDate></item><item><title><![CDATA[PVS 2402 console crashes when drag & drop vdisk to collections]]></title><link>https://community.stage.citrix.com/forums/topic/253182-pvs-2402-console-crashes-when-drag-drop-vdisk-to-collections/</link><description><![CDATA[<p>
	With PVS 2402 console I'm nearly unable to drag &amp; drop a vdisk from the vDisk Pool to a device collection. It crashes the console mmc in 99%. 
</p>

<p>
	If I press F5 in vDisk Pool and F5 in the device collection before I drag &amp; drop it works most of the time. It's a gui issue. Assign the vdisk by powershell works.
</p>

<p>
	New server 2022 with pvs 2402 ltsr.
</p>

<p>
	 
</p>

<p>
	Errors:
</p>

<p>
	---------------------------<br />
	Application Error<br />
	---------------------------<br />
	An unhandled exception occurred and the application will exit. Please report the information below. Press Ctrl-C to copy the data to the clipboard.
</p>

<p>
	Exception has been thrown by the target of an invocation.
</p>

<p>
	Stack Trace:<br />
	   at Microsoft.ManagementConsole.Executive.MmcThreadMessageWindow.OnThreadException(Exception e)
</p>

<p>
	   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
</p>

<p>
	<br />
	---------------------------<br />
	OK   <br />
	---------------------------
</p>

<p>
	Faulting application name: mmc.exe, version: 10.0.20348.2520, time stamp: 0x72fcf7c3<br />
	Faulting module name: KERNELBASE.dll, version: 10.0.20348.2520, time stamp: 0x72149c73<br />
	Exception code: 0xc000041d<br />
	Fault offset: 0x000000000003f17c<br />
	Faulting process id: 0x1f18<br />
	Faulting application start time: 0x01daf3c84d489326<br />
	Faulting application path: C:\Windows\system32\mmc.exe<br />
	Faulting module path: C:\Windows\System32\KERNELBASE.dll<br />
	Report Id: 3c6a8277-cb51-400c-ae98-85c785236148<br />
	Faulting package full name: <br />
	Faulting package-relative application ID: 
</p>

<p>
	Application: mmc.exe<br />
	Framework Version: v4.0.30319<br />
	Description: The process was terminated due to an unhandled exception.<br />
	Exception Info: exception code e0434352, exception address 00007FFE3946F17C<br />
	Stack:<br />
	   at System.Windows.Forms.SafeNativeMethods.DoDragDrop(System.Runtime.InteropServices.ComTypes.IDataObject, IOleDropSource, Int32, Int32[])<br />
	   at System.Windows.Forms.SafeNativeMethods.DoDragDrop(System.Runtime.InteropServices.ComTypes.IDataObject, IOleDropSource, Int32, Int32[])<br />
	   at System.Windows.Forms.Control.DoDragDrop(System.Object, System.Windows.Forms.DragDropEffects)<br />
	   at EnterpriseManager.LeafPage.nodeList_MouseMove(System.Object, System.Windows.Forms.MouseEventArgs)<br />
	   at System.Windows.Forms.Control.OnMouseMove(System.Windows.Forms.MouseEventArgs)<br />
	   at System.Windows.Forms.Control.WmMouseMove(System.Windows.Forms.Message ByRef)<br />
	   at System.Windows.Forms.Control.WndProc(System.Windows.Forms.Message ByRef)<br />
	   at System.Windows.Forms.ListView.WndProc(System.Windows.Forms.Message ByRef)<br />
	   at EnterpriseControls.PvscListView.WndProc(System.Windows.Forms.Message ByRef)<br />
	   at System.Windows.Forms.NativeWindow.Callback(IntPtr, Int32, IntPtr, IntPtr)<br />
	   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG ByRef)<br />
	   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG ByRef)<br />
	   at System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr, Int32, Int32)<br />
	   at System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext)<br />
	   at System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext)<br />
	   at Microsoft.ManagementConsole.Internal.SnapInMessagePumpProxy.Microsoft.ManagementConsole.Internal.ISnapInMessagePumpProxy.Run()<br />
	   at Microsoft.ManagementConsole.Internal.ISnapInMessagePumpProxy.Run()<br />
	   at Microsoft.ManagementConsole.Executive.SnapInThread.OnThreadStart()<br />
	   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)<br />
	   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)<br />
	   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)<br />
	   at System.Threading.ThreadHelper.ThreadStart()<br />
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">253182</guid><pubDate>Wed, 21 Aug 2024 13:36:47 +0000</pubDate></item><item><title>Only 1 PVS Server can updated</title><link>https://community.stage.citrix.com/forums/topic/253759-only-1-pvs-server-can-updated/</link><description><![CDATA[<p>
	Hi,<br />
	i try an PVS update from 2402 to 2411.<br />
	Server 1 works fine. Server 2 gets an error after the wizard trys to stop the services and configure the server.<br />
	If i try to update first Server 2 this works fine and Server 1 get the error.<br />
	Log is at the attachment.<br />
	What can causes this?<br />
	<br />
	Regards<br />
	Dennis
</p>
<p>
<a class="ipsAttachLink" href="https://community.stage.citrix.com/applications/core/interface/file/attachment.php?id=38337&amp;key=8df991ddcfb0ae5bd0926ece3bdda5a7" data-fileExt='log' data-fileid='38337' data-filekey='8df991ddcfb0ae5bd0926ece3bdda5a7'>ConfigWizard.log</a></p>]]></description><guid isPermaLink="false">253759</guid><pubDate>Tue, 08 Apr 2025 14:23:53 +0000</pubDate></item><item><title>Black screen on boot after creating a new version of the image</title><link>https://community.stage.citrix.com/forums/topic/253773-black-screen-on-boot-after-creating-a-new-version-of-the-image/</link><description><![CDATA[<p>
	Hi,
</p>

<p>
	I'm deploying a new PVS 2402 CU2 farm on Windows Server 2022 / vSphere hypervisor.
</p>

<p>
	I have created the golden VM and converted the disk to a vDisk without any issues. The vDisk appears to be fine, and the new target devices can boot correctly in read mode.
</p>

<p>
	Now if I create a new version of the vDisk, a VM in maintenance mode can boot in read/write mode on first boot. But after another reboot, it remains on a black screen and can never boot properly.
</p>

<p>
	Is seems that something wrong happens in the vDisk when it goes into read/write mode for the first time but I don't know what exactly. I thought of a problem with Windows Updae trying to update the drivers of network cards so I disabled the service, but still the same problem.
</p>

<p>
	Or maybe is it another problem like the boot process (I use BDM + ISO)?
</p>

<p>
	Do you know how I can find out what's wrong?
</p>

<p>
	Thanks
</p>
]]></description><guid isPermaLink="false">253773</guid><pubDate>Fri, 11 Apr 2025 07:39:38 +0000</pubDate></item><item><title>Attempting to use PVS API fails 'The underlying provider failed on Open.'</title><link>https://community.stage.citrix.com/forums/topic/253688-attempting-to-use-pvs-api-fails-the-underlying-provider-failed-on-open/</link><description><![CDATA[<p>
	Starting from <a href="https://docs.citrix.com/fr-fr/provisioning/2402-ltsr/troubleshooting/api.html" rel="external nofollow">https://docs.citrix.com/fr-fr/provisioning/2402-ltsr/troubleshooting/api.html </a>I'm attempting to obtain a token to provision <span style="color:rgb(0,0,0);font-family:Verdana;font-size:11.2px;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;word-spacing:0px;white-space:normal;background-color:rgb(255,255,255);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;float:none;">PVS Machines, however it does not seem to work, I tried using </span>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">Set-PvsApiConnection</span></pre>

<p>
	the error is "Set-PvsApiConnection : The underlying provider failed on Open."
</p>

<p>
	after exploring the help page for api https://localhost:54324/Citrix/PVS/v1/help, i executed the http request to obtain a better log and got the following<br />
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">The exception message is 'The underlying provider failed on Open.'. See server logs for more details. The exception stack trace is:
         at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
   at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   at System.Data.Entity.Core.Objects.ObjectQuery`1.&amp;lt;&amp;gt;c__DisplayClass7.&amp;lt;GetResults&amp;gt;b__5()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Entity.Core.Objects.ObjectQuery`1.&amp;lt;System.Collections.Generic.IEnumerable&amp;lt;T&amp;gt;.GetEnumerator&amp;gt;b__0()
   at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   at SqlContext.SqlContext.GetFarmAdminIDs(Guid authGroupId, Boolean isReadOnly)
   at RoleBasedAdminEngine.RoleBaseAdminEngine.GetUserRoles(String user)
   at PvsApi.PvsApi.Login()
   at SyncInvokeLogin(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp;amp; outputs)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp;amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp;amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp;amp; rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</span></pre>

<p>
	The version of PVS is : 2402.2<br />
	<br />
	Any guidance as to what I'm doing wrong?
</p>
]]></description><guid isPermaLink="false">253688</guid><pubDate>Wed, 19 Mar 2025 16:50:04 +0000</pubDate></item><item><title>Windows 11 Entra ID Hybrid Join not working with PVS</title><link>https://community.stage.citrix.com/forums/topic/253613-windows-11-entra-id-hybrid-join-not-working-with-pvs/</link><description><![CDATA[<p>
	Hello,
</p>

<p>
	We are using the following platform:
</p>

<ul>
	<li>
		<strong>Windows 11</strong> (Version 23H2 or 24H2)
	</li>
	<li>
		<strong>Citrix XenDesktop</strong> (Version 2402 LTSR CU1)
	</li>
	<li>
		<strong>Citrix PVS</strong> (Version 2402 LTSR CU1)
	</li>
	<li>
		<strong>XenServer 8</strong>
	</li>
</ul>

<p>
	On the <strong>Master Image</strong>, the <strong>Azure AD Join</strong> works without any issues and returns the following status:
</p>

<p>
	<span style="font-size:11px;"><span style="font-family:'Courier New', Courier, monospace;">DsrCLI: logging initialized.<br>
	Waiting for Join Task to complete. This could take a few minutes...</span></span>
</p>

<p>
	<span style="font-size:11px;"><span style="font-family:'Courier New', Courier, monospace;">DsrCLI: logging initialized.<br>
	DsrCmdJoinHelper::Join: ClientRequestId: 2292a118-a11e-4789-94fd-f10fd05745b0DsrCmdAccountMgr::IsDomainControllerAvailable: DsGetDcName success { domain:xxx forest:xxx domainController:\\xxx isDcAvailable:true }<br>
	DsrCmdAccountMgr::IsDrsJoined: DsrCmdCertHelper::PrivateKeyAquireTest Passed 0x00000000.<br>
	DsrCmdAccountMgr::IsDrsJoined: DsrCmdCertHelper::PrivateKeyAquireTest Passed 0x00000000.<br>
	PreJoinChecks Complete.</span></span>
</p>

<p>
	<span style="font-size:11px;"><span style="font-family:'Courier New', Courier, monospace;">preCheckResult: DoNotJoin<br>
	deviceKeysHealthy: YES<br>
	isJoined: YES<br>
	isDcAvailable: YES<br>
	isSystem: YES<br>
	keyProvider: Microsoft Platform Crypto Provider<br>
	keyContainer: 5092062b-8d3c-4e98-aa43-dd0404e8d1c1<br>
	dsrInstance: AzureDrs<br>
	elapsedSeconds: 0<br>
	resultCode: 0x1<br>
	The device is already joined.</span></span><br>
	<br>
	However, when we <strong>publish</strong> the Master Image after running <code>dsregcmd /leave</code> or create new VMs using the <strong>Citrix Virtual Desktops Setup Wizard</strong>, the join no longer works, and we receive the following error when running <code>dsregcmd /join /debug</code> on startup:
</p>

<p>
	<span style="font-size:11px;"><span style="font-family:'Courier New', Courier, monospace;">DsrCLI: logging initialized.<br>
	Waiting for Join Task to complete. This could take a few minutes...</span></span>
</p>

<p>
	<span style="font-size:11px;"><span style="font-family:'Courier New', Courier, monospace;">DsrCLI: logging initialized.<br>
	DsrCmdJoinHelper::Join: ClientRequestId: a801d494-f14f-4fcb-ac80-bfada7519094DsrCmdAccountMgr::IsDomainControllerAvailable: DsGetDcName success { domain:xxx forest:xxx domainController:\\xxx isDcAvailable:true }<br>
	DsrCmdCertHelper::TryPrivateKeyAquire: CryptAcquireCertificatePrivateKey failed 0x80090016.<br>
	DsrCmdAccountMgr::IsDrsJoined: DsrCmdCertHelper::PrivateKeyAquireTest failed with error code 0x801c002c.<br>
	DsrCmdAccountMgr::IsDrsJoined: DsrCmdRecovery::TestTransportKeyHealth failed with error code 0x80090011.<br>
	PreJoinChecks Complete.</span></span>
</p>

<p>
	<span style="font-size:11px;"><span style="font-family:'Courier New', Courier, monospace;">preCheckResult: LeaveThenJoin<br>
	deviceKeysHealthy: NO (device key)<br>
	isJoined: YES<br>
	isDcAvailable: YES<br>
	isSystem: YES<br>
	keyProvider: undefined<br>
	keyContainer: undefined<br>
	dsrInstance: AzureDrs<br>
	elapsedSeconds: 0<br>
	resultCode: 0x0<br>
	Automatic device join pre-check tasks completed.</span></span>
</p>

<p>
	<span style="font-size:11px;"><span style="font-family:'Courier New', Courier, monospace;">TenantInfo::Discover: Join Info { TenantType = Managed; AutoJoinEnabled = TRUE; TenandID = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; TenantName = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx }<br>
	DsrCmdJoinHelper::Join: Kerberos discovery data not available. Skip kerb join.DsrCmdJoinHelper::Join: Performing join type DEVICE_AUTO...<br>
	Join request ID: 7b54a6f1-0405-43cd-8cd8-b925939d851a<br>
	Join response time: 02-14-2025 15:24:41Z<br>
	Join HTTP status: 400<br>
	Join error code: invalid_request<br>
	Join error subcode: error_computer_signature_check_failure<br>
	Join message: The verification of the signature failed for device 64bd8096-5a63-4124-9a9a-5ff9ce61e59b in domain 2b534cad-d51b-45bb-af2b-59c0fe587cd2.<br>
	Server operation: DeviceRenew<br>
	DsrCmdDeviceEnroller::AutoEnroll(DEVICE_AUTO) failed with error code: 0x801c005b.<br>
	DsrCmdJoinHelper::Join: DsrCmdDeviceEnroller::AutoEnroll(DEVICE_AUTO) failed with error code 0x801c005b.<br>
	DSREGCMD_END_STATUS<br>
	             AzureAdJoined : NO<br>
	          EnterpriseJoined : NO</span></span><br>
	 
</p>

<p>
	All previous attempts to resolve this issue have failed. We suspect a problem with <strong>Citrix PVS and/or vTPM</strong>.
</p>

<p>
	Can anyone help us?<br>
	Citrix?
</p>

<p>
	Robert<br>
	<br>
	seems to be a similar issue like here but we cannot wait 30mins to get this work...
</p>
<iframe allowfullscreen="" data-embedauthorid="33909" data-embedcontent="" data-embedid="embed7753479975" style="height:277px;max-width:502px;" src="https://community.stage.citrix.com/forums/topic/253432-pvs-td-windows-11-entra-id-hybrid-join-is-slow/?do=embed&amp;comment=86907&amp;embedComment=86907&amp;embedDo=findComment#comment-86907" loading="lazy"></iframe>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">253613</guid><pubDate>Fri, 14 Feb 2025 15:50:15 +0000</pubDate></item><item><title>PVS Server doesnt stream to PVS Target device</title><link>https://community.stage.citrix.com/forums/topic/253611-pvs-server-doesnt-stream-to-pvs-target-device/</link><description><![CDATA[<p>
	Hi all,
</p>

<p>
	On the recent days we notice that one of our PVS server stop stream to PVS target device. All the servcies are running, the PVS server shows online on the console.
</p>

<p>
	We tried to restart the server didnt work, the service account rin both server and has local admin. We tried to re-configre the wizard didnt help either, the service account has ntfs permission on the vDisk folder.
</p>

<p>
	When the pvs target device boot its stuck on "connect to ip address of pvs server" and on power on target device and we doing rebalnce the device they dont get stream from the other pvs server.
</p>

<p>
	Any idea?
</p>
]]></description><guid isPermaLink="false">253611</guid><pubDate>Fri, 14 Feb 2025 09:33:33 +0000</pubDate></item><item><title>Citrix PVS: Sophos Golden Image Prep recreates duplicated device after every reboot</title><link>https://community.stage.citrix.com/forums/topic/253542-citrix-pvs-sophos-golden-image-prep-recreates-duplicated-device-after-every-reboot/</link><description><![CDATA[<p>
	Hello!
</p>

<p>
	 
</p>

<p>
	We use Citrix PVS for our environment.
</p>

<p>
	We also use Sophos Endpoint.
</p>

<p>
	We have categorized the machines into machine catalogs.
</p>

<p>
	If I want to create a new vdisk merged base, I use Sophos' Golden Image Prep.
</p>

<p>
	The machines restart at night. After the restart, the device is duplicated in the Sophos console every time.
</p>

<p>
	I have already followed several articles from Sophos on how to use Golden Image Prep correctly, but unfortunately without success.
</p>

<p>
	If I remove the duplicated devices from the console they reappear after the next boot from the golden image.
</p>

<p>
	 
</p>

<p>
	For example:
</p>

<ul>
	<li>
		<a href="https://docs.sophos.com/central/Customer/help/en-us/PeopleAndDevices/ProtectDevices/VDIGoldImage/index.html" rel="external nofollow">Create gold images and clone new devices - Sophos Central Admin</a>
	</li>
	<li>
		<a href="https://support.sophos.com/support/s/article/KBA-000003130?language=en_US" rel="external nofollow">Sophos Central Endpoint: Avoid duplicate identities when installing on a gold image</a>
	</li>
	<li>
		<a href="https://support.sophos.com/support/s/article/KBA-000006069?language=en_US" rel="external nofollow">Sophos Central Admin: Duplicate device frequently asked questions</a>
	</li>
</ul>

<p>
	 
</p>

<p>
	I hope someone can help me here.
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="//media.invisioncic.com/r328636/monthly_2025_01/image.png.bbafb9ea6465778bb45cc03eb2b80e66.png" data-fileid="37482" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="37482" width="1000" alt="image.thumb.png.29f78aedd5fa1f1105acfd7a8e58fbe0.png" src="//media.invisioncic.com/r328636/monthly_2025_01/image.thumb.png.29f78aedd5fa1f1105acfd7a8e58fbe0.png" loading="lazy" height="260"></a>
</p>
]]></description><guid isPermaLink="false">253542</guid><pubDate>Tue, 14 Jan 2025 08:32:37 +0000</pubDate></item><item><title>2nd PVS VMWare Maschine not booting</title><link>https://community.stage.citrix.com/forums/topic/250703-2nd-pvs-vmware-maschine-not-booting/</link><description><![CDATA[<p>
	Hi,
</p>

<p>
	 
</p>

<p>
	i create a second VMMware Maschine to boot the new vDisk Image. After booting tftp from PVS Server the 2nd VM i get this error message:
</p>

<p>
	 
</p>

<p>
	Error: Attemping to set IP address on boot NIC
</p>

<p>
	 
</p>

<p>
	The fristVM Boot perfect wihout any errors. So have someone had this error before?
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="PNG" data-fileid="47963" href="//media.invisioncic.com/r328636/monthly_2023_01/bootnic.PNG.76775a599eb93438049deab623d655b1.PNG" rel=""><img alt="bootnic.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="47963" width="400" src="//media.invisioncic.com/r328636/monthly_2023_01/bootnic.thumb.PNG.2a1d59ab51b7668b32672414cdf118ed.PNG" loading="lazy" height="132"></a>
</p>
]]></description><guid isPermaLink="false">250703</guid><pubDate>Tue, 31 Jan 2023 15:17:44 +0000</pubDate></item><item><title>Clone Session Host VDA</title><link>https://community.stage.citrix.com/forums/topic/253366-clone-session-host-vda/</link><description><![CDATA[<p>
	Hello folks, We've a customer that needs to move the Citrx VDA MCS based machine catalogs from on-prem Vsphere Cluster to a cloud provider. The provider doesn't allow the connection to vcenter, only the vlocud director interface can be used by the customers.<br />
	The CVAD infrastructure is pretty updated and I wonder if I can install on the cloud infrastructure a new RDS 2022 with the Citrix VDA (machine provisioned with other tecnologies), alle the applications and then "manually" clone the VM as template and from there create some VMs to build a new machine catalog of persistent VDA. Basically I'd like to know if it's supported the cloning and sysprep of a Windows 2022 RDS with VDA. At every "major" update of the idea is to destroy the machine catalog and create a new one starting from the updated original template.
</p>

<p>
	Thanks a lot
</p>
]]></description><guid isPermaLink="false">253366</guid><pubDate>Mon, 28 Oct 2024 11:31:05 +0000</pubDate></item><item><title>PVS RAM Cache</title><link>https://community.stage.citrix.com/forums/topic/253267-pvs-ram-cache/</link><description><![CDATA[<p>
	Hello, I'm going to add to this post and hope for some tips. I have a farm with Windows Server 2022 workers. Currently still BIOS but it will soon be switched to UEFI. Currently still PVS 2203 but soon 2402.<br />
	The workers have 64 GB RAM
</p>

<p>
	Currently I use 20 GB WriteCache from RAM so that not so much is written to the WriteCacheHDD (40GB) (Chache in RAM with Overflow on Harddisk).<br />
	The servers are restarted every two days (50% restart today, and 50% restart tomorrow...)
</p>

<p>
	The vidskdiff on the WriteCache HDD will be 20-30GB in size. 
</p>

<p>
	Asynchronous IO are currently still off. 
</p>

<p>
	What are your experiences? So far I have the experience that 8-10GB Ram Cache is sufficient. 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">253267</guid><pubDate>Fri, 20 Sep 2024 06:19:47 +0000</pubDate></item><item><title>Citrix Virtual Apps and Desktops 1912 PVS random VDA server will freeze/crash and I have to hard reset the VM</title><link>https://community.stage.citrix.com/forums/topic/243384-citrix-virtual-apps-and-desktops-1912-pvs-random-vda-server-will-freezecrash-and-i-have-to-hard-reset-the-vm/</link><description><![CDATA[<p>
	Running CVAD 1912 PVS on our VMware 6.5 environment.  All of our Citrix servers are running Windows Server 2019 Datacenter.  We currently have about 6 VDA servers that users log into for work.  Randomly each week, one of those servers will freeze/crash.  When I try to access it from the VM console, I can't do anything.  Users report that their sessions are frozen as well.  The only thing to do is to do a hard reset on the VM.  Once it reboots, it's okay again until the next time.  I don't see anything in the Event logs that suggest what the culprit is.  I am currently working with Citrix support to try and diagnose the issue.  They are looking at memory dumps.  We are using Trend Micro Apex One as our antivirus, and Citrix Support suggested we put in place the proper exclusions.  However, it's still freezing with the exclusions in place.  Once the server freezes, eventually you'll see an error log show up on the Delivery Controller that the Broker Agent lost contact with the server.  Yesterday, a user first called that they seemed stuck.  At first, I checked the VM console and saw that I could still log into it.  So I thought the server was okay still.  I tried to shadow the user and it timed out.  Shortly after, we received other calls from users that they couldn't move either.  I noticed they were all on the same server.  When I went back to the VM console, it was frozen.  Anyone experience anything like this before?
</p>]]></description><guid isPermaLink="false">243384</guid><pubDate>Thu, 24 Sep 2020 16:41:41 +0000</pubDate></item><item><title>PVS 2402 new farm db creation Invalid object name 'DatabaseVersion'</title><link>https://community.stage.citrix.com/forums/topic/253142-pvs-2402-new-farm-db-creation-invalid-object-name-databaseversion/</link><description><![CDATA[<p>
	As we had SQL server 2016 sp3 in use our dba's built new database servers with sql 2022 and I've built new pvs servers. Just used the config wizard and I'm unable to create the database. A empty database was created by our dba's as ever. Used the Create new farm and the step Configuring Services failed. 
</p>

<p>
	Invalid object name 'DatabaseVersion'
</p>

<p>
	New database servers, new pvs servers, new farm. Why do I get this error?
</p>
]]></description><guid isPermaLink="false">253142</guid><pubDate>Wed, 07 Aug 2024 13:15:50 +0000</pubDate></item><item><title>Manual load balancing not working?  1912 CU7 currently...</title><link>https://community.stage.citrix.com/forums/topic/253137-manual-load-balancing-not-working-1912-cu7-currently/</link><description><![CDATA[<p>
	I'd like to update our two PVS servers to the latest CU9 recommended versions per a recent security bulletin.  Generally our practice is to have connections on the server we are not upgrading, then move connections to the other server while we update the other.  
</p>

<p>
	Currently have all connections on one server (PVS2) after having it set to do so.  Had the balancing set to boot  from this device and shut down all the other devices on the other server that no longer had user sessions.  
</p>

<p>
	I set the other (PVS1) as the 'use this server to provide the vDisk' and then went to "Servers" and rebalance.. it says success but all connections remain on PVS2.  
</p>

<p>
	Can someone lend a hand here as I don't want to update the PVS Console/Server without being able to move the connections from one to the other.  Is there another way to force the connection to the other PVS server?  
</p>
]]></description><guid isPermaLink="false">253137</guid><pubDate>Mon, 05 Aug 2024 12:24:19 +0000</pubDate></item><item><title>SQL server requirements for PVS 2402 contradictory</title><link>https://community.stage.citrix.com/forums/topic/253051-sql-server-requirements-for-pvs-2402-contradictory/</link><description><![CDATA[<p>
	<a href="https://docs.citrix.com/en-us/provisioning/2402-ltsr/system-requirements.html#database" rel="external nofollow">https://docs.citrix.com/en-us/provisioning/2402-ltsr/system-requirements.html#database</a> shows that you need SQL server 2017 and later and give me a link to <a href="https://support.citrix.com/article/CTX114501/supported-databases-for-virtual-apps-and-desktops-and-citrix-provisioning-pvs" rel="external nofollow">Supported Databases for Virtual Apps and Desktops AND Citrix Provisioning (PVS)</a> which shows that SQL server 2016 SP2 and later is supported. What is correct?
</p>

<p>
	<a href="https://docs.citrix.com/en-us/provisioning/2402-ltsr/system-requirements.html#database" rel="external nofollow">https://docs.citrix.com/en-us/provisioning/2402-ltsr/system-requirements.html#database</a> shows db collation should end with _100_CI_AS_KS and provides a link to <a href="https://support.citrix.com/article/CTX262776/faq-recommended-database-collations-for-citrix-products" rel="external nofollow">FAQ: Recommended database collations for Citrix Products</a> which shows that the collation for pvs should be _CP1_CI_AS. That's great.
</p>

<p>
	My sql express test db has a collation of SQL_Latin1_General_CP1_CI_AS, so I believe this could be right.
</p>
]]></description><guid isPermaLink="false">253051</guid><pubDate>Wed, 03 Jul 2024 08:01:42 +0000</pubDate></item><item><title>PVS and Windows Certificate Store Persistence</title><link>https://community.stage.citrix.com/forums/topic/248034-pvs-and-windows-certificate-store-persistence/</link><description><![CDATA[<p>
	Using Citrix PVS 1912 LTSR to deploy Windows 2016. We need to push a client certificate for MECM to each target enrolled via auto-enroll in GPO. How to persist this in the PVS targets? I don't want eac yarget to auto-enroll and get a new cert every time it starts. 
</p>
]]></description><guid isPermaLink="false">248034</guid><pubDate>Fri, 28 Jan 2022 11:29:25 +0000</pubDate></item><item><title>BSOD in Windows Server 2022 PVS target devices cache in RAM</title><link>https://community.stage.citrix.com/forums/topic/252088-bsod-in-windows-server-2022-pvs-target-devices-cache-in-ram/</link><description><![CDATA[<p>
	I have BSOD when using "Cache in device RAM" option. 
</p>

<p>
	 
</p>

<p>
	FYI
</p>

<p>
	I created images from Windows 2019 Server and Windows 2022 Server 
</p>

<p>
	 
</p>

<p>
	PVS 2203.0.3 LTSR
</p>

<p>
	6vCPU + 60GB RAM + 70GBdisk
</p>

<p>
	XenServer 8.1CU2
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">252088</guid><pubDate>Sat, 07 Oct 2023 18:22:34 +0000</pubDate></item><item><title>Citrix Provisioning Compatibility</title><link>https://community.stage.citrix.com/forums/topic/252850-citrix-provisioning-compatibility/</link><description><![CDATA[<p>
	We are in the process of updating the environment and we will first update the Delivery Controllers to version 2203 LTSR, and the PVS will remain on version 1912 LTSR for a week. Could I have compatibility problems because they are on different versions?
</p>
]]></description><guid isPermaLink="false">252850</guid><pubDate>Fri, 19 Apr 2024 13:45:10 +0000</pubDate></item><item><title>PVS using Azure SQL</title><link>https://community.stage.citrix.com/forums/topic/253070-pvs-using-azure-sql/</link><description><![CDATA[<p>
	Hi 
</p>

<p>
	any reference or guide for how to set up PVS DB on Azure SQL ?
</p>

<p>
	 
</p>

<p>
	Regards
</p>
]]></description><guid isPermaLink="false">253070</guid><pubDate>Tue, 09 Jul 2024 19:20:30 +0000</pubDate></item></channel></rss>
