<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Michael Wood - Virtualize Brief]]></title><description><![CDATA[Virtualization for Citrix and VMware. Lets keep it brief.]]></description><link>https://virtualizebrief.woodcloud.one/</link><image><url>https://virtualizebrief.woodcloud.one/favicon.png</url><title>Michael Wood - Virtualize Brief</title><link>https://virtualizebrief.woodcloud.one/</link></image><generator>Ghost 5.8</generator><lastBuildDate>Thu, 26 Mar 2026 04:02:36 GMT</lastBuildDate><atom:link href="https://virtualizebrief.woodcloud.one/author/michael/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Storehouse | Retype documentation site]]></title><description><![CDATA[<figure class="kg-card kg-embed-card kg-card-hascaption"><iframe width="200" height="113" src="https://www.youtube.com/embed/TPXbp5aJ64Q?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Build a Self Hosted Markdown Documentation Site with Retype (one click code)"></iframe><figcaption>Virtualize Brief on Youtube</figcaption></figure><p>Documentation website using markdown files. This simple deployment for a windows machine takes you from nothing to up and running in a minute or two.</p><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#x201C;I don&apos;t want to write code to write docs,<br>I just want to write docs.&#x201D; <em>-</em></div></div>]]></description><link>https://virtualizebrief.woodcloud.one/post/</link><guid isPermaLink="false">66e852089bc9ed0001ec6b93</guid><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Mon, 16 Sep 2024 15:47:59 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/09/virtualizebrief-storehouse-deployment-windows.png" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-embed-card kg-card-hascaption"><iframe width="200" height="113" src="https://www.youtube.com/embed/TPXbp5aJ64Q?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Build a Self Hosted Markdown Documentation Site with Retype (one click code)"></iframe><figcaption>Virtualize Brief on Youtube</figcaption></figure><img src="https://virtualizebrief.woodcloud.one/content/images/2024/09/virtualizebrief-storehouse-deployment-windows.png" alt="Storehouse | Retype documentation site"><p>Documentation website using markdown files. This simple deployment for a windows machine takes you from nothing to up and running in a minute or two.</p><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">&#x201C;I don&apos;t want to write code to write docs,<br>I just want to write docs.&#x201D; <em>- rab-dev</em></div></div><p>Having also completed this on linux machines and git repositories it is still most common in the IT world for others to gravitate towards windows machines. Thus we seek to meet people where they are.</p><h2 id="retype">Retype</h2><p>Work engine for producing Storehouse. Information on creating pages, components, images, video and more found here: <a href="https://retype.com/components/">retype components</a>.</p><h2 id="deploy-%F0%9F%94%A8">Deploy &#x1F528;</h2><p>Login windows machine and run: <a href="https://github.com/virtualizebrief/collection/blob/main/retype/deploy-retype-storehouse.ps1">deploy-retype-storehouse.ps1</a></p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th style="text-align:left">Feature</th>
<th style="text-align:left">Name</th>
<th style="text-align:left">Note</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Logo</td>
<td style="text-align:left"><a href="https://github.com/virtualizebrief/collection/blob/main/retype/images/icon-storehouse.png">icon-storehouse.png</a></td>
<td style="text-align:left">Copy file to: c:\support\storehouse\site\files</td>
</tr>
<tr>
<td style="text-align:left">Scheduled task</td>
<td style="text-align:left">Start Storehouse</td>
<td style="text-align:left">Edit Start Storehouse selecting a user or service account that has admin privileges on the machine.</td>
</tr>
<tr>
<td style="text-align:left">Storage</td>
<td style="text-align:left">c:\support\storehouse\site</td>
<td style="text-align:left">Where to put documents, etc.</td>
</tr>
<tr>
<td style="text-align:left">Wesbite URL</td>
<td style="text-align:left"><a href="http://localhost:5000">http://localhost:5000</a></td>
<td style="text-align:left">Should put a cert and configure friendly url in dns.</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><h2 id="resources">Resources</h2><ul><li>&#x1F4D8; <a href="https://www.markdownguide.org/getting-started/">Markdown getting started</a></li><li>&#x1F4D5; <a href="https://retype.com/components/">Retype components</a></li></ul><h2 id="final-thoughts">Final thoughts</h2><p>Lets bring documentation into a single site that is easy, simple, free, deploy at scale, full feature search and best of all a highly polished frontend for people to enjoy using.</p>]]></content:encoded></item><item><title><![CDATA[Citrix Powertools | reset-machine-ifDisconnectedUser.ps1]]></title><description><![CDATA[<h2 id="powertools">Powertools</h2><p>A set of Powershell based scripts to simplify managing a Citrix site and unlocking its hidden features.</p><h2 id="reset-machine-ifdisconnecteduserps1">reset-machine-ifdisconnecteduser.ps1</h2><p><a href="https://github.com/virtualizebrief/collection/blob/main/cvadtools/reset-machine-ifdisconnecteduser.ps1">https://github.com/virtualizebrief/collection/blob/main/cvadtools/reset-machine-ifdisconnecteduser.ps1</a></p><p>As you&#x2019;ll learn from below this script should be run on the legacy site against the old desktop.</p>]]></description><link>https://virtualizebrief.woodcloud.one/citrix-powertools-reset-machine-ifdisconnecteduser-ps1/</link><guid isPermaLink="false">66a0fca80e3a2100016a69df</guid><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Wed, 24 Jul 2024 13:11:12 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/07/laptop.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="powertools">Powertools</h2><img src="https://virtualizebrief.woodcloud.one/content/images/2024/07/laptop.jpg" alt="Citrix Powertools | reset-machine-ifDisconnectedUser.ps1"><p>A set of Powershell based scripts to simplify managing a Citrix site and unlocking its hidden features.</p><h2 id="reset-machine-ifdisconnecteduserps1">reset-machine-ifdisconnecteduser.ps1</h2><p><a href="https://github.com/virtualizebrief/collection/blob/main/cvadtools/reset-machine-ifdisconnecteduser.ps1">https://github.com/virtualizebrief/collection/blob/main/cvadtools/reset-machine-ifdisconnecteduser.ps1</a></p><p>As you&#x2019;ll learn from below this script should be run on the legacy site against the old desktop. Performs the following actions:</p><ul><li>Get list of users in an ad group</li><li>Get list of users disconnected from Citrix desktop</li><li>Compare lists and create new list that match both</li><li>Take action: Reset machine if user is both in ad group and disconnected state</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/07/reset-screenshot-1.png" class="kg-image" alt="Citrix Powertools | reset-machine-ifDisconnectedUser.ps1" loading="lazy" width="474" height="128"><figcaption>output of powershell script</figcaption></figure><h2 id="tale-of-two-desktops">Tale of two desktops</h2><p>I&#x2019;ve put this to good use when migrating a large Citrix desktop user base that operates 24-7. The above, in addition to StoreFront site aggregation, have published the same desktop twice, one in legacy site another on new site.</p><p>By adding an ad group to the new desktop on the new site and having the new site placed higher in site aggregation in addition to the desktop having the same name as the legacy site new and current users will now connect to the new desktop in the ad group.</p><p>The hang up is current users will not return to their old desktop with that desktop being in a disconnected state. To prevent trouble this PowerShell script can be coded to run in a loop and check every minute or so to reset machines for these given users.</p><h2 id="final-thoughts">Final thoughts</h2><p>Your now free to add people at will to the new ad group to start using the new desktop on the new site. If someone has an old desktop they disconnect from and are entitled to the new desk the old with be reset and new is ready for connection.</p>]]></content:encoded></item><item><title><![CDATA[Citrix Powertools | get-concurrentUser-licenseCount.ps1]]></title><description><![CDATA[<h1 id="powertools">Powertools</h1><p>A set of Powershell based scripts to simplify managing a Citrix site and unlocking its hidden features.</p><h1 id="get-concurrentuser-licensecountps1">Get-ConcurrentUser-LicenseCount.ps1</h1><p>Citrix license count for concurrent users.</p><ul><li>Use BrokeringUserName</li><li>Get unique names per site</li><li>Comparing sites for unique names</li></ul><p>This total will give you an accurate idea of how many concurrent</p>]]></description><link>https://virtualizebrief.woodcloud.one/citrix-powertools-get-concurrentuser-licensecount-ps1-2/</link><guid isPermaLink="false">65e61bb194d9df000193d17f</guid><category><![CDATA[Citrix]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Mon, 04 Mar 2024 19:08:07 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/03/grace.jpg" medium="image"/><content:encoded><![CDATA[<h1 id="powertools">Powertools</h1><img src="https://virtualizebrief.woodcloud.one/content/images/2024/03/grace.jpg" alt="Citrix Powertools | get-concurrentUser-licenseCount.ps1"><p>A set of Powershell based scripts to simplify managing a Citrix site and unlocking its hidden features.</p><h1 id="get-concurrentuser-licensecountps1">Get-ConcurrentUser-LicenseCount.ps1</h1><p>Citrix license count for concurrent users.</p><ul><li>Use BrokeringUserName</li><li>Get unique names per site</li><li>Comparing sites for unique names</li></ul><p>This total will give you an accurate idea of how many concurrent license your using in the event you&#x2019;ve gone overdraft and are now in supplemental grace period. Time to act and knowing how many licenses you need is key.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/03/image.png" class="kg-image" alt="Citrix Powertools | get-concurrentUser-licenseCount.ps1" loading="lazy" width="333" height="184"><figcaption>Results from running script</figcaption></figure><h1 id="powershell-code">Powershell code</h1><pre><code class="language-powershell">#-you configure these settings
$site1dc = &quot;site1controller&quot;
$site2dc = &quot;site2controller&quot;
$maxSessions = &quot;1400&quot; #your-license-count

#-welcome
clear-host
Write-host &quot;&quot;
write-host &quot;Powertools&quot; -ForegroundColor cyan
write-host &quot; Citrix license count for concurrent users&quot;
write-host &quot; note: does not include Citrix cloud site&quot; -foregroundcolor yellow
write-host &quot; Available concurrrent license count: $maxSessions&quot; -ForegroundColor green
write-host &quot; $time&quot;
write-host &quot;&quot;
write-host &quot;Results&quot; -foregroundcolor Cyan

#-do the thing
$site1name = (Get-BrokerSite -AdminAddress $site1dc).name
$site1 = ((Get-BrokerSession -AdminAddress $site1dc -MaxRecordCount 10000).BrokeringUserName  | Sort-Object | Get-Unique).count
$site1Users = (Get-BrokerSession -AdminAddress $site1dc -MaxRecordCount 10000).BrokeringUserName  | Sort-Object | Get-Unique
$site2name = (Get-BrokerSite -AdminAddress $site2dc).name
$site2 = ((Get-BrokerSession -AdminAddress $site2dc -MaxRecordCount 10000).BrokeringUserName  | Sort-Object | Get-Unique).count
$site2Users = (Get-BrokerSession -AdminAddress $site2dc -MaxRecordCount 10000).BrokeringUserName  | Sort-Object | Get-Unique

$UniqueUsers = $site1Users + $site2Users
$trueUniqueUsers = ($UniqueUsers | Sort-Object | Get-Unique).count
$time = get-date

If ($trueUniqueUsers -gt $maxSessions){$warning = &quot;red&quot;}
If ($trueUniqueUsers -eq $maxSessions){$warning = &quot;yellow&quot;}
If ($trueUniqueUsers -lt $maxSessions){$warning = &quot;green&quot;}

#-results
write-host &quot; * $site1name site: $site1&quot;
write-host &quot; * $site2name site: $site2&quot;
write-host &quot; Total concurrent users: &quot; -nonewline
write-host &quot;$trueUniqueUsers&quot; -ForegroundColor $warning
write-host &quot;&quot;
pause
write-host &quot;&quot;
write-host &quot;&quot;
</code></pre>]]></content:encoded></item><item><title><![CDATA[Citrix Powertools | remove-dg-machinesWithFaultState.ps1]]></title><description><![CDATA[<h2 id="powertools">Powertools</h2><p>A set of Powershell based scripts to simplify managing a Citrix site and unlocking its hidden features.</p><h2 id="remove-dg-machineswithfaultstateps1">Remove-DG-MachinesWithFaultState.ps1</h2><p>Check a delivery group for machines that meet the following:</p><ul><li>Powered on</li><li>Not in Maintenance</li><li>Unregistered</li><li>FaultState is not: none</li></ul><p>Results list machines by name and their current FaultState. If</p>]]></description><link>https://virtualizebrief.woodcloud.one/citrix-powertools-remove-dg-machineswithfaultstate-ps1/</link><guid isPermaLink="false">65c651d4cbc2820001c37f33</guid><category><![CDATA[Citrix]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Fri, 09 Feb 2024 16:26:55 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/02/error.png" medium="image"/><content:encoded><![CDATA[<h2 id="powertools">Powertools</h2><img src="https://virtualizebrief.woodcloud.one/content/images/2024/02/error.png" alt="Citrix Powertools | remove-dg-machinesWithFaultState.ps1"><p>A set of Powershell based scripts to simplify managing a Citrix site and unlocking its hidden features.</p><h2 id="remove-dg-machineswithfaultstateps1">Remove-DG-MachinesWithFaultState.ps1</h2><p>Check a delivery group for machines that meet the following:</p><ul><li>Powered on</li><li>Not in Maintenance</li><li>Unregistered</li><li>FaultState is not: none</li></ul><p>Results list machines by name and their current FaultState. If you&#x2019;d like to remove those machines from the delivery group enter: yes. Or anything else will take no action.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/02/image-6.png" class="kg-image" alt="Citrix Powertools | remove-dg-machinesWithFaultState.ps1" loading="lazy" width="541" height="311"><figcaption>Example results</figcaption></figure><h2 id="powershell-code">Powershell code</h2><pre><code class="language-powershell">#-Welcome message
Clear-Host
Write-Host &quot;&quot;
Write-Host &quot;Citrix Powertools&quot; -ForegroundColor Cyan
Write-Host &quot;&quot;
Write-Host &quot;Remove Machines from Delivery Group which are:&quot; -ForegroundColor Yellow
Write-Host &quot;1. Powered on&quot;
Write-Host &quot;2. Not in Maintenance&quot;
Write-Host &quot;3. UnRegistered&quot;
Write-Host &quot;4. FaultState is not: none&quot;
Write-Host &quot;&quot;

#-user configurable settings
Write-Host &quot;Note: No action is taken till later if you choose to.&quot; -ForegroundColor Green
$DG = Read-Host &quot;Enter delivery group to check&quot;
Write-Host &quot;&quot;

#-do something
Clear-Content .\computers.txt
$totalCount = (Get-BrokerMachine -DesktopGroupName $DG -MaxRecordCount 10000).count
Write-Host &quot;Machine checked: $totalCount&quot;
Write-Host &quot;Reason machine was flagged&quot; -ForegroundColor Yellow
Write-Host &quot;--------------------------------------&quot;

$VMs = (Get-BrokerMachine -DesktopGroupName $DG -InMaintenanceMode $false -PowerState On -RegistrationState Unregistered).MachineName
Foreach ($VM in $VMs) {

    $Result = (Get-BrokerMachine -MachineName $VM).FaultState
    If ($Result -notLike &quot;*none*&quot;){
        Write-Host &quot;$VM &quot; -NoNewline -ForegroundColor Cyan
        Write-Host &quot;$Result&quot;
        Add-Content -Path .\computers.txt -Value &quot;$VM&quot;
        }

}
Write-Host &quot;--------------------------------------&quot;
Write-Host &quot;&quot;

$takeAction = Read-Host &quot;Remove from $DG (yes/anything else to exit without action)?&quot;
Write-Host &quot;&quot;
If ($takeAction -eq &quot;yes&quot;){

$FixMes = Get-Content .\computers.txt
Foreach ($FixMe in $FixMes){

    Remove-BrokerMachine $FixMe -DesktopGroup $DG

}
Write-Host &quot;Completed!&quot; -ForegroundColor Green
Pause
Exit
}

Write-Host &quot;No action taken. Goodbye.&quot; -ForegroundColor Green
Pause
Exit</code></pre><p></p>]]></content:encoded></item><item><title><![CDATA[Self healing for Igel 11.09 & Imprivata PIE 7.12]]></title><description><![CDATA[<h2 id="igel-1109-os-update-is-available">Igel 11.09 os update is available</h2><p>Everything is running fine. You see a new Igel OS update to 11.09 and give it a try. After reboot your left with a screen like this: the Imprivata lock screen did not load.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/02/image.png" class="kg-image" alt loading="lazy" width="1009" height="750" srcset="https://virtualizebrief.woodcloud.one/content/images/size/w600/2024/02/image.png 600w, https://virtualizebrief.woodcloud.one/content/images/size/w1000/2024/02/image.png 1000w, https://virtualizebrief.woodcloud.one/content/images/2024/02/image.png 1009w" sizes="(min-width: 720px) 720px"><figcaption>failure</figcaption></figure><h2 id="deep-dive-time">Deep dive time</h2><p>After connecting with ssh</p>]]></description><link>https://virtualizebrief.woodcloud.one/self-healing-for-igel-11-09-imprivata-pie-7-12/</link><guid isPermaLink="false">65c279e4cbc2820001c37eaf</guid><category><![CDATA[Igel]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Tue, 06 Feb 2024 18:53:56 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/02/healing.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="igel-1109-os-update-is-available">Igel 11.09 os update is available</h2><img src="https://virtualizebrief.woodcloud.one/content/images/2024/02/healing.jpg" alt="Self healing for Igel 11.09 &amp; Imprivata PIE 7.12"><p>Everything is running fine. You see a new Igel OS update to 11.09 and give it a try. After reboot your left with a screen like this: the Imprivata lock screen did not load.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/02/image.png" class="kg-image" alt="Self healing for Igel 11.09 &amp; Imprivata PIE 7.12" loading="lazy" width="1009" height="750" srcset="https://virtualizebrief.woodcloud.one/content/images/size/w600/2024/02/image.png 600w, https://virtualizebrief.woodcloud.one/content/images/size/w1000/2024/02/image.png 1000w, https://virtualizebrief.woodcloud.one/content/images/2024/02/image.png 1009w" sizes="(min-width: 720px) 720px"><figcaption>failure</figcaption></figure><h2 id="deep-dive-time">Deep dive time</h2><p>After connecting with ssh to an Igel device run the command: ImprivataBootstrap and receive error 404 when trying to find the url:</p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-text">https://umc-imprivata.yourdomain.com/sso/servlet/getembeddedloader?arch=amd64&amp;collname=proveidembedded3</div></div><h2 id="proveid-embedded-712">ProveID embedded 7.12</h2><p>Looking at Imprivata your on ProvideID Embedded 7.11 and there is a new 7.12 release. Following the steps, download and install on your Imprivata appliance.</p><p>PIE 7.12 does install on your Igel device with os 11.09 though still no Imprivata lock screen. SSH to device and run: ImprivataBootstrap now returns:</p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-text">2023-11-08 01:06:27,127 - bootstrap - ERROR: Failed to import main loader. Reason: bad magic number in &apos;MainLoader&apos;: b&apos;\x03\xf3\r\n&apos;</div></div><h2 id="one-off">One off</h2><p>Fix this for a single device at the command prompt with the following, which will remove the previous install of ImprivataBootstrap with a wipe then request a new install that will be PIE 7.12.</p><ul><li>ImprivataBootstrap -w</li><li>ImprivataBootstrap</li></ul><h2 id="thousands-of-devices">Thousands of devices</h2><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-text">Now what to do for the multitude of Igel devices you need to upgrade?</div></div><p>I&#x2019;ve put together a bash script that will accomplish the following:</p><ul><li>Wait 5 minutes after boot, good incase an upgrade is still taking place.</li><li>Check if the file /.imprivata_data/runtime/offline/Agent/FirstDomain.txt exist. This file is only present if Imprivata lock screen loads.</li><li>If file is found take no action. If file is not found run the below bootstrap commands to wipe and reboot the device.</li></ul><h2 id="imprivatacleansh">Imprivata_Clean.sh</h2><pre><code class="language-bash">#!/bin/bash
echo $(date +&quot;%Y%m%d_%T&quot;)\n &gt;&gt; /run/Imprivata_BootCheck_Start.log

sleep 300

if [ -a /.imprivata_data/runtime/offline/Agent/FirstDomain.txt ]
then
	echo $(date +&quot;%Y%m%d_%T&quot;)\n &gt;&gt;  /run/Imprivata_BootCheck_FileYes.log
else
	echo $(date +&quot;%Y%m%d_%T&quot;)\n &gt;&gt;  /run/Imprivata_BootCheck_FileNo.log
	ImprivataBootstrap -w
	reboot
fi

#EOF</code></pre><p>As you can see this creates a log file when it starts and check files with results. Each file has a timestamp written into it.</p><figure class="kg-card kg-image-card"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/02/image-1.png" class="kg-image" alt="Self healing for Igel 11.09 &amp; Imprivata PIE 7.12" loading="lazy" width="499" height="127"></figure><h2 id="igel-policy">Igel policy</h2><p>Create an Igel policy named: OS11 Imprivata check if bootstrap. Then enter this:</p><ul><li>System &gt; Firmware Customizations &gt; Custom Commands &gt; Desktop &gt; Final desktop command: /run/Imprivata_Clean.sh &amp;</li></ul><figure class="kg-card kg-image-card"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/02/image-2.png" class="kg-image" alt="Self healing for Igel 11.09 &amp; Imprivata PIE 7.12" loading="lazy" width="487" height="304"></figure><ul><li>Create the bash file above, upload it to Igel file and put its path to /run.</li></ul><figure class="kg-card kg-image-card"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/02/image-3.png" class="kg-image" alt="Self healing for Igel 11.09 &amp; Imprivata PIE 7.12" loading="lazy" width="629" height="332" srcset="https://virtualizebrief.woodcloud.one/content/images/size/w600/2024/02/image-3.png 600w, https://virtualizebrief.woodcloud.one/content/images/2024/02/image-3.png 629w"></figure><ul><li>Attach the file to the Igel profile you just created: OS11 Imprivata check if bootstrap.</li></ul><h2 id="final-thoughts">Final thoughts</h2><p>Attach the new Igel profile &amp; OS 11.09 to the same folder. Then devices will upgrade to Igel OS 11.09 and PIE 7.12 automatically. In addition I&#x2019;ve attached this policy to a folder with Igel OS 11.08. The result is a successful downgrade of both OS 11.08 and PIE 7.11.</p><p>Your safe to move up or down both Igel and Imprivata versions moving devices from one folder to the other. For a sense of scale I&#x2019;ve used this against thousands of devices without a hitch.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/02/image-5.png" class="kg-image" alt="Self healing for Igel 11.09 &amp; Imprivata PIE 7.12" loading="lazy" width="952" height="760" srcset="https://virtualizebrief.woodcloud.one/content/images/size/w600/2024/02/image-5.png 600w, https://virtualizebrief.woodcloud.one/content/images/2024/02/image-5.png 952w" sizes="(min-width: 720px) 720px"><figcaption>success</figcaption></figure><h2 id="resources">Resources</h2><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Note: Links only function for those already signed into <a href="https://support.imprivata.com">https://support.imprivata.com</a></div></div><h3 id="imprivata-proveid-embedded-712">Imprivata ProveID Embedded 7.12</h3><p><a href="https://community.imprivata.com/s/article/Imprivata-ProveID-Embedded-7-12">https://community.imprivata.com/s/article/Imprivata-ProveID-Embedded-7-12</a></p><h3 id="installing-pie-712-on-igel-os-with-firmware-version-1109100-getting-errorbad-magic-number-in-mainloader">Installing PIE 7.12 on iGEL OS with firmware version 11.09.100 getting error - bad magic number in &apos;MainLoader&apos;</h3><p><a href="https://community.imprivata.com/s/article/Installing-PIE-7-12-on-iGEL-OS-with-firmware-version-11-09-100">https://community.imprivata.com/s/article/Installing-PIE-7-12-on-iGEL-OS-with-firmware-version-11-09-100</a></p>]]></content:encoded></item><item><title><![CDATA[Chrome & Edge: linking to file locations]]></title><description><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Always seeking to protect people from malware and other attacks Google and Microsoft have secured their browsers against calling file:// from https:// page.</div></div><h2 id="new-extension">New Extension</h2><p>There is a way to keep file:// calls in your websites. To the rescue is a new Chrome extension created just for this.</p><h3 id="enable-local-file-links">Enable</h3>]]></description><link>https://virtualizebrief.woodcloud.one/chrome-edge-linking-to-file-locations/</link><guid isPermaLink="false">65b8088bc2f8900001a3f074</guid><category><![CDATA[& more]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Mon, 29 Jan 2024 20:24:16 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/01/html-1.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Always seeking to protect people from malware and other attacks Google and Microsoft have secured their browsers against calling file:// from https:// page.</div></div><h2 id="new-extension">New Extension</h2><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/html-1.png" alt="Chrome &amp; Edge: linking to file locations"><p>There is a way to keep file:// calls in your websites. To the rescue is a new Chrome extension created just for this.</p><h3 id="enable-local-file-links">Enable local file links</h3><p><a href="https://chromewebstore.google.com/detail/enable-local-file-links/nikfmfgobenbhmocjaaboihbeocackld">https://chromewebstore.google.com/detail/enable-local-file-links/nikfmfgobenbhmocjaaboihbeocackld</a></p><p>Having deployed this extension myself, when a user encounters a file:// link for the first time they will be presented with this page.</p><figure class="kg-card kg-image-card kg-width-full"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/d78fe132-8c37-41b7-9532-c49eff43d6dc_875x346.png" class="kg-image" alt="Chrome &amp; Edge: linking to file locations" loading="lazy" width="875" height="346" srcset="https://virtualizebrief.woodcloud.one/content/images/size/w600/2024/01/d78fe132-8c37-41b7-9532-c49eff43d6dc_875x346.png 600w, https://virtualizebrief.woodcloud.one/content/images/2024/01/d78fe132-8c37-41b7-9532-c49eff43d6dc_875x346.png 875w"></figure><p>From here you&#x2019;ll need to click <em>1. Open&#x2019;s link.</em></p><figure class="kg-card kg-image-card kg-width-full"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/2a9aa290-70b9-4a55-a124-3186730d7ae1_977x691.png" class="kg-image" alt="Chrome &amp; Edge: linking to file locations" loading="lazy" width="977" height="691" srcset="https://virtualizebrief.woodcloud.one/content/images/size/w600/2024/01/2a9aa290-70b9-4a55-a124-3186730d7ae1_977x691.png 600w, https://virtualizebrief.woodcloud.one/content/images/2024/01/2a9aa290-70b9-4a55-a124-3186730d7ae1_977x691.png 977w"></figure><p>Now tick: <em>Allow access to file URLs.</em></p><h2 id="final-thoughts">Final thoughts</h2><p>As things become more secure our outdated stuff ends up falling over. We get a pass this time. In the future it would be best to redesign any legacy sites to call https only. One possible way, if you don&#x2019;t want to create a full feature website, would be to enable directory browse in IIS but we&#x2019;ll save that for another time.</p><h2 id="resources">Resources</h2><ul><li><a href="https://groups.google.com/a/chromium.org/g/chromium-extensions/c/ZtCvVISQU54">https://groups.google.com/a/chromium.org/g/chromium-extensions/c/ZtCvVISQU54</a></li><li><a href="https://microsoftedge.github.io/edgevr/posts/deep-dive-into-site-isolation-part-2/#local-file-disclosure">https://microsoftedge.github.io/edgevr/posts/deep-dive-into-site-isolation-part-2/#local-file-disclosure</a></li></ul><p></p>]]></content:encoded></item><item><title><![CDATA[Citrix & a three data center layout for disaster recovery]]></title><description><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><em>Road map for incorporating two on premise data centers with a third data center off site and metered.</em></div></div><h2 id="mission-statement">Mission statement</h2><p>Rely on scaling a third data center automatically if and when data center one and two become unavailable.</p><h2 id="citrix-gslb">Citrix GSLB</h2><p>Load balancing citrix.company.com across three data centers</p>]]></description><link>https://virtualizebrief.woodcloud.one/citrix-a-three-data-center-layout-for-disaster-recovery/</link><guid isPermaLink="false">65ae868bc2f8900001a3ef03</guid><category><![CDATA[Citrix]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Mon, 22 Jan 2024 16:22:00 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/01/datacenter3.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><em>Road map for incorporating two on premise data centers with a third data center off site and metered.</em></div></div><h2 id="mission-statement">Mission statement</h2><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/datacenter3.png" alt="Citrix &amp; a three data center layout for disaster recovery"><p>Rely on scaling a third data center automatically if and when data center one and two become unavailable.</p><h2 id="citrix-gslb">Citrix GSLB</h2><p>Load balancing citrix.company.com across three data centers hosting their own gateways and internal Storefront urls. Each Storefront internal url is of the set of servers physically located in that data center.</p><figure class="kg-card kg-image-card"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/datacenter3-1.png" class="kg-image" alt="Citrix &amp; a three data center layout for disaster recovery" loading="lazy" width="521" height="166"></figure><h2 id="storefront-servers-set">StoreFront servers set</h2><p>A single group across the three data centers.</p><figure class="kg-card kg-image-card"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/datacenter3-2.png" class="kg-image" alt="Citrix &amp; a three data center layout for disaster recovery" loading="lazy" width="518" height="103"></figure><h2 id="storefront-store">Storefront store</h2><p>A core functionality of StoreFront is the ability to aggregate and de-duplicate common application and desktop resources from multiple Citrix Virtual Apps and Desktops (CVAD) Sites. This functionality is commonly referred to as multi-site aggregation.</p><p>Single store will provide all apps and desktops across the three data centers. The store will have two Citrix sites using site aggregation. Site one will have priority over site two.</p><figure class="kg-card kg-image-card"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/datacenter3-3.png" class="kg-image" alt="Citrix &amp; a three data center layout for disaster recovery" loading="lazy" width="254" height="98"></figure><h3 id="site-two">Site: two</h3><p>With this site having con&apos;s across all three data centers the site will be available at all times. Yet its applications and desktops will only be available, primarily, if site one becomes unavailable. Once the Storefront store checks against site one and two, if one is not found and all of two&apos;s apps and desktops will be available.</p><p>As users take up connections on vda&apos;s in site two other settings will providing for producing additional vda&apos;s to maintain a good user experience in real time. These features include but are not limited to Citrix: Autoscaling.</p><p><a href="https://docs.citrix.com/en-us/citrix-daas/manage-deployment/autoscale.html">https://docs.citrix.com/en-us/citrix-daas/manage-deployment/autoscale.html</a></p><h3 id="continuous-confirmation-data-center-three-is-operating">Continuous confirmation data center three is operating</h3><p>By having con&apos;s in all three data centers we can have daily users working out of data center three vda&apos;s to understand and know with confidence data center three is fully functioning. This can be accomplished a number of ways. For example AD Group: DataCenter3Users. A small group of people can be added to this AD Group, which explicitly blocks access to App1 from site one. The result being they see App1 on site two.</p><figure class="kg-card kg-image-card"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/datacenter3-4.png" class="kg-image" alt="Citrix &amp; a three data center layout for disaster recovery" loading="lazy" width="731" height="149" srcset="https://virtualizebrief.woodcloud.one/content/images/size/w600/2024/01/datacenter3-4.png 600w, https://virtualizebrief.woodcloud.one/content/images/2024/01/datacenter3-4.png 731w" sizes="(min-width: 720px) 720px"></figure><h2 id="example-one-business-as-usual">Example one: business as usual</h2><p>In this example all three data centers are healthy and available. Users sign in citrix.company.com and launches application: hyperspace. Results are application is launched from site one, through vda in data center one or two.</p><h3 id="business-as-usual">Business as usual</h3><p>User is not presented with hyperspace from site two since site one is available. User has no possible way to reach site two&apos;s hyperspace application while site one is functioning.</p><figure class="kg-card kg-image-card"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/datacenter3-5.png" class="kg-image" alt="Citrix &amp; a three data center layout for disaster recovery" loading="lazy" width="326" height="162"></figure><h2 id="example-two-data-center-one-and-two-are-unavailable">Example two: data center one and two are unavailable</h2><p>In this example data centers one and two have become unhealthy and unavailable. Users sign in citrix.company.com and launches application: hyperspace. Results are application is launched from site two, through vda in data center three.</p><h3 id="disaster-recovery-fail">Disaster recovery fail</h3><p>User is not presented with hyperspace from site one since site one is unavailable. User has no possible way to reach site one&apos;s hyperspace application while site one is not functioning.</p><p>Through automatic scaling additional vda&apos;s will come online as needed to provide capacity for all users.</p><figure class="kg-card kg-image-card"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/datacenter3-6.png" class="kg-image" alt="Citrix &amp; a three data center layout for disaster recovery" loading="lazy" width="329" height="163"></figure><h2 id="final-thoughts">Final thoughts</h2><p>As with anything there are more than one way to accomplish a mission. Understanding the what and why is going to be key. In this example we have accomplished providing a 3rd data center as a disaster recovery site, which we can confirm functions daily and have a high degree of confidence during a disaster we can recover.</p>]]></content:encoded></item><item><title><![CDATA[Citrix Powertools Get-MachineCatalog-VM-Snapshot]]></title><description><![CDATA[<h2 id="powertools">Powertools</h2><p>Its time to begin the Citrix Powertools series. A set of Powershell based scripts to simplify managing a Citrix site and unlocking its hidden features.</p><h2 id="get-machinecatalog-vm-snapshot">Get-MachineCatalog-VM-Snapshot</h2><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As with most Powertools this does assume you have a location of C:\Support available.</div></div><p>Today we&#x2019;ll give a look</p>]]></description><link>https://virtualizebrief.woodcloud.one/citrix-powertools-get-machinecatalog-vm-snapshot/</link><guid isPermaLink="false">65ae85c5c2f8900001a3eee3</guid><category><![CDATA[Citrix]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Tue, 14 Nov 2023 15:14:00 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/01/powertools.png" medium="image"/><content:encoded><![CDATA[<h2 id="powertools">Powertools</h2><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/powertools.png" alt="Citrix Powertools Get-MachineCatalog-VM-Snapshot"><p>Its time to begin the Citrix Powertools series. A set of Powershell based scripts to simplify managing a Citrix site and unlocking its hidden features.</p><h2 id="get-machinecatalog-vm-snapshot">Get-MachineCatalog-VM-Snapshot</h2><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">As with most Powertools this does assume you have a location of C:\Support available.</div></div><p>Today we&#x2019;ll give a look at Get-MachineCatalog-VM-Snapshot.</p><figure class="kg-card kg-image-card"><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/powertools1.png" class="kg-image" alt="Citrix Powertools Get-MachineCatalog-VM-Snapshot" loading="lazy" width="1066" height="372" srcset="https://virtualizebrief.woodcloud.one/content/images/size/w600/2024/01/powertools1.png 600w, https://virtualizebrief.woodcloud.one/content/images/size/w1000/2024/01/powertools1.png 1000w, https://virtualizebrief.woodcloud.one/content/images/2024/01/powertools1.png 1066w" sizes="(min-width: 720px) 720px"></figure><p>A picture is worth a thousand words. Here you can see you&#x2019;ll enter a delivery controller name and the results will show all of your Machine Catalogs that use MCS, the VM name and the snapshot in use.</p><h2 id="powershell-code">Powershell code</h2><pre><code class="language-powershell">#------intro-----

Clear-Host
Write-Host &quot;------- &quot; -NoNewLine
Write-Host &quot;Citrix PowerTools&quot; -NoNewLine
Write-Host &quot; -------&quot;
Write-Host &quot;&quot;
Write-Host &quot;Get Machine Catalog &gt; VM &gt; Snapshot&quot; -ForegroundColor Yellow
$site = Read-Host &quot;Enter delivery controller for site&quot;


#------do thing-----

Add-PsSnapin Citrix*
Get-ProvScheme -AdminAddress $site | select ProvisioningSchemeName,@{n=&apos;MasterVM&apos;;e={$_.MasterImageVM -replace &apos;XDHyp:\\HostingUnits\\[^\\]+\\([^\\]+)\.vm\\.*$&apos; , &apos;$1&apos; }},@{n=&apos;Snapshot&apos;;e={$_.MasterImageVM -replace &apos;^.*\\([^\\]+)\.snapshot$&apos; , &apos;$1&apos; }} | Format-Table -AutoSize | Out-File C:\Support\Report.txt -Force
$Report = Get-Content &quot;C:\Support\Report.txt&quot;
$Report2 = $Report.replace(&apos;ProvisioningSchemeName&apos;,&apos;Machine Catalog&apos;).replace(&quot;MasterVM&quot;,&quot;`tvSphere VM&quot;)
$siteName = (Get-BrokerSite -AdminAddress $site).name 


#------results-----

Clear-Host
Write-Host &quot;------- &quot; -NoNewLine
Write-Host &quot;Citrix PowerTools&quot; -NoNewLine
Write-Host &quot; -------&quot;
Write-Host &quot;&quot;
Write-Host &quot;Results for site: $siteName&quot; -ForegroundColor cyan
Write-Host &quot;Delivery controller checked: $site&quot; -ForegroundColor yellow
$Report2
pause</code></pre><p>Lets see how many tools we can put together.</p>]]></content:encoded></item><item><title><![CDATA[Google Cloud Architect & Engineer Certified]]></title><description><![CDATA[<p>Picked these up in the last month. Google Cloud making some big moves.</p><div class="kg-card kg-button-card kg-align-left"><a href="https://google.accredible.com/profile/virtualizebrief/wallet" class="kg-btn kg-btn-accent">Google Certs for Michael Wood</a></div>]]></description><link>https://virtualizebrief.woodcloud.one/google-cloud-architect-engineer-certified/</link><guid isPermaLink="false">65ae95a1c2f8900001a3f022</guid><category><![CDATA[& more]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Tue, 31 Oct 2023 15:21:00 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/01/googlecerts.png" medium="image"/><content:encoded><![CDATA[<img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/googlecerts.png" alt="Google Cloud Architect &amp; Engineer Certified"><p>Picked these up in the last month. Google Cloud making some big moves.</p><div class="kg-card kg-button-card kg-align-left"><a href="https://google.accredible.com/profile/virtualizebrief/wallet" class="kg-btn kg-btn-accent">Google Certs for Michael Wood</a></div>]]></content:encoded></item><item><title><![CDATA[Custom Igel iso to automate imaging devices with feature selection]]></title><description><![CDATA[<h2 id="the-reason">The reason</h2><p>If you run thin clients that have hard drives on the small side under 4gb or even under 2gb you can still convert them to Igel. I recently ran across this at a place that had around 5,000 Dell Wyse 5010&#x2019;s with 2gb hard drives.</p>]]></description><link>https://virtualizebrief.woodcloud.one/custom-igel-iso-to-automate-imaging-devices-with-feature-selection/</link><guid isPermaLink="false">65ae92a3c2f8900001a3efa6</guid><category><![CDATA[Igel]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Fri, 15 Sep 2023 15:10:00 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/01/cd.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="the-reason">The reason</h2><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/cd.jpg" alt="Custom Igel iso to automate imaging devices with feature selection"><p>If you run thin clients that have hard drives on the small side under 4gb or even under 2gb you can still convert them to Igel. I recently ran across this at a place that had around 5,000 Dell Wyse 5010&#x2019;s with 2gb hard drives.</p><p>I was able to customize the image taking it down to its most basic features including Imprivata and Citrix Workspace app. This enabled the creation of an Igel USB stick that would take up under 1.5gb.</p><h2 id="unattended-installer">Unattended installer</h2><p>In addition this iso will run unattended. If you boot from this iso it will erase and reload the device without hesitation. You have been warned! This makes for a great pxe boot to image for mass converting Igel devices. Or good for Desktop Support to image devices without needing to learn the choices to make: keep it simple.</p><h2 id="things-to-consider">Things to consider</h2><p>In the Igel Management Console you may want to setup a folder and policy to move all devices found with 2gb drives. Create a policy that removes all features save for the bare minimum you need.</p><p>A special thank you goes out to the GitHub community, especially this post that made gathering this information possible.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/IGEL-Community/IGEL-Custom-Partitions"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - IGEL-Community/IGEL-Custom-Partitions: IGEL OS is built on a highly secure Linux distribution. Properly deployed, IGEL OS is locked down to the configurations and applications defined via UMS Profiles. The Custom Partitions feature allows you to implement custom scripts, apps, or other files to one or a group of devices running the IGEL OS.</div><div class="kg-bookmark-description">IGEL OS is built on a highly secure Linux distribution. Properly deployed, IGEL OS is locked down to the configurations and applications defined via UMS Profiles. The Custom Partitions feature allo...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Custom Igel iso to automate imaging devices with feature selection"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">IGEL-Community</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/bd3dd5f56c5f1cd52456054bee2336f9377a9853afa9503ead0aebcac5e9a661/IGEL-Community/IGEL-Custom-Partitions" alt="Custom Igel iso to automate imaging devices with feature selection"></div></a></figure><p>You&#x2019;ll find the goods below and with that have a great rest of your day.</p><!--kg-card-begin: markdown--><blockquote>
<p>Best Regards<br>
Michael Wood</p>
</blockquote>
<!--kg-card-end: markdown--><hr><h2 id="bash-file">Bash file</h2><p>option name: build-igel-iso-1gb.sh </p><pre><code class="language-bash">#!/bin/bash
#set -x
#trap read debug

# Creating an silent install ISO image
## Development machine (Ubuntu 18.04)
# Obtain latest IGEL OS ISO Image
#https://www.igel.com/software-downloads/workspace-edition/
if ! compgen -G &quot;$HOME/Downloads/OSC_*.zip&quot; &gt; /dev/null; then
  echo &quot;***********&quot;
  echo &quot;Obtain latest IGEL OS OSC zip file, save into $HOME/Downloads and re-run this script &quot;
  echo &quot;#https://www.igel.com/software-downloads/workspace-edition/&quot;
  echo &quot;***********&quot;
  exit 1
fi

ISO_VER=`basename ~/Downloads/OSC_*.zip | cut -b 5-13`
ISO_IMAGE_NAME=&quot;OSC_${ISO_VER}.unattended.iso&quot;

sudo apt install unzip -y
sudo apt install syslinux-utils -y
sudo apt install genisoimage -y

mkdir build_tar
cd build_tar

mkdir custom
cd custom
unzip $HOME/Downloads/OSC_*.zip

mkdir osciso
sudo mount -oloop preparestick/osc*.iso osciso

sudo mkdir newiso
sudo cp -a osciso/./ newiso

sudo umount osciso
rm -rf preparestick

read -p &quot;Make manual changes then press enter to proceed.&quot;

sudo sed -i -e &quot;s/timeout=30/timeout=10/&quot; newiso/boot/grub/igel.conf
sudo sed -i -e &quot;s/default=0/default=1/&quot; newiso/boot/grub/igel.conf
sudo sed -i -e &quot;s/Verbose Installation + Recovery/Installation (Unattended)/&quot; newiso/boot/grub/igel.conf
sudo sed -i -e &quot;s/bzImage igel_syslog=verbose/bzImage quiet osc_unattended=true igel_syslog=quiet/&quot; newiso/boot/grub/igel.conf
#sudo sed -i -e &apos;/Failsafe Installation/i menuentry &quot;Shutdown&quot; { halt }&apos; newiso/boot/grub/igel.conf

cd newiso

#W/O EFI
#sudo genisoimage -r -U -V &apos;IGEL_OSC_TO&apos; \
  #-o ../../../${ISO_IMAGE_NAME} \
  #-c boot/isolinux/boot.cat -b boot/isolinux/isolinux.bin \
  #-no-emul-boot -boot-load-size 4 -boot-info-table \
  #-no-emul-boot .
#sudo isohybrid ../../../${ISO_IMAGE_NAME}

#W EFI
sudo genisoimage -r -U -V &apos;IGEL_OSC_TO&apos; \
  -o ../../../${ISO_IMAGE_NAME} \
  -c boot/isolinux/boot.cat -b boot/isolinux/isolinux.bin \
  -boot-load-size 4 -boot-info-table -no-emul-boot \
  -eltorito-alt-boot -e igel_efi.img -no-emul-boot .
sudo isohybrid --uefi ../../../${ISO_IMAGE_NAME}

cd ../../..
sudo rm -rf build_tar</code></pre><h2 id="how-to-create-custom-iso">How to create custom iso</h2><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><em>The below is assuming your using linux. For me I imaged a vm using Ubuntu with default settings. For those shy of linux this is a simple and great introduction.</em></div></div><p>Make sure both the files are in the download folder: build-igel-iso-2gb.sh &amp; OSC_*.iso</p><ul><li>Enter terminal prompt</li><li>Run: cd Downloads</li><li>Run: ./build-igel-iso-2gb.sh</li><li>Enter root password</li></ul><p>This will pause after extracting the iso with a message: Make manual changes then press enter to proceed. While this is paused and still open, launch a second terminal and do the following.</p><ul><li>Run: sudo chown -R ctxadmin: ./Downloads/build_tar/custom/newiso</li><li>exit this terminal</li></ul><p>Open explorer and edit the file: /Downloads/build_tar/custom/newiso/images/linux/lxos/lxos.inf.</p><ul><li>Add the line under [INFO]: custom=&quot;true&quot;</li><li>Delete the [PART] section of each you want to exclude, but do this only if the section has the line: dispensable=&quot;true&quot;</li><li>Save lxos.inf</li></ul><p>Return to the first terminal that is pause and hit: enter. The iso file will be constructed in the /Downloads folder named something like: OSC_11.07.170.unattended.iso</p><h2 id="conclusion">Conclusion</h2><p>You can now create a USB stick, use pxe, boot a VM or any other way you can think of using an iso to image a device.</p>]]></content:encoded></item><item><title><![CDATA[FSLogix and home share for personal disk]]></title><description><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><em>When I use %Homeshare% environment variable as the path to the VHD file, I get a failure in the logs: Error 1064, Unable to find parent path of &quot;&quot;</em></div></div><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://social.msdn.microsoft.com/Forums/en-US/610501a5-cc9e-4e8b-99d5-6c82cd743946/homeshare-environment-variable-not-compatible-with-fslogix?forum=FSLogix"><div class="kg-bookmark-content"><div class="kg-bookmark-title">HOMESHARE environment variable not compatible with FSLogix?</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i1.social.s-msft.com/Forums/GlobalResources/images/Msdn/favicon.ico" alt><span class="kg-bookmark-author">Microsoft Logo</span><span class="kg-bookmark-publisher">Micah AdamsonMicrosoft contingent staff</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i1.social.s-msft.com/globalresources/Images/trans.gif?cver=0001" alt></div></a></figure><h2 id="setup">Setup</h2><p>FSLogix is great from managing</p>]]></description><link>https://virtualizebrief.woodcloud.one/fslogix-and-home-share-for-personal-disk/</link><guid isPermaLink="false">65ae9439c2f8900001a3eff0</guid><category><![CDATA[& more]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Tue, 11 Jul 2023 15:17:00 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/01/fslogix.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><em>When I use %Homeshare% environment variable as the path to the VHD file, I get a failure in the logs: Error 1064, Unable to find parent path of &quot;&quot;</em></div></div><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://social.msdn.microsoft.com/Forums/en-US/610501a5-cc9e-4e8b-99d5-6c82cd743946/homeshare-environment-variable-not-compatible-with-fslogix?forum=FSLogix"><div class="kg-bookmark-content"><div class="kg-bookmark-title">HOMESHARE environment variable not compatible with FSLogix?</div><div class="kg-bookmark-description"></div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i1.social.s-msft.com/Forums/GlobalResources/images/Msdn/favicon.ico" alt="FSLogix and home share for personal disk"><span class="kg-bookmark-author">Microsoft Logo</span><span class="kg-bookmark-publisher">Micah AdamsonMicrosoft contingent staff</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i1.social.s-msft.com/globalresources/Images/trans.gif?cver=0001" alt="FSLogix and home share for personal disk"></div></a></figure><h2 id="setup">Setup</h2><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/fslogix.png" alt="FSLogix and home share for personal disk"><p>FSLogix is great from managing user profiles and settings when publishing a Citrix or Horizon virtual desktop. In the past I&#x2019;ve setup vSANs with specific unc paths to call out and store personal disks.</p><p>Recently when working with a client they asked if the users home share could be used as the location to store these personal disks. They had multiple domains and somewhere around seven or eight different home share paths.</p><h2 id="home-share-variable-doesn%E2%80%99t-work">Home share variable doesn&#x2019;t work</h2><p>Now as the quote above suggest this can not be done. Yes, this person is right you cannot use the variable %homeshare% but you can use %username%. This will require you to know all possible root paths that home shares can be found in, which though an extra step does accomplish the desired goal.</p><h2 id="fslogix-group-policy">FSLogix group policy</h2><p>First thing to do is gather all possible home share locations:</p><pre><code class="language-text">\\domain1\pathA\%username%
\\domain1\pathB\%username%
\\domain2\pathA\%username%
\\domain2\pathB\%username%
\\domain2\pathC\%username%
\\domain3\pathA\%username%</code></pre><p>Let&#x2019;s head to the FSLogix group policy settings and put these paths into use.</p><h3 id="location">Location</h3><p>Computer Configuration &gt; Policies &gt; Administrative Templates &gt; FSLogix &gt; Profile Containers</p><h3 id="setting">Setting</h3><p>VHD Location, enter the following</p><pre><code class="language-text">\\domain1\pathA\%username%;\\domain1\pathB\%username%;\\domain2\pathA\%username%;\\domain2\pathB\%username%;\\domain2\pathC\%username%;\\domain3\pathA\%username%</code></pre><h2 id="conclusion">Conclusion</h2><p>You can have your cake and eat it to. No new storage solution or location be needed. Users will continue to store all of their personal information, now including their personal disk, in their home share.</p><p>This will simplify end user support and provide for a great virtual desktop experience with user settings following them and not missing a beat.</p>]]></content:encoded></item><item><title><![CDATA[Igel and idle reboot after 4 hours]]></title><description><![CDATA[<h2 id="rolling-out-updates">Rolling out updates</h2><p>I&#x2019;ve given this a good amount of thought. I have come to conclude if Igel thin clients reboot after 4 hours of not being in use they will then check in with the Igel UMS management server and apply updates. No one gets kicked, updates</p>]]></description><link>https://virtualizebrief.woodcloud.one/igel-and-idle-reboot-after-4-hours/</link><guid isPermaLink="false">65ac06e2c2f8900001a3ec9b</guid><category><![CDATA[Igel]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Wed, 07 Jun 2023 16:47:00 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/02/reboot.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="rolling-out-updates">Rolling out updates</h2><img src="https://virtualizebrief.woodcloud.one/content/images/2024/02/reboot.jpg" alt="Igel and idle reboot after 4 hours"><p>I&#x2019;ve given this a good amount of thought. I have come to conclude if Igel thin clients reboot after 4 hours of not being in use they will then check in with the Igel UMS management server and apply updates. No one gets kicked, updates gradually roll out and everything is natural.</p><h2 id="how-to-know-an-igel-computer-is-not-in-use">How to know an Igel computer is not in use</h2><p>Were I live we use Igel for connecting to both VMware Horizon and Citrix Workspace provided virtual desktops and virtual applications.</p><p>Knowing this let use identify what process is running when the Horizon client or Workspace app is doing its thing. Come to find out these two process are:</p><ul><li>wfica_orig</li><li>vmware-remotemk</li></ul><p>With this knowledge lets construct a profile to check if either one of these processes are running and if yes then do nothing. If no to either one then mark it down until the time reaches 4 hours or 240 minutes. Then reboot.</p><h2 id="creating-an-igel-profile">Creating an Igel profile</h2><p>Here&#x2019;s how to go about putting together the profile in the Igel UMS console.</p><ol><li>Right click Profiles and select: New Profile</li><li>Give it a name like: <em>Citrix Workspace or VMware Horizon no connect 4 hours reboot</em></li><li>Head over to: System &gt; Firmware Customization &gt; Custom Commands &gt; Desktop</li><li>Enable: Before Desktop Start and enter the following code:</li></ol><pre><code>#!/bin/bash
for (( ; ; ))
do

sleep 120
RUNNING=$(pgrep -u user &quot;wfica_orig|vmware-remotemk&quot;)

if [ $RUNNING -gt 0 ]
then
	echo $(date +&quot;%Y%m%d_%T&quot;)\n &gt;&gt; /run/WorkspaceOrHorizon_Yes.log
	rm ./run/WorkspaceOrHorizon_No.log
else
	echo $(date +&quot;%Y%m%d_%T&quot;)\n &gt;&gt; /run/WorkspaceOrHorizon_No.log
fi

TIME=$(wc -l &lt; /run/WorkspaceOrHorizon_No.log)
if [ $TIME = 120 ]; then reboot ; else echo $TIME ;fi

done &amp;
#EOF</code></pre><p>Click: Save</p><h2 id="assigning-the-new-profile">Assigning the new profile</h2><p>Now go ahead and attach this profile to a folder where the devices live that connect to VMware Horizon or Citrix Workspace provided things. Remember that the new profile needs to apply and won&#x2019;t take effect until you ironically reboot.</p><p>Keep in mind on my end I also work with Igel computers that are using the Igel Desktop experience and not connecting to either VMware Horizon or Citrix Workspace provided things. Some run Firefox and display full screen for kiosk stations in lobbies. In this case we do not want to apply this new profile to these Igel devices as the result would be a reboot every 4 hours without end.</p><h2 id="check-the-results-live">Check the results live</h2><p><em>You can connect to an Igel device running the profile to see what is happening.</em></p><p>Based on the code above if you look in /run you&#x2019;ll find a file created called WorkspaceOrHorizon_No.log if nothing is running. Every 2 minutes this file will be updated with a time stamp. Once the total count of lines equals 120 or better put 240 minutes then a reboot command is run.</p><p>If either Horizon client or Workspace app is found running a file will be created called WorkspaceOrHorizon_Yes.log with a time stamp and the WorkspaceOrHorizon_No.log will be deleted to stop counting idle time.</p><p>Simple in what it does, great in accomplishing the desired results.</p>]]></content:encoded></item><item><title><![CDATA[Citrix Virtual Applications & Epic Hyperspace deployment]]></title><description><![CDATA[<h2 id="setup">Setup</h2><p>Citrix is the most widely trusted way to deploy Epic Hyperspace. For those not familiar Epic Hyperspace is the application frontend for the most used patient health record system in the good old United States of America.</p><p>Lets take a quick look at a good setup for being agile</p>]]></description><link>https://virtualizebrief.woodcloud.one/citrix-virtual-applications-epic-hyperspace-deployment/</link><guid isPermaLink="false">65ae83c6c2f8900001a3ee95</guid><category><![CDATA[Citrix]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Thu, 20 Apr 2023 14:10:00 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/01/hyperspace.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="setup">Setup</h2><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/hyperspace.jpg" alt="Citrix Virtual Applications &amp; Epic Hyperspace deployment"><p>Citrix is the most widely trusted way to deploy Epic Hyperspace. For those not familiar Epic Hyperspace is the application frontend for the most used patient health record system in the good old United States of America.</p><p>Lets take a quick look at a good setup for being agile and quick about getting things deployed.</p><h3 id="creating-machines">Creating machines</h3><p>Use machine creation services. The performance gains in memory, network, and disk space is noticeable over Citrix Provisioning. In addition this takes you one step closer to understanding and using Citrix Cloud.</p><!--kg-card-begin: markdown--><blockquote>
<p>When it becomes time again to refresh your design please approach the challenge with a 2022 mindset and not a 2000 mindset. So yes, these days I would advocate MCS over PVS.<br><br>
<a href="http://blog.liquidware.com/2022/04/15/is-pvs-still-the-go-to-solution-in-2022/">Andreas van Wingerden</a></p>
</blockquote>
<!--kg-card-end: markdown--><p>In this example we&#x2019;ll have 3 parent computers. It is possible to have a single parent that would have all 3 releases install together. Though this is possible and cleaner you may find trouble down the road.</p><h3 id="windows-server-vms">Windows Server VMs</h3><pre><code class="language-text">Parent-Hyperspace-May2022
&gt; Golden-Hyperspace-May2022-CP01-2022.09.01
&gt; Golden-Hyperspace-May2022-CP02-2022.09.05

Parent-Hyperspace-November2021
&gt; Golden-Hyperspace-November2021-CP09-2022.05.25
&gt; Golden-Hyperspace-November2021-CP10-2022.07.28

Parent-Hyperspace-May2021
&gt; Golden-Hyperspace-May2021-CP13-2021.11.01</code></pre><h2 id="machine-catalogs-and-delivery-groups">Machine catalogs and delivery groups</h2><p>Keep in mind using machine creation services will provide for a more Citrix Studio focused management. Creating, adding to, and deleting both machine catalogs and delivery groups will be a natural thing and not something static or stuck as they are. Making fresh and new machines is easy.</p><h2 id="delivery-group-layout">Delivery group layout</h2><p>Have a delivery group for each Hyperspace release + client pack. Having all of these resources available one can move environments around quickly.</p><pre><code class="language-text">Citrix Studio

-Delivery Group-                -Applications-
Hyperspace-May2022-CP01	        TST, ACE3, ACE4
Hyperspace-May2022-CP02	        POC, REL
Hyperspace-November2021-CP09	MST, ACE1, ACE2,
Hyperspace-November2021-CP10	PRD, SRO, SUP
Hyperspace-May2021-CP13	        HST</code></pre><h2 id="applications">Applications</h2><h3 id="move-existing-environment">Move existing environment</h3><p>Using the above example say someone would want TST to be moved to May2022-CP02. You&apos;d simple change TST&apos;s delivery group settings to Hyperspace-May2022-CP02.</p><h3 id="install-new-client-pack-and-deploy">Install new client pack and deploy</h3><p>If someone needs a new client pack installed into a hyperspace release you can:</p><ul><li>Power on parent computer</li><li>Install client pack and power off</li><li>Clone to new golden image to the desired hypervisor hosting the vda&apos;s</li><li>Create machine catalog and delivery group named after release + client pack</li><li>Move desired environment to the new delivery group</li></ul><p>I&apos;ve personally done this so many times I can&apos;t even count. The average turn around time from request to done is 30 minutes.</p><p>Once a given delivery group no longer has any Epic Hyperspace clients published off it, you can go into Citrix Studio and delete the delivery group and machine catalog. Or if you prefer keep it in place for as long as you feel comfortable, having it in your back pocket for any unforeseen rollback requests.</p><h2 id="conclusion">Conclusion</h2><p>In addition to providing a great on premise setup the above layout is more akin to how Citrix Cloud functions and organizes machines. It must be said there is a multitude of ways to structure, design and deploy Citrix Virtual Apps and Desktops resources this being one of many great ways.</p><!--kg-card-begin: markdown--><blockquote>
<p>Best Regards<br>
Michael Wood</p>
</blockquote>
<!--kg-card-end: markdown--><h3 id="references">References</h3><ul><li><a href="https://blog.liquidware.com/2022/04/15/is-pvs-still-the-go-to-solution-in-2022/">Is PVS still the go to solution in 2022?</a></li></ul>]]></content:encoded></item><item><title><![CDATA[Almost Silent Citrix 24 Hour Restart Schedule]]></title><description><![CDATA[<h3 id="reboot-every-day">Reboot Every Day</h3><p>If your team seeks to keep old tradition alive lets at least do our best to not kick people out of applications or desktops.</p><p>We can do this with a bit of a creative restart scheduling with existing resources. If needed maybe add a few extra machines</p>]]></description><link>https://virtualizebrief.woodcloud.one/almost-silent-citrix-24-hour-restart-schedule/</link><guid isPermaLink="false">65ae81ddc2f8900001a3ee52</guid><category><![CDATA[Citrix]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Tue, 28 Feb 2023 15:01:00 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/01/lawnmower.jpg" medium="image"/><content:encoded><![CDATA[<h3 id="reboot-every-day">Reboot Every Day</h3><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/lawnmower.jpg" alt="Almost Silent Citrix 24 Hour Restart Schedule"><p>If your team seeks to keep old tradition alive lets at least do our best to not kick people out of applications or desktops.</p><p>We can do this with a bit of a creative restart scheduling with existing resources. If needed maybe add a few extra machines as this will depend on your setup and 24-7 capacity use case.</p><h3 id="studio-already-has-a-restart-scheduler">Studio Already Has a Restart Scheduler</h3><p>Of course Citrix Studio has a built in scheduled restart feature for every delivery group. Just set it and forget it. You&#x2019;ll have to pick one of these two choices:</p><ul><li><em>Restart all computers at once</em>. This will cause all resources provided to be unavailable during the time until at least the first machine registers. This could take anywhere from 5-15 minutes of down time.</li><li><em>Staged restarts over time</em>. This will cause users to potentially experience back to back forced kick outs. They&#x2019;ll see your restart warning message twice. Its a bit confusing, try it yourself sometime and you&#x2019;ll see how odd it can be.</li></ul><h3 id="new-thinking-for-old-ideas">New Thinking For Old Ideas</h3><p>So you still want to restart every machine every day but you admit its a bad time for users and you don&#x2019;t want that. Enough talk lets get down to it.</p><p>Below I&#x2019;ve provided three PowerShell scripts to accomplish the following restart schedule, keep in mind this is for Windows Server OS VDAs:</p><ul><li>2:30pm. Place half of the machines in a delivery group into maintenance. These machines will continue to provide existing sessions and not new logins.</li><li>10:30pm. Send message of pending restart to users, wait 5 minutes, power off machines, wait a minute, power on machines, wait 5 minutes, turn off maintenance. Check to see if at least one machine is out of maintenance and registered, if yes, now set the other half of machines to maintenance.</li><li>6:30am. Send message of pending restart to users, wait 5 minutes, power off machines, wait a minute, power on machines, wait 5 minutes, turn off maintenance.</li></ul><p>This will achieve the least disruption with the shortest possible session that gets kicked being around 8 hours and a max session time just shy of 24 hours.</p><h3 id="bonus-for-machines-that-fail-studios-restart-schedule">Bonus For Machines That Fail Studios Restart Schedule</h3><p>As you&#x2019;ll note from below the command used to restart, reboot, shutdown, or what you&#x2019;d like to call it is actually this:</p><pre><code class="language-powershell">New-BrokerHostingPowerAction -Action TurnOff -MachineName $vdaInMaintenance</code></pre><p>I&#x2019;ve used this command rather than shutdown as I&#x2019;ve seen in some setups where machines would not gracefully shutdown. Our goal here is to make sure every machine is powered off and powered on without exception.</p><!--kg-card-begin: markdown--><blockquote>
<p>Best Regards<br>
Michael Wood</p>
</blockquote>
<!--kg-card-end: markdown--><hr><h3 id="230pm-for-task-scheduler-on-delivery-controller">2:30pm for Task Scheduler on Delivery Controller</h3><pre><code class="language-powershell">#-Your input please
$dg = &quot;MyDeliveryGroup&quot;

#-Get list of machines
$vdas = Get-BrokerDesktop -Filter {DesktopGroupName -eq $dg} | ForEach {$_.MachineName}
$count = $vdas | Measure-Object | Select-Object Count | ForEach-Object {$_.Count}
$half = $count / 2
$halfRound = [math]::Round($Half)
$vdaToMaintenances = $vdas | Select -First $halfRound

#-Put in maintenance
ForEach ($vdaToMaintenance in $vdaToMaintenances){
    Set-BrokerMachineMaintenanceMode -InputObject $vdaToMaintenance $true
}</code></pre><h3 id="1030pm-for-task-scheduler-on-delivery-controller">10:30pm for Task Scheduler on Delivery Controller</h3><pre><code class="language-powershell">#-Your input please
$dg = &quot;MyDeliveryGroup&quot;

#-Get list of machines
$vdaInMaintenances = Get-BrokerDesktop -Filter {(DesktopGroupName -eq $dg) -and (InMaintenanceMode -eq &quot;true&quot;)} | ForEach {$_.MachineName}
$vdaNotMaintenances = Get-BrokerDesktop -Filter {(DesktopGroupName -eq $dg) -and (InMaintenanceMode -eq &quot;false&quot;)} | ForEach {$_.MachineName}

#-Take machines in maintenance, sends message, power off, power on, take out of maintenance
Foreach ($vdaInMaintenance in $vdaInMaintenances) {
    Get-BrokerSession -MachineName $vdaInMaintenance | Send-BrokerSessionMessage -Title &quot;StoreFront Maintenance&quot; -MessageStyle Critical -Text &quot;In 5 minutes your Desktop will logoff. Your also free to logoff now and get a new Desktop.&quot;
}
Start-Sleep -S 300

Foreach ($vdaInMaintenance in $vdaInMaintenances) {
    New-BrokerHostingPowerAction -Action TurnOff -MachineName $vdaInMaintenance
}
Start-Sleep -S 60

Foreach ($vdaInMaintenance in $vdaInMaintenances) {
    New-BrokerHostingPowerAction -Action TurnOn -MachineName $vdaInMaintenance
}
Start-Sleep -S 300

Foreach ($vdaInMaintenance in $vdaInMaintenances) {
    Set-BrokerMachineMaintenanceMode -InputObject $vdaInMaintenance $false
}
Start-Sleep -S 60

#-Put other machines in maintenance if previous one not in maintenance and also registered.
#-If these two things are not true do not put other machines in maintenance, you investigate.
$vdaInMaintenanceOut = (Get-BrokerMachine -MachineName $vdaInMaintenance | Select-Object InMaintenanceMode | ForEach {$_.InMaintenanceMode}) -eq $False
$vdaInMaintenanceReg = (Get-BrokerMachine -MachineName $vdaInMaintenance | Select-Object RegistrationState | ForEach {$_.RegistrationState}) -eq &quot;Registered&quot;
If ($vdaInMaintenanceOut -and $vdaInMaintenanceReg) {
    Foreach ($vdaNotMaintenance in $vdaNotMaintenances) {
    Set-BrokerMachineMaintenanceMode -InputObject $vdaNotMaintenances $true
    }

}</code></pre><h3 id="630am-for-task-scheduler-on-delivery-controller">6:30am for Task Scheduler on Delivery Controller</h3><pre><code class="language-powershell">#-Your input please
$dg = &quot;MyDeliveryGroup&quot;

#-Get list of machines
$vdaInMaintenances = Get-BrokerDesktop -Filter {(DesktopGroupName -eq $dg) -and (InMaintenanceMode -eq &quot;true&quot;)} | ForEach {$_.MachineName}

#-Take machines in maintenance, sends message, power off, power on, take out of maintenance
Foreach ($vdaInMaintenance in $vdaInMaintenances) {
    Get-BrokerSession -MachineName $vdaInMaintenance | Send-BrokerSessionMessage -Title &quot;StoreFront Maintenance&quot; -MessageStyle Critical -Text &quot;In 5 minutes your Desktop will logoff. Your also free to logoff now and get a new Desktop.&quot;
}
Start-Sleep -S 300

Foreach ($vdaInMaintenance in $vdaInMaintenances) {
    New-BrokerHostingPowerAction -Action TurnOff -MachineName $vdaInMaintenance
}
Start-Sleep -S 60

Foreach ($vdaInMaintenance in $vdaInMaintenances) {
    New-BrokerHostingPowerAction -Action TurnOn -MachineName $vdaInMaintenance
}
Start-Sleep -S 300

Foreach ($vdaInMaintenance in $vdaInMaintenances) {
    Set-BrokerMachineMaintenanceMode -InputObject $vdaInMaintenance $false
}</code></pre>]]></content:encoded></item><item><title><![CDATA[Chocolatey Repack Utility]]></title><description><![CDATA[<h2 id="chocolatey-is-great">Chocolatey is Great</h2><p>On a side note before we start I&#x2019;d recommend Chocolatey as an application delivery packaging system to anyone. Far more friendly and easy to use both on the frontend and backend than any other tool I&#x2019;ve used including SCCM, Symantec Altiris, AppV, AppStack,</p>]]></description><link>https://virtualizebrief.woodcloud.one/chocolatey-repack-utility/</link><guid isPermaLink="false">65ae93cbc2f8900001a3efd6</guid><category><![CDATA[& more]]></category><dc:creator><![CDATA[Michael Wood]]></dc:creator><pubDate>Wed, 15 Feb 2023 16:13:00 GMT</pubDate><media:content url="https://virtualizebrief.woodcloud.one/content/images/2024/01/choco.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="chocolatey-is-great">Chocolatey is Great</h2><img src="https://virtualizebrief.woodcloud.one/content/images/2024/01/choco.jpg" alt="Chocolatey Repack Utility"><p>On a side note before we start I&#x2019;d recommend Chocolatey as an application delivery packaging system to anyone. Far more friendly and easy to use both on the frontend and backend than any other tool I&#x2019;ve used including SCCM, Symantec Altiris, AppV, AppStack, etc.</p><p>Now to the task at hand: You&#x2019;ve updated a Chocolatey package from its source folder and want to repack it. Lets do that with some PowerShell script.</p><h2 id="what-do-you-need-from-me">What Do You Need From Me?</h2><ul><li>Make sure to put the proper path in the script by replacing unc with your own.</li><li>Confirm your package works</li><li>If not rinse and repeat. Update the source, repack, retry, until good.</li></ul><p>There is a few more tips to give on Chocolatey. Just to drop one I have setup a User &amp; System ran login script, both that run at user login, to drop in choco lines to correct or add new software on the fly. In short instantly deploying a new piece of software across 7,000 VM&#x2019;s. Many cool things can be done with Chocolatey if you think creatively.</p><!--kg-card-begin: markdown--><blockquote>
<p>Best Regards<br>
Michael Wood</p>
</blockquote>
<!--kg-card-end: markdown--><hr><pre><code class="language-powershell">#------The setup------------

Clear-Host
Write-Host &quot;&quot;
Write-Host &quot; Chocolatey Repackage Utility&quot; -ForegroundColor Cyan
Write-Host &quot;============================================&quot;
Write-Host &quot;&quot;
Write-Host &quot; Why? To repackage an existing Chocolatey&quot; -ForegroundColor Yellow
Write-Host &quot; Package quick like.&quot; -ForegroundColor Yellow
Write-Host &quot;&quot;
Write-Host &quot; This only works for packages already made!&quot; -Foreground Red
Write-Host &quot;============================================&quot;

    $PackMe = Read-Host -Prompt &apos; Repack Name (ie, pdfsambasic)&apos;

Write-Host &quot;&quot;
Write-Host &quot;&quot;


#-------Do the work---------

Write-Host &quot; Results...&quot; -Foreground Cyan
Write-Host &quot;============================================&quot;

    Choco Pack \\unc\Source\$PackMe\$PackMe.nuspec
    $NewPackage = Get-ChildItem -Path &quot;.&quot; -Filter $PackMe*.nupkg | ForEach {$_.Name}
    $Overwrite = Test-Path -LiteralPath &quot;\\unc\Packages\$NewPackage&quot;
    
    If ($Overwrite){
    Write-Host &quot;File already exist named $PackMe.nupkg. You&apos;ll be prompted if you&apos;d like to overwrite.&quot; -ForegroundColor Yellow
    Move-Item .\$NewPackage -Destination \\unc\Packages -Confirm -Force}

    Else {
    Move-Item .\$NewPackage -Destination &quot;\\unc\Packages&quot;
    Write-Host &quot;$NewPackage now available in \\unc\Packages&quot; -Foreground Yellow}

    Start-Process &quot;\\unc\Packages&quot;

Write-Host &quot;============================================&quot;
Write-Host &quot;&quot;
Write-Host &quot;&quot;
Write-Host &quot; Done! Good-bye.&quot; -ForegroundColor Green 
Pause</code></pre>]]></content:encoded></item></channel></rss>