<?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[Roger Zander]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://rzander.azurewebsites.net/</link><image><url>https://rzander.azurewebsites.net/favicon.png</url><title>Roger Zander</title><link>https://rzander.azurewebsites.net/</link></image><generator>Ghost 4.36</generator><lastBuildDate>Wed, 08 Apr 2026 22:44:29 GMT</lastBuildDate><atom:link href="https://rzander.azurewebsites.net/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Fix: We couldn’t update system reserved partition]]></title><description><![CDATA[<p>If you encounter the &quot;We couldn&#x2019;t update system reserved partition&quot; error while trying to update Windows 11 to version 24H2, you can try the following PowerShell fix. </p><p>This solution is based on guidance from the Microsoft Support article titled <a href="https://support.microsoft.com/en-us/topic/-we-couldn-t-update-system-reserved-partition-error-installing-windows-10-46865f3f-37bb-4c51-c69f-07271b6672ac">&quot;We couldn&#x2019;t update system</a></p>]]></description><link>https://rzander.azurewebsites.net/fix-we-couldnt-update-system-reserved-partition/</link><guid isPermaLink="false">679a2a10ba5cbf379448e0a2</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Wed, 29 Jan 2025 13:46:26 GMT</pubDate><media:content url="https://rzander.azurewebsites.net/content/images/2025/01/Unbenannt.png" medium="image"/><content:encoded><![CDATA[<img src="https://rzander.azurewebsites.net/content/images/2025/01/Unbenannt.png" alt="Fix: We couldn&#x2019;t update system reserved partition"><p>If you encounter the &quot;We couldn&#x2019;t update system reserved partition&quot; error while trying to update Windows 11 to version 24H2, you can try the following PowerShell fix. </p><p>This solution is based on guidance from the Microsoft Support article titled <a href="https://support.microsoft.com/en-us/topic/-we-couldn-t-update-system-reserved-partition-error-installing-windows-10-46865f3f-37bb-4c51-c69f-07271b6672ac">&quot;We couldn&#x2019;t update system reserved partition&quot; error when installing Windows 10.</a></p><!--kg-card-begin: markdown--><pre><code class="language-PowerShell">$Volume = (Get-Volume -FriendlyName SYSTEM -ea SilentlyContinue).Path
if ($Volume) {
    Get-ChildItem -literalpath &quot;$($Volume)EFI\Microsoft\Boot\Fonts\&quot; -File *.ttf | remove-item -force
    Get-Item -literalpath &quot;$($Volume)EFI\HP\&quot; | remove-item -force -recurse
}
</code></pre>
<!--kg-card-end: markdown--><p><strong>Warning:</strong> Proceed at your own risk!</p><p>The script retrieves the &quot;Volume GUID Path&quot; of the &quot;SYSTEM&quot; partition and deletes all .ttf font files from the EFI\Microsoft\Boot\Fonts\ directory.</p>]]></content:encoded></item><item><title><![CDATA[Change Lenovo BIOS Passwords with PowerShell 7.x]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>In PowerShell 7.x, the <code>Get-WmiObject</code> Cmdlet is no longer available. To achieve similar functionality, you&apos;ll need to utilize the <code>Get-CimInstance</code> Cmdlet instead.</p>
<p>Example Script:</p>
<pre><code class="language-PowerShell">$oldpw = &quot;old123&quot;
$newpw = &quot;new123&quot;
Get-CimInstance -Namespace root/WMI -ClassName Lenovo_WmiOpcodeInterface | Invoke-CimMethod -MethodName WmiOpcodeInterface -Arguments @{Parameter = &quot;WmiOpcodePasswordType:pap&</code></pre>]]></description><link>https://rzander.azurewebsites.net/change-lenovo-bios-pw-with-powershell-7-x/</link><guid isPermaLink="false">659d6205312f7a2ce0911c80</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Tue, 09 Jan 2024 15:23:03 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>In PowerShell 7.x, the <code>Get-WmiObject</code> Cmdlet is no longer available. To achieve similar functionality, you&apos;ll need to utilize the <code>Get-CimInstance</code> Cmdlet instead.</p>
<p>Example Script:</p>
<pre><code class="language-PowerShell">$oldpw = &quot;old123&quot;
$newpw = &quot;new123&quot;
Get-CimInstance -Namespace root/WMI -ClassName Lenovo_WmiOpcodeInterface | Invoke-CimMethod -MethodName WmiOpcodeInterface -Arguments @{Parameter = &quot;WmiOpcodePasswordType:pap&quot; } | Out-Null

Get-CimInstance -Namespace root/WMI -ClassName Lenovo_WmiOpcodeInterface | Invoke-CimMethod -MethodName WmiOpcodeInterface -Arguments @{Parameter = &quot;WmiOpcodePasswordCurrent01:$($oldpw)&quot; } | Out-Null

Get-CimInstance -Namespace root/WMI -ClassName Lenovo_WmiOpcodeInterface | Invoke-CimMethod -MethodName WmiOpcodeInterface -Arguments @{Parameter = &quot;WmiOpcodePasswordNew01:$($newpw)&quot; } | Out-Null

$Status = Get-CimInstance -Namespace root/WMI -ClassName Lenovo_WmiOpcodeInterface | Invoke-CimMethod -MethodName WmiOpcodeInterface -Arguments @{Parameter = &quot;WmiOpcodePasswordSetUpdate&quot; }

if ($Status.Return -eq &quot;Success&quot;) {
    &quot;Password changed!&quot;
} else {
    &quot;Password change failed!&quot;
}
</code></pre>
<p>This PowerShell script is used to change the password on a Lenovo device using the Windows Management Instrumentation (WMI) interface.</p>
<p>The script starts by defining two variables, $oldpw and $newpw, which store the old and new passwords respectively.</p>
<p>Next, the script uses the Get-CimInstance cmdlet to retrieve a WMI object representing the Lenovo device. The -Namespace parameter specifies the WMI namespace to use (root/WMI), and the -ClassName parameter specifies the WMI class to use (Lenovo_WmiOpcodeInterface).</p>
<p>The Invoke-CimMethod cmdlet is then used to call the WmiOpcodeInterface method on the retrieved WMI object. This method is called three times, each with different arguments, to perform the password change operation. The -Arguments parameter is used to pass a hashtable of arguments to the method. The Out-Null cmdlet is used to suppress the output of these commands.</p>
<p>The first call to WmiOpcodeInterface sets the password type to pap. The second call provides the current password, and the third call provides the new password.</p>
<p>After the password change operation is initiated, the script retrieves the status of the operation by calling WmiOpcodeInterface again with the WmiOpcodePasswordSetUpdate parameter. The returned status is stored in the $Status variable.</p>
<p>Finally, the script checks the Return property of the $Status object. If it equals &quot;Success&quot;, the script outputs &quot;Password changed!&quot;. Otherwise, it outputs &quot;Password change failed!&quot;. This provides a simple way to verify whether the password change operation was successful.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[RuckZuck Figures 2022]]></title><description><![CDATA[<p>the progress of RuckZuck.tools in 2022...</p><h1 id="repository">Repository</h1><p>There where 2<strong>&apos;440</strong> Packages created or updated in 2022, which is an average of <strong>6.7</strong> Packages per day.<br>There is a total of <strong>617</strong> Products in the Repository and <strong>10&apos;634</strong> Packages in different versions.</p><h1 id="usage">Usage</h1><p><strong>2&apos;</strong></p>]]></description><link>https://rzander.azurewebsites.net/ruckzuck-figures-2022/</link><guid isPermaLink="false">64034b0c965180127c06aed7</guid><category><![CDATA[RuckZuck]]></category><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Sat, 04 Mar 2023 14:01:27 GMT</pubDate><content:encoded><![CDATA[<p>the progress of RuckZuck.tools in 2022...</p><h1 id="repository">Repository</h1><p>There where 2<strong>&apos;440</strong> Packages created or updated in 2022, which is an average of <strong>6.7</strong> Packages per day.<br>There is a total of <strong>617</strong> Products in the Repository and <strong>10&apos;634</strong> Packages in different versions.</p><h1 id="usage">Usage</h1><p><strong>2&apos;794&apos;395</strong> packages were downloaded from the RuckZuck repository in 2022.</p><h1 id="changes">Changes</h1><p>Access to the REST-API requires an API-Key as there where too many requests, generated from scripts. The API-Key is free, but it allows to track the load on the infrastructure. To get a Key, send an eMail or open an Issue on GitHub (<a href="https://github.com/rzander/ruckzuck/issues">https://github.com/rzander/ruckzuck/issues</a>) <br>Because of this requirement, older versions of the tools may no longer work. Make sure you are using the latest version.</p><h1 id="future">Future</h1><p>There will be no further development on &quot;RuckZuck for Configuration Manager&quot; as I do no longer have access to a Development Environment with ConfigMgr installed. &#xA0;Minor changes or security related updates can still follow, but requires volunteers that are doing the testing... </p>]]></content:encoded></item><item><title><![CDATA[Delete Azure storage table entities with PowerShell]]></title><description><![CDATA[<p>Deleting massive amounts of Azure table entities based on a query can be a time- consuming task. This example Script provides a way to use &quot;<a href="https://docs.microsoft.com/en-us/rest/api/storageservices/performing-entity-group-transactions">Entity Group Transactions</a>&quot; and &quot;<a href="https://docs.microsoft.com/en-us/rest/api/storageservices/query-timeout-and-pagination">Paging</a>&quot; to speed things up... </p><!--kg-card-begin: markdown--><h1 id="overview">Overview</h1>
<p>In short, the PowerShell function does the following logic:</p>
<ul>
<li>Query the</li></ul>]]></description><link>https://rzander.azurewebsites.net/delete-azure-table-entities-with-powershell/</link><guid isPermaLink="false">62291aa494dbdcb06ccb3e9c</guid><category><![CDATA[PowerShell]]></category><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Wed, 09 Mar 2022 22:14:00 GMT</pubDate><content:encoded><![CDATA[<p>Deleting massive amounts of Azure table entities based on a query can be a time- consuming task. This example Script provides a way to use &quot;<a href="https://docs.microsoft.com/en-us/rest/api/storageservices/performing-entity-group-transactions">Entity Group Transactions</a>&quot; and &quot;<a href="https://docs.microsoft.com/en-us/rest/api/storageservices/query-timeout-and-pagination">Paging</a>&quot; to speed things up... </p><!--kg-card-begin: markdown--><h1 id="overview">Overview</h1>
<p>In short, the PowerShell function does the following logic:</p>
<ul>
<li>Query the existing entities</li>
<li>take a bundle of max. 100 rows to delete them within a batch request</li>
<li>if the query returns more than 1000 rows, use pagination to get all rows</li>
<li>return the amount of deleted rows</li>
</ul>
<blockquote>
<p>Note: Recovering data takes much more time than deleting... I learned it the hard way. Make sure you have a <strong>Backup</strong>! and double check your queries !!!</p>
</blockquote>
<h2 id="example">Example</h2>
<p>The PowerShell function requires some parameters:</p>
<pre><code class="language-PowerShell">Remove-AzureTableEntities -SASToken &quot;sv=2019-02-02&amp;se=2022-03-10T13%3A38%3A38Z&amp;sp=raud&amp;sig=vCQ4%2Bg0rt5YGGI8bFGv5tW0o5s2KMl31NuXwIGjJ3vo%3D&amp;tn=test&quot; -StorageUri &quot;https://myTest.table.core.windows.net&quot; -TableName &quot;TEST&quot; -Query &quot;PartitionKey eq &apos;lookup&apos; and Timestamp ge datetime&apos;2020-03-08T13:49:49.000Z&apos; and Timestamp lt datetime&apos;2021-11-30T13:49:49.000Z&apos;&quot;
</code></pre>
<h2 id="storageuri">StorageUri</h2>
<p><strong>StorageUri</strong> is the URL of your StorageAccount like  <code>https://myTest.table.core.windows.net</code></p>
<h2 id="tablename">TableName</h2>
<p><strong>TableName</strong> specifies the table you want to use</p>
<h2 id="sastoken">SASToken</h2>
<p><strong>SASToken</strong> is used to authenticate on the Storage Account. You can use &quot;Azure Storage Explorer&quot; or the Azure Portal to generate a SAS Token. Make sure you grant delete rights on the Azure Table. Example: <code>&quot;sv=2019-02-02&amp;se=2022-03-10T13%3A38%3A38Z&amp;sp=raud&amp;sig=vCQ4%2Bg0rt5YGGI8bFGv5tW0o5s2KMl31NuXwIGjJ3vo%3D&amp;tn=test&quot;</code></p>
<h2 id="query">Query</h2>
<p><strong>Query</strong> is used to filter your data. Check out <a href="https://docs.microsoft.com/en-us/rest/api/storageservices/querying-tables-and-entities">https://docs.microsoft.com/en-us/rest/api/storageservices/querying-tables-and-entities</a> for more details.<br>
Example: <code>&quot;PartitionKey eq &apos;part1&apos; and Timestamp ge datetime&apos;2020-03-08T13:49:49.000Z&apos; and Timestamp lt datetime&apos;2021-11-30T13:49:49.000Z&apos;&quot;</code></p>
<h2 id="returnvalue">Return value</h2>
<p>The PowerShell function returns the number of deleted rows.</p>
<h1 id="querytheexistingentities">Query the existing entities</h1>
<p>As first step, we need to get the existing items as we need the <strong>PartitionKey</strong> and <strong>RowKey</strong> for every item.<br>
Based on the <a href="https://docs.microsoft.com/en-us/rest/api/storageservices/querying-tables-and-entities">Documentation</a>, we can use the <strong>$filter</strong> option to return only entities that matches with this filter.<br>
The script does an <strong>HTTP GET</strong> request on <code>&quot;$($StorageUri)/$($TableName)()?$SASToken&amp;`$filter=$($Query)&quot;</code></p>
<blockquote>
<p>Note: To prevent PowerShell to interpret $filter as a PowerShell variable, you have to escape the dollar sign like `$filter</p>
</blockquote>
<p>You have to be aware, that you only get the first 1000 Rows...</p>
<h1 id="pagination">Pagination</h1>
<p>If your filter affects more than 1000 rows, the <strong>HTTP GET</strong> request returns a Request-Header with the next <strong>PartitionKey</strong> and <strong>RowKey</strong> (<em>x-ms-continuation-NextPartitionKey</em> and <em>x-ms-continuation-NextRowKey</em>).<br>
To get the next 1000 rows, you have to call an <strong>HTTP GET</strong> request including the <strong>NextPartitionKey</strong> and <strong>NextRowKey</strong>:<code>&quot;$($StorageUri)/$($TableName)()?$SASToken&amp;`$filter=$($Query)&amp;NextPartitionKey=$($nextPartkey)&amp;NextRowKey=$($nextRowKey)&quot;</code></p>
<h1 id="deletingentities">Deleting entities</h1>
<p>To delete an entity on an Azure storage table, you have to call an <strong>HTTP DELETE</strong> request including the <strong>PartitionKey</strong> and <strong>RowKey</strong> of the entity to delete.<br>
You will realize that the performance is not very good if you have to delete thousands of entities. That&apos;s because Azure table storage has some <a href="https://docs.microsoft.com/en-us/azure/storage/tables/storage-performance-checklist">performance restrictions</a>.</p>
<h1 id="deletingentitiesinabatch">Deleting entities in a batch</h1>
<p>By using <a href="https://docs.microsoft.com/en-us/rest/api/storageservices/performing-entity-group-transactions">entity group transactions</a>, you can significant speed up the process as you can delete up to 100 rows in a single <strong>HTTP POST</strong> request.<br>
The <strong>HTTP Post</strong> request must contain a body, that includes the <em>activity</em> (e.g. DELETE) plus the URL of the StorageAccount including the name of the table and the <strong>partitionkey</strong> and <strong>rowkey</strong> as parameters.<br>
Example of a body with a single DELETE request:</p>
<pre><code>--batch_8360b73e-53ce-4ab8-8de8-3894086bd697
content-type: multipart/mixed; boundary=changeset_7d6bec6f-eced-4cd9-8b40-9f9c528fd991

--changeset_7d6bec6f-eced-4cd9-8b40-9f9c528fd991
Content-Type: application/http
Content-Transfer-Encoding: binary

DELETE $StorageUri/$TableName(PartitionKey=&apos;APARTITIONKEY&apos;,RowKey=&apos;AROWKEY&apos;) HTTP/1.1
Accept: application/json;odata=minimalmetadata        
Accept-Encoding: identity
if-match: *

--changeset_7d6bec6f-eced-4cd9-8b40-9f9c528fd991--
--batch_8360b73e-53ce-4ab8-8de8-3894086bd697
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h1 id="removeazuretableentities">Remove-AzureTableEntities</h1>
<p>The full Script, without warranty and support...</p>
<pre><code class="language-PowerShell">&lt;#
.SYNOPSIS
Delete Azure Table Entities

.DESCRIPTION
Delete Azure Table Entities based on a Query by using Entity Group Transactions and Paging for mass deletion.

.PARAMETER SASToken
Your SAS Token starting with &quot;sv=&quot;

.PARAMETER StorageUri
The URL of your Storage Account (without the name of the table) like: https://myTest.table.core.windows.net

.PARAMETER TableName
The Name of the Table you want to query and delete entities

.PARAMETER Query
The $filter query like &quot;PartitionKey eq &apos;part1&apos; and Timestamp ge datetime&apos;2020-03-08T13:49:49.000Z&apos; and Timestamp lt datetime&apos;2021-11-30T13:49:49.000Z&apos;&quot;

.EXAMPLE
$deletedEntities = Remove-AzureTableEntities -SASToken &quot;sv=2019-02-02&amp;se=2022-03-10T13%3A38%3A38Z&amp;sp=raud&amp;sig=vCQ4%2Bg0rt5YGGI8bFGv5tW0o5s2KMl31NuXwIGjJ3vo%3D&amp;tn=test&quot; -StorageUri &quot;https://myTest.table.core.windows.net&quot; -TableName &quot;TEST&quot; -Query &quot;PartitionKey eq &apos;lookup&apos; and Timestamp ge datetime&apos;2020-03-08T13:49:49.000Z&apos; and Timestamp lt datetime&apos;2021-11-30T13:49:49.000Z&apos;&quot;

.NOTES
Created 2022 by Roger Zander -&gt; https://rzander.azurewebsites.net
#&gt;

function Remove-AzureTableEntities {
    [CmdletBinding()]
    param(
        [string] $SASToken,
        [string] $StorageUri,
        [string] $TableName,
        [string] $Query
    )
    
    
    $queryuri = &quot;$($StorageUri)/$($TableName)()?$SASToken&amp;`$filter=$($Query)&quot;
    $batchuri = &quot;$($StorageUri)/`$batch?$($SASToken)&quot;

    $version = &quot;2017-04-17&quot;
    $GMTTime = (Get-Date).ToUniversalTime().toString(&apos;R&apos;)
    $headersGet = @{
        &apos;x-ms-date&apos;    = $GMTTime
        &apos;x-ms-version&apos; = $version
        &apos;Accept&apos;       = &quot;application/json;odata=fullmetadata&quot;
    }

    $headersBatch = @{
        &apos;x-ms-date&apos;             = $GMTTime
        &apos;x-ms-version&apos;          = $version
        &apos;Content-Type&apos;          = &quot;multipart/mixed; boundary=batch_8360b73e-53ce-4ab8-8de8-3894086bd697&quot;
        &apos;DataServiceVersion&apos;    = &quot;3.0&quot;
        &apos;Accept-Charset&apos;        = &quot;UTF-8&quot;
        &apos;MaxDataServiceVersion&apos; = &quot;3.0;NetFx&quot;
    }

    $body = @&quot;
--batch_8360b73e-53ce-4ab8-8de8-3894086bd697
content-type: multipart/mixed; boundary=changeset_7d6bec6f-eced-4cd9-8b40-9f9c528fd991


&quot;@

    $changeset = @&quot;

--changeset_7d6bec6f-eced-4cd9-8b40-9f9c528fd991
Content-Type: application/http
Content-Transfer-Encoding: binary

DELETE $storageuri/$tableName(PartitionKey=&apos;APARTITIONKEY&apos;,RowKey=&apos;AROWKEY&apos;) HTTP/1.1
Accept: application/json;odata=minimalmetadata        
Accept-Encoding: identity
if-match: *

&quot;@

    $i = 0
    $webReq = Invoke-WebRequest -uri $queryuri -Headers $headersGet -Method GET
    $ToDel = $webReq.Content | ConvertFrom-json
    $nextPage = &quot;$($queryuri)&amp;NextPartitionKey=$($webReq.Headers.&quot;x-ms-continuation-NextPartitionKey&quot;)&amp;NextRowKey=$($webReq.Headers.&quot;x-ms-continuation-NextRowKey&quot;)&quot;
    $totalitems = $ToDel.value.Count 
    $startblock = 0
    $endblock = $startblock + 99
    #while ($todel.value.Count -gt 0) {
    while ($totalitems -gt 0) {
        while ($endblock -lt ($totalitems + 99)) {
    
            $tempBody = $body
            $ToDel.value[$startblock..$endblock] | ForEach-Object {
                $i++
                $tempBody += $changeset.Replace(&apos;AROWKEY&apos;, $_.RowKey).Replace(&apos;APARTITIONKEY&apos;,$_.PartitionKey)
            }

            $tempBody += @&quot;

--changeset_7d6bec6f-eced-4cd9-8b40-9f9c528fd991--

&quot;@
            $tempBody += @&quot;
--batch_8360b73e-53ce-4ab8-8de8-3894086bd697
&quot;@

            Invoke-RestMethod -uri $batchuri -Headers $headersBatch -Method POST -Body $tempBody | Out-Null
        
            $startblock = $endblock + 1
            $endblock = $startblock + 99
        }

        if ($webReq.Headers.&quot;x-ms-continuation-NextPartitionKey&quot;) {
            $nextPage = &quot;$($queryuri)&amp;NextPartitionKey=$($webReq.Headers.&quot;x-ms-continuation-NextPartitionKey&quot;)&amp;NextRowKey=$($webReq.Headers.&quot;x-ms-continuation-NextRowKey&quot;)&quot;
            $webReq = Invoke-WebRequest -uri $nextPage -Headers $headersGet -Method GET
            $ToDel = $webReq.Content | ConvertFrom-json
            $totalitems = $ToDel.value.Count 
            $startblock = 0
            $endblock = $startblock + 99
        }
        else {
            $totalitems = 0
        }
    }

    return $i
}

</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[RuckZuck Figures 2021]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>A short summary of the Ruckzuck figures of 2021...</p>
<h1 id="repository">Repository</h1>
<p>There where <strong>3&apos;347</strong> Packages created or updated in 2021, which is an average of <strong>9</strong> Packages per day.<br>
We have a total of <strong>627</strong> Products in the Repository and if we count also the different versions it&apos;</p>]]></description><link>https://rzander.azurewebsites.net/ruckzuck-figures-2021/</link><guid isPermaLink="false">6229196894dbdcb06ccb3e42</guid><category><![CDATA[RuckZuck]]></category><category><![CDATA[Packagemanager]]></category><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Sun, 06 Feb 2022 14:39:53 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>A short summary of the Ruckzuck figures of 2021...</p>
<h1 id="repository">Repository</h1>
<p>There where <strong>3&apos;347</strong> Packages created or updated in 2021, which is an average of <strong>9</strong> Packages per day.<br>
We have a total of <strong>627</strong> Products in the Repository and if we count also the different versions it&apos;s <strong>8&apos;279</strong> Packages.</p>
<h1 id="usage">Usage</h1>
<p><strong>3&apos;101&apos;902</strong> packages were downloaded from the RuckZuck repository in 2021.</p>
<h1 id="changes">Changes</h1>
<p>The API Service was moved to Azure Functions, so the WebSite of <a href="https://RuckZuck.tools">https://RuckZuck.tools</a> does no longer provide any API functions.</p>
<p>The <a href="https://ruckzuck.tools/Home/Repository">Repository Page</a> allows sorting and searching and it provides a direct link to the metadata of each package in the format of a JSON.</p>
<p>The real-time messages on the main page will automatically reduce the level of details as soon as the service is under heavy load. Enterprise customers from <a href="https://romawo.com">ROMAWO</a> are using a separate ruckzuck infrastructure to guarantie a higher responsability for their service as the public API can sometimes reach it&apos;s permormance limit.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[ROMAWO vs Intune]]></title><description><![CDATA[<p>I often get asked how <a href="https://romawo.com">romawo.com</a> does compete with <a href="https://docs.microsoft.com/en-us/mem/intune/fundamentals/what-is-intune">Microsoft Intune...</a></p><p>ROMAWO does perfectly work together with Intune, no need to choose one or the other... That&apos;s why I will list here the ROMAWO features that will extend every Intune environment.</p><ul><li>Dashboard<br>ROMAWO provides a simple web</li></ul>]]></description><link>https://rzander.azurewebsites.net/romawo-vs-intune/</link><guid isPermaLink="false">6229196894dbdcb06ccb3e41</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Tue, 15 Jun 2021 18:36:21 GMT</pubDate><content:encoded><![CDATA[<p>I often get asked how <a href="https://romawo.com">romawo.com</a> does compete with <a href="https://docs.microsoft.com/en-us/mem/intune/fundamentals/what-is-intune">Microsoft Intune...</a></p><p>ROMAWO does perfectly work together with Intune, no need to choose one or the other... That&apos;s why I will list here the ROMAWO features that will extend every Intune environment.</p><ul><li>Dashboard<br>ROMAWO provides a simple web based dashboard including all relevant data (Patch-Level, Virus Alerts, &#xA0;Office Versions etc.) on a single page.</li><li>Inventory<br>ROMAWO can inventory everything you can collect with PowerShell running as SYSTEM (e.g. installed Software, configurations etc.). Highlight inventory changes of a device based on a timeline.</li><li>3rd Party Software Update<br>Automatically update common 3rd Party Software in the background. All activities will be logged.</li><li>Real-Time Support Console<br>Search devices and trigger commands in real-time on selected devices connected to the internet.</li><li>Virus alerting<br>Alert by email if a threat is detected on a device running Windows Defender.</li><li>Defender configuration monitoring<br>Show devices with Defender settings that do not match with your corporate policy.</li><li>LAPS<br>Set and report a randomized local Admin password for every device.</li><li>Local Admins<br> For every device, you can define custom AAD Users as local administrators with an expiration date. Unapproved Admins can be removed automatically.</li><li>OS deployment<br>Create a bootable USB-Stick with the latest Windows10 source with a few clicks. Choose common Software to be installed during OS deployment (e.g. Office, Company Portal etc. )</li><li>AutoPilot registration<br>Automatically register your devices in AutoPilot during OS deployment, or generate an AutoPilot CSV File for bulk import.</li><li>Logon Script<br>Run a script in the context of the user on every logon.</li><li>Compliance Script<br>A PowerShell script that runs every 30min. Many common settings (e.g. activate BitLocker, configure OneDrive or WindowsUpdate.. ) are available as template. </li><li>Windows Servers, Windows10 Multisession or Workgroup devices<br>The ROMAWO Agent can be installed on Servers or Windows10 Multisession Hosts (WVD). It is not relevant if the device is workgroup- domain- or AAD-joined. It just requires Internet connection.</li><li>Multi-Tenancy (ROMAWO Enterprise only)<br>ROMAWO allows you to group your device in different tenants and restrict the Web-Interface to a specific AAD Group.</li></ul><p>The most important:</p><ul><li>ROMAWO is a Service and Intune is a Tool. No IT skills required for operation...</li></ul><p>If you have questions or if you want to give it a try: <a href="https://romawo.ch/default/contact">ROMAWO Contact Form</a></p><p>More details on ROMAWO: <a href="https://romawo.com ">https://romawo.com </a></p>]]></content:encoded></item><item><title><![CDATA[Collect Cellular data with PowerShell]]></title><description><![CDATA[<p>A common way to get cellular data is by using the command:</p><!--kg-card-begin: markdown--><pre><code class="language-PowerShell">netsh mbn show readyinfo * | findstr SIM```</code></pre>
<!--kg-card-end: markdown--><p>If you can run a script in the SYSTEM context, you can use the &quot;<strong>MDM Bridge WMI Provider&quot;</strong> to get some deeper insights... (<a href="https://docs.microsoft.com/en-us/windows/win32/dmwmibridgeprov/mdm-bridge-wmi-provider-portal">MDM Bridge WMI Provider - Win32 apps</a></p>]]></description><link>https://rzander.azurewebsites.net/collect-cellular-data-with-powershell/</link><guid isPermaLink="false">6229196894dbdcb06ccb3e40</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Tue, 15 Jun 2021 17:36:15 GMT</pubDate><content:encoded><![CDATA[<p>A common way to get cellular data is by using the command:</p><!--kg-card-begin: markdown--><pre><code class="language-PowerShell">netsh mbn show readyinfo * | findstr SIM```</code></pre>
<!--kg-card-end: markdown--><p>If you can run a script in the SYSTEM context, you can use the &quot;<strong>MDM Bridge WMI Provider&quot;</strong> to get some deeper insights... (<a href="https://docs.microsoft.com/en-us/windows/win32/dmwmibridgeprov/mdm-bridge-wmi-provider-portal">MDM Bridge WMI Provider - Win32 apps | Microsoft Docs</a>).</p><p>The required information is coming from the &quot;<strong>DeviceStatus CSP</strong>&quot; (<a href="https://docs.microsoft.com/en-us/windows/client-management/mdm/devicestatus-csp">DeviceStatus CSP - Windows Client Management | Microsoft Docs</a>) where you have &quot;CellularIdentities&quot; which includes:</p><ul><li>IMEI</li><li>IMSI</li><li>ICCID</li><li>PhoneNumber</li><li>CommercializationOperator (Telecom Provider)</li><li>Roaming Status</li><li>RoaminCompliance</li></ul><p>You can use the following PowerShell command (running as SYSTEM) to get all these Information:</p><!--kg-card-begin: markdown--><pre><code class="language-PowerShell">Get-WmiObject -Namespace &quot;root\cimv2\mdm\dmmap&quot; -ClassName MDM_DeviceStatus_CellularIdentities01_01
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Prompt for Keyboard-Layout during OOBE]]></title><description><![CDATA[<p>In an international Environment, it can be a requirement that users can choose the Keyboard-Layout by themselves during OOBE, but there is no UI Option in the Autopilot Profile for this option...</p><h3 id="autopilot-profile">Autopilot Profile</h3><p>We want Users to select the &quot;<strong>Language (Region)&quot;</strong> by themselves, so we set the</p>]]></description><link>https://rzander.azurewebsites.net/select-keyboardlayout-during-oobe/</link><guid isPermaLink="false">6229196894dbdcb06ccb3e3f</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Wed, 02 Jun 2021 10:00:39 GMT</pubDate><content:encoded><![CDATA[<p>In an international Environment, it can be a requirement that users can choose the Keyboard-Layout by themselves during OOBE, but there is no UI Option in the Autopilot Profile for this option...</p><h3 id="autopilot-profile">Autopilot Profile</h3><p>We want Users to select the &quot;<strong>Language (Region)&quot;</strong> by themselves, so we set the value to &quot;<strong>User select</strong>&quot;</p><figure class="kg-card kg-image-card"><img src="https://rzander.azurewebsites.net/content/images/2021/06/image.png" class="kg-image" alt loading="lazy" width="416" height="301"></figure><p>The User will be prompted to choose the region...</p><figure class="kg-card kg-image-card"><img src="https://rzander.azurewebsites.net/content/images/2021/06/image-1.png" class="kg-image" alt loading="lazy" width="510" height="381"></figure><p>... but the Keyboard-Layout does not change automatically, or it&apos;s not configured as you want (I do not want to have a French keyboard if I choose Switzerland, on a German OS).</p><p>When we get the Autopilot Profile by using the Graph API (<em><a href="https://docs.microsoft.com/en-us/graph/api/resources/intune-enrollment-outofboxexperiencesettings?view=graph-rest-beta">outOfBoxExperienceSettings resource type - Microsoft Graph</a></em>), we get the following value:</p><!--kg-card-begin: markdown--><pre><code class="language-JSON">    &quot;outOfBoxExperienceSettings&quot;: {
        &quot;hidePrivacySettings&quot;: true,
        &quot;hideEULA&quot;: true,
        &quot;userType&quot;: &quot;administrator&quot;,
        &quot;deviceUsageType&quot;: &quot;singleUser&quot;,
        &quot;skipKeyboardSelectionPage&quot;: true,
        &quot;hideEscapeLink&quot;: true
    }
</code></pre>
<!--kg-card-end: markdown--><p>The reason why we do net get a Keyboard-Layout prompt is because the Flag &quot;<strong>skipKeyboardSelectionPage</strong>&quot; is set to &quot;<strong>true</strong>&quot;.</p><h3 id="set-skipkeyboardselectionpage">Set skipKeyboardSelectionPage</h3><p>We can use Graph API to configure this value, but there is also an option over the UI...</p><ol><li>Edit the Autopilot Profile and set &quot;<strong>Language (Region)</strong>&quot; to &quot;<strong>Operating system default</strong>&quot;</li><li>Set &quot;<strong>Automatically configure keyboard</strong>&quot; to &quot;<strong>No</strong>&quot;</li></ol><figure class="kg-card kg-image-card"><img src="https://rzander.azurewebsites.net/content/images/2021/06/image-2.png" class="kg-image" alt loading="lazy" width="817" height="127" srcset="https://rzander.azurewebsites.net/content/images/size/w600/2021/06/image-2.png 600w, https://rzander.azurewebsites.net/content/images/2021/06/image-2.png 817w" sizes="(min-width: 720px) 720px"></figure><p>3. Save the Profile...</p><p>4. Edit the Autopilot Profile again and set &quot;<strong>Language (Region)</strong>&quot; to &quot;<strong>User select</strong>&quot; and save the Profile again...</p><p>If you now get the OOBE Settings over Graph API</p><!--kg-card-begin: markdown--><pre><code class="language-JSON">    &quot;outOfBoxExperienceSettings&quot;: {
        &quot;hidePrivacySettings&quot;: true,
        &quot;hideEULA&quot;: true,
        &quot;userType&quot;: &quot;administrator&quot;,
        &quot;deviceUsageType&quot;: &quot;singleUser&quot;,
        &quot;skipKeyboardSelectionPage&quot;: false,
        &quot;hideEscapeLink&quot;: true
    }
</code></pre>
<!--kg-card-end: markdown--><p>&quot;<strong>skipKeyboardSelectionPage</strong>&quot; is set to &quot;<strong>false</strong>&quot; and you will get a Keyboard-Layout prompt during OOBE (after the Region prompt):</p><figure class="kg-card kg-image-card"><img src="https://rzander.azurewebsites.net/content/images/2021/06/image-3.png" class="kg-image" alt loading="lazy" width="511" height="384"></figure><p>...and the User can choose the right Keyboard-Layout...</p>]]></content:encoded></item><item><title><![CDATA[RuckZuck Figures for 2020]]></title><description><![CDATA[<p>It&apos;s time to recap what happened with <a href="https://ruckzuck.tools/">ruckzuck.tools</a> in 2020...<br>(as for <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2019/">2019, </a> <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2018/">2018</a>, <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2017/">2017</a>, <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2016/">2016</a> and <a href="https://rzander.azurewebsites.net/ruckzuck-packagemanager-v1-0/">2015</a> )</p><h1 id="repository">Repository</h1><p>The public <a href="https://ruckzuck.tools/Home/Repository">RuckZuck repository</a> includes currently <strong>575</strong> Software-Products. If we also count the different Versions, we have <strong>5&apos;509</strong> Packages in the Repository. There where <strong>2&apos;</strong></p>]]></description><link>https://rzander.azurewebsites.net/ruckzuck-figures-for-2020/</link><guid isPermaLink="false">6229196894dbdcb06ccb3e3e</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Sat, 02 Jan 2021 11:40:31 GMT</pubDate><content:encoded><![CDATA[<p>It&apos;s time to recap what happened with <a href="https://ruckzuck.tools/">ruckzuck.tools</a> in 2020...<br>(as for <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2019/">2019, </a> <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2018/">2018</a>, <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2017/">2017</a>, <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2016/">2016</a> and <a href="https://rzander.azurewebsites.net/ruckzuck-packagemanager-v1-0/">2015</a> )</p><h1 id="repository">Repository</h1><p>The public <a href="https://ruckzuck.tools/Home/Repository">RuckZuck repository</a> includes currently <strong>575</strong> Software-Products. If we also count the different Versions, we have <strong>5&apos;509</strong> Packages in the Repository. There where <strong>2&apos;680</strong> Packages created in 2020 which results in an average of <strong>7.3</strong> Packages per day...</p><blockquote>Thanks to all the contributors who created or reported broken packages!</blockquote><p>To compare and detect the latest versions of a product, there is a mapping table with <strong>74&apos;938</strong> entries.</p><h1 id="usage">Usage</h1><p>It&apos;s difficult to compare the usage counters with 2019 as we have only usage data from August to December in 2019...</p><p>Package Downloads: <strong>1&apos;1314&apos;640</strong> (2020) , 113&apos;827 (2019), 1&apos;428&apos;467 (total)<br>Success installation: <strong>1&apos;249&apos;616</strong> (2020), 161&apos;151 (2019), 1&apos;410&apos;767 (total)<br>Failed installations: <strong>265&apos;470</strong> (2020), 117&apos;770 (2019), 383&apos;240 (total)</p><p>To get an overview of current customers (from the last 48h): <a href="https://ruckzuck.tools/Home/Support"><a href="https://ruckzuck.tools/Home/Support">RuckZuck </a>M</a>ap</p><figure class="kg-card kg-image-card"><img src="https://rzander.azurewebsites.net/content/images/2021/01/image-2.png" class="kg-image" alt loading="lazy" width="801" height="395" srcset="https://rzander.azurewebsites.net/content/images/size/w600/2021/01/image-2.png 600w, https://rzander.azurewebsites.net/content/images/2021/01/image-2.png 801w" sizes="(min-width: 720px) 720px"></figure><p><strong>Top5 downloads</strong> in 2020:<br>20&apos;570 Microsoft Azure Information Protection 2.7.99.0<br>20&apos;252 Microsoft Azure Information Protection 2.7.101.0<br>20&apos;019 Microsoft Azure Information Protection 1.54.59.0<br>19&apos;621 VCRedist2019x64 14.27.29112.0<br>19&apos;573 Microsoft Azure Information Protection 2.8.85.0</p><p><strong>Top5 failures</strong> in 2020:<br>11&apos;146 AdobeReader DC MUI 20.006.20042<br>9&apos;608 VCRedist2019x64 14.27.29016.0<br>8&apos;447 CutePDF Writer 4.0<br>8&apos;291 VCRedist2019x86 14.25.28508.3<br>7&apos;846 VCRedist2019x86 14.27.29016.0</p><p>A deeper analysis of all the failures indicates that these high numbers are coming from a small number of IP addresses. Also the most downloaded products indicates that most of the usage is generated from companies using RuckZuck and not from personal devices. <strong>5%</strong> of all packages generates <strong>75%</strong> of load ...</p><blockquote>Please monitor your RuckZuck deployments. If a packages failed 10 times in series on a device, it will also fail the next 1000 times... Customers will become blacklisted if they only send failures without downloads and success installations...</blockquote><h1 id="infrastructure">Infrastructure</h1><p>The public repository is hosted on an Azure Web Application connected to an Azure Storage Account with Tables (Software mapping), Blob Storage (the Repository itself) and Queues (download counter). Azure Log Analytics is used for logging and a Content Delivery Network (CDN) is used to host some &quot;special&quot; packages, Icons and repository meta-data.</p><figure class="kg-card kg-image-card"><img src="https://rzander.azurewebsites.net/content/images/2021/01/image-1.png" class="kg-image" alt loading="lazy" width="986" height="801" srcset="https://rzander.azurewebsites.net/content/images/size/w600/2021/01/image-1.png 600w, https://rzander.azurewebsites.net/content/images/2021/01/image-1.png 986w" sizes="(min-width: 720px) 720px"></figure><p>Thanks to the<a href="https://ruckzuck.tools/Home/Sponsors"> <a href="https://ruckzuck.tools/Home/Sponsors">Sponsors</a></a> , for covering the infrastructure costs !</p><h2 id="planned-changes-">Planned changes...</h2><p>As the current Infrastructure does not scale very well on heavy load, it&apos;s planned to separate the REST API from the Web-Site. The REST API will be migrated to separated Azure Functions.</p><h1 id="future-of-ruckzuck">Future of RuckZuck</h1><p>As in August 2020, the commercial version of RuckZuck was founded ( <a href="https://romawo.com">ROMAWO managed workplace</a> ), there where a lot of questions if this has an impact on the <a href="https://github.com/rzander/ruckzuck">Open-Source version of <a href="https://ruckzuck.tools">RuckZuck</a></a> ... The short answer is <strong>NO </strong>, RuckZuck will continue and it will benefit from <a href="https:/7romawo.com">ROMAWO</a>, as it&apos;s using the same code base.</p><p><strong>But</strong>, if we see a massive increase of companies using RuckZuck without providing any value, we have to think about limiting the public service...</p><p> If you are using RuckZuck in a commercial environment, start providing value by supporting this project... It can be just feedback on <a href="https://github.com/rzander/ruckzuck/issues">issues</a> , publish packages that needs an update (there are always packages to fix) or become a <a href="https://ruckzuck.tools/Home/Sponsors">sponsor</a>...<br></p><p> I am looking forward to an exciting year 2021</p>]]></content:encoded></item><item><title><![CDATA[ROMAWO, Arbeitsplatzverwaltung als Dienstleistung...]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Es ist soweit, nachdem ich Jahrelang (Open-Source) Tools ver&#xF6;ffentlicht habe, m&#xF6;chte ich nun ein neues <a href="https://romawo.com">Projekt</a> ank&#xFC;ndigen:<br>
<img src="https://rzander.azurewebsites.net/content/images/2020/09/ROMAWO_Header_green_500.png" alt="ROMAWO managed workplace" loading="lazy"><br>
... Arbeitsplatzverwaltung auf einem neuen Level... Aber nicht als Tool, sondern als <strong>Dienstleistung</strong>.</p>
<h3 id="wasromawoihnenermglicht">was ROMAWO Ihnen erm&#xF6;glicht:</h3>
<ul>
<li>es <strong>aktualisiert</strong> installierte <strong>Software</strong> (mehr als 500 Produkte verf&</li></ul>]]></description><link>https://rzander.azurewebsites.net/romawo-arbeitsplatzverwaltung-als-dienstleistung-schweiz/</link><guid isPermaLink="false">6229196894dbdcb06ccb3e3d</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Wed, 09 Sep 2020 21:36:14 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Es ist soweit, nachdem ich Jahrelang (Open-Source) Tools ver&#xF6;ffentlicht habe, m&#xF6;chte ich nun ein neues <a href="https://romawo.com">Projekt</a> ank&#xFC;ndigen:<br>
<img src="https://rzander.azurewebsites.net/content/images/2020/09/ROMAWO_Header_green_500.png" alt="ROMAWO managed workplace" loading="lazy"><br>
... Arbeitsplatzverwaltung auf einem neuen Level... Aber nicht als Tool, sondern als <strong>Dienstleistung</strong>.</p>
<h3 id="wasromawoihnenermglicht">was ROMAWO Ihnen erm&#xF6;glicht:</h3>
<ul>
<li>es <strong>aktualisiert</strong> installierte <strong>Software</strong> (mehr als 500 Produkte verf&#xFC;gbar) und das Betriebssystem Ihrer Ger&#xE4;te automatisch im Hintergrund.</li>
<li>es konfiguriert den Microsoft Defender und <strong>meldet</strong> Ihnen via Mail wenn etwas <strong>ungew&#xF6;hnliches (Viren)</strong> auf einem Ihrer <strong>Ger&#xE4;te gefunden</strong> wurde.</li>
<li>es sammelt <strong>Inventardaten und Konfigurationen</strong> der Ger&#xE4;te, so dass Sie immer genau wissen was auf den Ger&#xE4;ten l&#xE4;uft.</li>
<li>es bietet Ihnen eine &#xFC;bersichtliche <strong>Web-Oberfl&#xE4;che</strong>, mit der Sie den <strong>Status Ihrer Computer</strong> immer unter Kontrolle haben und in <strong>Echtzeit interagieren</strong> k&#xF6;nnen.</li>
<li>es kennt alle <strong>Bitlocker-Schl&#xFC;ssel</strong> und lokalen <strong>Admin Passw&#xF6;rter</strong> und wechselt diese auch regelm&#xE4;ssig (LAPS)</li>
<li>es <strong>erstellt und aktualisiert</strong> einen USB-Stick f&#xFC;r die <strong>Betriebssystem Installation</strong> und integriert die notwendige Software (z.B. Office), so dass Sie ein Ger&#xE4;t in wenigen Minuten neu installieren k&#xF6;nnen.</li>
</ul>
<p>... die komplette Service-Beschreibung finden Sie hier: <a href="https://romawo.ch/default/service?culture=de">romawo.ch</a></p>
<p><img src="https://rzander.azurewebsites.net/content/images/2020/09/Romawo_Screenshot.png" alt loading="lazy"></p>
<h3 id="voraussetzungen">Voraussetzungen</h3>
<p>Damit das Ganze funktioniert, ben&#xF6;tigen Sie lediglich drei Voraussetzungen:</p>
<ul>
<li>ein aktuelles <strong>Windows</strong> Betriebssystem (Client oder Server)</li>
<li><strong>Internetverbindung</strong> (die Clients m&#xFC;ssen den ROMAWO Service erreichen k&#xF6;nnen)</li>
<li>der <strong>ROMAWO</strong> <strong>Agent</strong> muss auf allen Clients installiert werden.</li>
</ul>
<p>... mehr nicht. Es ist <strong>egal</strong> ob Ihre Ger&#xE4;te in einer <strong>lokalen Dom&#xE4;ne, Workgroup oder in ein Azure-AD</strong> integriert sind.</p>
<h3 id="zielpublikum">Zielpublikum</h3>
<p><strong>ROMAWO</strong> setzt keine IT Kenntnisse voraus und ist somit ideal f&#xFC;r <strong>alle</strong>, die mit der Arbeitsplatzverwaltung <strong>so wenig wie m&#xF6;glich zu tun haben wollen</strong>.</p>
<p><strong>Schulen</strong> profitieren von vorgefertigten Sicherheits-Konfigurationen f&#xFC;r Z.B. AppLocker, damit die Ger&#xE4;te f&#xFC;r das eingesetzt werden, wozu sie gedacht sind...</p>
<p>F&#xFC;r Firmen die eine <strong>eigene IT Abteilung</strong> haben und z.B. bereits <strong>Microsoft Intune</strong> einsetzen, kann <strong>ROMAWO</strong> <strong>parallel dazu eingesetzt</strong> werden um den regelm&#xE4;ssigen Aufwand f&#xFC;r Software-Aktualisierung und OS Installationen zu reduzieren.</p>
<p>Wenn Sie selbst <strong>IT-Dienstleistung</strong> anbieten, kann <strong>ROMAWO</strong> Ihnen die t&#xE4;gliche Arbeit erleichtern und Sie k&#xF6;nnen sich auf das Wesentliche fokussieren. <strong>ROMAWO</strong> ist <strong>Mandantenf&#xE4;hig</strong>, so haben Sie all Ihre <strong>Umgebungen und Kunden im Blick</strong>.</p>
<h3 id="kosten">Kosten ?!</h3>
<p>Der Service kostet <strong>weniger</strong> als <strong>1CHF/Ger&#xE4;t/Monat</strong>.<br>
Die Preise finden Sie auf <a href="https://romawo.ch/?culture=de">romawo.ch</a>, aber wenn Sie nicht sicher sind, fragen Sie einfach nach: <a href="https://romawo.ch/default/contact">Anfrage</a>. Gerne erstellen wir auch eine <strong>Test-Instanz</strong> f&#xFC;r Sie, damit Sie <strong>ROMAWO</strong> ohne Verpflichtung testen k&#xF6;nnen.</p>
<p>Die allgemeinen Gesch&#xE4;ftsbedingungen: <a href="https://romawo.ch/AGB_DE.pdf">AGB&apos;s</a></p>
<h3 id="hintergrundinfos">Hintergrund Infos</h3>
<p><strong>ROMAWO</strong> verwendet bekannte Technologien und L&#xF6;sungen die gr&#xF6;sstenteils als Open-Source ver&#xF6;ffentlicht wurden. Jede dieser L&#xF6;sungen hat eine gewisse Komplexit&#xE4;t und ist jeweils nur ein Baustein im ganzen Gebilde. Als <em>Owner</em> und <em>Entwickler</em> dieser Bausteine konnte mit <strong>ROMAWO</strong> eine einheitliche L&#xF6;sung gebaut werden, welche wir f&#xFC;r Sie auch noch betreiben und weiter pflegen...</p>
<ul>
<li><a href="https://ruckzuck.tools">RuckZuck.tools</a> ; <strong>ROMAWO</strong> verwendet ein eigenes RuckZuck-Repository und Content-Delivery-Network (CDN) f&#xFC;r die Software Aktualisierung.</li>
<li><a href="https://rzander.azurewebsites.net/modern-os-deployment-mosd/">mOSD</a>; automatische OS Installation, <strong>ROMAWO</strong> bietet eine Web-Oberfl&#xE4;che f&#xFC;r die Konfiguration und ein Tool um die Installations-Dateien zu beziehen und aktuell zu halten .</li>
<li><a href="https://github.com/rzander/DevCDR">DeviceCommander</a>;Das Realtime-Client-Management ist komplett in die <strong>ROMAWO</strong> Web-Oberf&#xE4;che integriert. Ausserdem verwendet <strong>ROMAWO</strong> den von Microsoft gehosteten <strong>SignalR</strong> Service auf Azure um mit der Skalierung von DevCDR an keine Grenzen zu stossen (SignalR unterst&#xFC;tz bis zu 100&apos;000 Echtzeitverbindungen)</li>
<li><a href="https://github.com/rzander/jaindb">JainDB</a> ; Blockchain basierte Datenbank f&#xFC;r die Langzeitspeicherung und Deduplizierung der Inventardaten. So k&#xF6;nnen Sie jede &#xC4;nderung am Inventar &#xFC;ber den gesamten Lebenszyklus eines Ger&#xE4;ts verfolgen.</li>
<li><a href="http://pspeditor.azurewebsites.net/">PSPEditor</a> und <a href="https://reg2ps.azurewebsites.net/">reg2ps</a>; Konfiguration und &#xDC;berwachung von Windows Einstellungen</li>
</ul>
<p>Die Erfahrungen mit <strong>ROMAWO</strong> fliesst in die Open-Source Tools mit ein und so werden auch diese weiterentwickelt...</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[automatically update RuckZuck Applications in ConfigMgr]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>If you want to automatically update <a href="https://github.com/rzander/ruckzuck/wiki/RuckZuck-for-ConfigMgr">RuckZuck Applications</a> in Microsoft Endpoint Configuration Manager:</p>
<pre><code class="language-PowerShell">#Load the RZ4ConfigMgr Assembly
[System.Reflection.Assembly]::LoadFrom((Join-Path $(Split-Path $env:SMS_ADMIN_UI_PATH) RZ4CM.exe)) | Out-Null
$RZ = New-Object RuckZuck_Tool.PSRZ4ConfigMgr

#detect SW Updates
$RZ.Scan()

#Show details of detected Updates
$RZ.SWUpdates

#Update all</code></pre>]]></description><link>https://rzander.azurewebsites.net/automatically-update-ruckzuck-applications-in-configmgr/</link><guid isPermaLink="false">6229196894dbdcb06ccb3e3c</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Tue, 26 May 2020 16:04:03 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>If you want to automatically update <a href="https://github.com/rzander/ruckzuck/wiki/RuckZuck-for-ConfigMgr">RuckZuck Applications</a> in Microsoft Endpoint Configuration Manager:</p>
<pre><code class="language-PowerShell">#Load the RZ4ConfigMgr Assembly
[System.Reflection.Assembly]::LoadFrom((Join-Path $(Split-Path $env:SMS_ADMIN_UI_PATH) RZ4CM.exe)) | Out-Null
$RZ = New-Object RuckZuck_Tool.PSRZ4ConfigMgr

#detect SW Updates
$RZ.Scan()

#Show details of detected Updates
$RZ.SWUpdates

#Update all detected Updates
$RZ.Update()
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Update DeviceCommander to .NETCore3.1]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The current Version of <a href="https://github.com/rzander/DevCDR">DeviceCommander</a> is using .NETCore3.1. The &quot;older&quot; Branch, based on .NETCore2.1 will no longer get any feature updates.<br>
If you want to update your existing installation, just follow this guide:</p>
<h1 id="disconnect">Disconnect</h1>
<p>If you have deployed your DevCDR Instance using the &quot;<a href="https://azuredeploy.net/?repository=https://github.com/rzander/devcdr/tree/ServerCore31">Deploy to</a></p>]]></description><link>https://rzander.azurewebsites.net/update-devicecommander-to-netcore3-1/</link><guid isPermaLink="false">6229196894dbdcb06ccb3e3b</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Sat, 23 May 2020 07:36:10 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>The current Version of <a href="https://github.com/rzander/DevCDR">DeviceCommander</a> is using .NETCore3.1. The &quot;older&quot; Branch, based on .NETCore2.1 will no longer get any feature updates.<br>
If you want to update your existing installation, just follow this guide:</p>
<h1 id="disconnect">Disconnect</h1>
<p>If you have deployed your DevCDR Instance using the &quot;<a href="https://azuredeploy.net/?repository=https://github.com/rzander/devcdr/tree/ServerCore31">Deploy to Azure</a>&quot; button, your Instance is linked with the <a href="https://github.com/rzander/DevCDR">GitHub repository</a>.<br>
If you open the WebApp in the Azure Portal and switch to &quot;Deployment Center&quot;, you will see the <strong>Repository</strong> and the <strong>Branch</strong>:<br>
<img src="https://rzander.azurewebsites.net/content/images/2020/05/RepositoryBranch.png" alt loading="lazy"><br>
As there is no option to just change the branch, you have to click on &quot;<strong>Disconnect</strong>&quot; to remove the SourceControl binding...</p>
<blockquote>
<p>Note: Your instance will not update automatically if it has a Source-Control binding, you have to click on &quot;<strong>Sync</strong>&quot; to get the latest version!</p>
</blockquote>
<h1 id="deploy">Deploy</h1>
<p>Once the Source-Control binding is disconnected, you can create a new connection:<br>
<img src="https://rzander.azurewebsites.net/content/images/2020/05/DeploymentCenter.png" alt loading="lazy"><br>
Select &quot;<strong>External</strong>&quot; in the &quot;Manual Deployment (push/sync)&quot; options.</p>
<p>On the next Screen, select <strong>App Service build service</strong>:<br>
<img src="https://rzander.azurewebsites.net/content/images/2020/05/AppService.png" alt loading="lazy"></p>
<p>On the 3rd Screen, you have to enter the Repository URL: <code>https://github.com/rzander/DevCDR</code> and the Branch <code>ServerCore31</code>. As DevCDR is a public Repository, select <strong>Private Repository = No</strong>:<br>
<img src="https://rzander.azurewebsites.net/content/images/2020/05/Code.png" alt loading="lazy"></p>
<h1 id="sync">Sync</h1>
<p>The WebApp will get the Source-Code from GitHub to compile and deploy the latest version... This may take a &quot;moment&quot;...</p>
<p>Once it&apos;s finished, you should see the <strong>Status</strong> as <strong>Success (Active)</strong>:<br>
<img src="https://rzander.azurewebsites.net/content/images/2020/05/Sync.png" alt loading="lazy"></p>
<blockquote>
<p>Note: Don&apos;t forget to <strong>Sync</strong> from time to time to get the latest updates and fixes!</p>
</blockquote>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[RuckZuck Figures for 2019]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://ruckzuck.tools">RuckZuck</a> had its <strong>5 years anniversary</strong> on 2nd December 2019... Time to summarize some figures (as for <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2018/">2018</a>, <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2017/">2017</a>, <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2016/">2016</a> and <a href="https://rzander.azurewebsites.net/ruckzuck-packagemanager-v1-0/">2015</a> )</p>
<h3 id="summary">Summary</h3>
<p><strong>RuckZuck.exe</strong> was downloaded <strong>15&apos;629</strong> times in 2019 from <a href="https://github.com/rzander/ruckzuck">https://github.com/rzander/ruckzuck</a>. In 2018 it was 10&apos;926, a light grow,  but</p>]]></description><link>https://rzander.azurewebsites.net/ruckzuck-figures-for-2019/</link><guid isPermaLink="false">6229196894dbdcb06ccb3e3a</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Fri, 03 Jan 2020 13:01:21 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://ruckzuck.tools">RuckZuck</a> had its <strong>5 years anniversary</strong> on 2nd December 2019... Time to summarize some figures (as for <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2018/">2018</a>, <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2017/">2017</a>, <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2016/">2016</a> and <a href="https://rzander.azurewebsites.net/ruckzuck-packagemanager-v1-0/">2015</a> )</p>
<h3 id="summary">Summary</h3>
<p><strong>RuckZuck.exe</strong> was downloaded <strong>15&apos;629</strong> times in 2019 from <a href="https://github.com/rzander/ruckzuck">https://github.com/rzander/ruckzuck</a>. In 2018 it was 10&apos;926, a light grow,  but these numbers depends on the number of published releases ( we had <strong>11 Releases in 2019</strong> ).<br>
An interesting number is the <strong>total downloads from GitHub</strong> in 2019: <strong>200&apos;293</strong> downloads !!!<br>
It seems that RuckZuck.exe no not the most popular File, it&apos;s the <strong>RuckZuck Provider for OneGet</strong> (179&apos;295 downloads). The OneGet Provider is part of <a href="https://github.com/rzander/DevCDR"><strong>Device Commander</strong></a>, a cloud based client management solution, which indicates that RuckZuck is also used in Enterprise environments... and/or someone had a download loop as the high download numbers where only in Feb/March 2019..</p>
<p>RuckZuck is used globaly... if you want to see the locations of current RuckZuck customers, open the <a href="https://ruckzuck.tools/Home/Support">Support page</a> or <a href="https://app.powerbi.com/view?r=eyJrIjoiN2YyOTUxODYtYTc4My00ZmM0LWI5NjQtYmQzZmQ2MzAyOTczIiwidCI6ImVkNDI1ODAyLTExODYtNDRkZS04ODIzLWE0YTU3ZDE0MGEyOCIsImMiOjh9">RuckZuck Map</a>   ... have you found your location ?<br>
<img src="https://rzander.azurewebsites.net/content/images/2020/01/Map.png" alt loading="lazy"></p>
<p>The Repository includes <strong>511</strong> current Packages or <strong>2&apos;829</strong> Packages, if we also count older Versions.<br>
To evaluate product updates, there is a Mapping-Table with <strong>65&apos;957</strong> Software-Items.</p>
<p><strong>113&apos;827</strong> Software Packages where <strong>downloaded</strong> from RuckZuck. The Success/Failure ratio is weird as we had <strong>161&apos;151</strong> Success and <strong>117&apos;770</strong> Failures. Some Packages, like a Version of JavaRuntime, had 1&apos;668 Downloads but 39&apos;775 Failures. These numbers do not reflect the full Year as the RuckZuck Back-end was updated in July/August and I only have the numbers from the new Infrastructure...</p>
<blockquote>
<p>Please: If you automate Software-Distribution with RuckZuck, keep an eye on your Success/Failure ratio and do not bomb RuckZuck with thousands of Requests... If a Package failed 10 times in series it will also fail the next 100 times...<br>
Otherwise your IP can be blocked for a while.</p>
</blockquote>
<p>Failures are important to identify broken links. <strong>Every</strong> failure will trigger an installation in a Sandbox to verify if it&apos;s a false positive or not. If you want to support this project by verifying failures, you can run a <a href="https://github.com/rzander/ruckzuck/wiki/RuckZuck-Test-Bot-running-in-Win10-SandBox"><strong>Test-Bot</strong> in a Win10 Sandbox</a></p>
<p>Since August 2019, <strong>1&apos;382</strong> Packages where created. That&apos;s an average of ~<strong>9 Packages/Day</strong>... Thanks to all the contributors, who support this project by reporting Issues or creating Packages !!!</p>
<p>If I compare the usage of Packages, I can say that 20% of the Packages are used 80% of time... In other words, 80% of the work is only for 20% of the clients. As more and more enterprise customers are using RuckZuck it will become even more... I think 500 Packages in the Repository is manageable number, I do not have interests to have every little Software in this Repo. That&apos;s why I will also drop Products if there are not used...</p>
<h3 id="infrastructure">Infrastructure</h3>
<p>The Infrastructure of RuckZuck has changed completely since <a href="https://rzander.azurewebsites.net/ruckzuck-figures-for-2018/">2018</a>:</p>
<ul>
<li><strong>Redis</strong> cache removed</li>
<li><strong>SQL</strong> removed</li>
<li>no RuckZuck Account DB (..nothing can leak -&gt; GDPR)</li>
<li>Repository uploads are anonymous. You can enter your email address on the Author attribute if you want some feedback, but this Attribute is removed during approval.</li>
<li><strong>Azure Blob/Table storage</strong> for the Repository</li>
<li>support for OnPrem RuckZuck Servers acting as Proxy and/or for local Repositories</li>
<li><strong>Content Delivery Network</strong> (CDN) for global caching of Metadata and..</li>
<li>some Packages are already using RuckZuck CDN to distribute the binaries. Reasons can be:
<ul>
<li>Vendor removed Product or Web-Site closed, but Product-Updates are still important</li>
<li>Vendor Web Site has very poor performance</li>
<li>Vendor does block non-interactive downloads but the license allows redistribution</li>
</ul>
</li>
<li><strong>SignalR</strong> for real-time messages on the Web-Site (Service Bus is still there... )</li>
<li><strong>Azure Functions</strong> to side load some work</li>
<li><strong>Azure Log Analytics</strong> for monitoring</li>
<li>Server REST API is now running on .NET Core 3.1 -&gt; try the latest <a href="https://hub.docker.com/r/zanderr/ruckzuck">Docker Image</a> if you want to cache the packages OnPrem..</li>
</ul>
<p>Back-End activity example (one hour):<br>
<img src="https://rzander.azurewebsites.net/content/images/2020/01/Azure.png" alt="Application Insights" loading="lazy"><br>
I&apos;ve found two <a href="https://ruckzuck.tools/Home/Sponsors">Sponsors</a> to cover the costs for the Infrastructure. Thanks to <strong>itnetX</strong> and <strong>baseVISION</strong> to keep this thing running!</p>
<p>Let&apos;s look forward and see what happens in 2020 ....</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Hosting a ConfigMgr Lab in Azure]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="yeswehavealab">Yes, we have a Lab...</h1>
<p>Most Customers are looking for a ConfigMgr Test-LAB, a playground for the SCCM Admins to implement and test new features and addons or to simulate a disaster recovery scenario...</p>
<p>It&apos;s often the PoC Environment that will be renamed to the new LAB or</p>]]></description><link>https://rzander.azurewebsites.net/hosting-a-configmgr-lab-in-azure/</link><guid isPermaLink="false">6229196894dbdcb06ccb3e39</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Wed, 30 Oct 2019 13:22:01 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="yeswehavealab">Yes, we have a Lab...</h1>
<p>Most Customers are looking for a ConfigMgr Test-LAB, a playground for the SCCM Admins to implement and test new features and addons or to simulate a disaster recovery scenario...</p>
<p>It&apos;s often the PoC Environment that will be renamed to the new LAB or it will be built during the initial ConfigMgr project... but once running, it&apos;s often:</p>
<ul>
<li>outdated</li>
<li>no one is using it (sometimes they don&apos;t even know that a such an environment exists)</li>
<li>it&apos;s empty (no Client, no Apps)</li>
<li>it does not reflect production (e.g. LAB is a single Server, but Prod has remote SQL etc.)</li>
</ul>
<p>... not very helpful ...</p>
<h1 id="whydoweneedalab">Why do we need a LAB ?!</h1>
<p>Everyone is doing backup... ConfigMgr Backup-Task, SQL Backup, File-Backup etc. But have you ever restored a Site or the full Environment ?! <strong>That&apos;s something you have to practice !!!</strong><br>
Simulating a disaster recovery, is one of the things you should regularly do (in a LAB environment :-).</p>
<p>What is needed:</p>
<ul>
<li>Separated environment (no connection to prod)</li>
<li>same Domain name</li>
<li>same Server names</li>
<li>same volumes on the servers (recommended)</li>
<li>same Service-Accounts (recommended)</li>
<li>...</li>
</ul>
<p>that&apos;s the point where most customers give up.. But there is on option:</p>
<h1 id="hostingconfigmgrinazure">hosting ConfigMgr in Azure</h1>
<p>I&apos;m using <a href="https://azure.microsoft.com/en-us/services/devtest-lab/">Azure DevTest Labs</a> to host my ConfigMgr Lab environment because I can <a href="https://rzander.azurewebsites.net/step-by-step-configmgr-setup-in-azure-devtest-labs/">build a simple ConfigMgr environment within an hour</a> (depending on the server size), do my tests, and if not needed anymore, just drop it..</p>
<p>For a full recovery scenario it may require some more things to plan <strong>before</strong> you start:</p>
<h4 id="resourcegroups">Resource Groups</h4>
<p>When creating a new <a href="https://azure.microsoft.com/en-us/services/devtest-lab/">Azure DevTest Lab</a>, it&apos;s configured to &quot;Default resource group allocation&quot; where server resources sometimes get an own Resource Group and sometimes they share a Resource Group.<br>
<img src="https://rzander.azurewebsites.net/content/images/2019/10/ResourceGroup.png" alt loading="lazy"><br>
I never had a problem with that on smaller environments, but in case of some special requirements like an SQL Always On availability group, it can become a problem (details later)...</p>
<blockquote>
<p>I recommend to use a single Resource Group for all the resources in a ConfigMgr Lab.</p>
</blockquote>
<p>See also: <a href="https://azure.microsoft.com/de-de/blog/configure-resource-group-control-for-your-azure-devtest-lab">Specify a resource group for lab virtual machines in Azure DevTest Labs</a></p>
<h4 id="sharedip">Shared-IP</h4>
<p><a href="https://docs.microsoft.com/en-us/azure/lab-services/devtest-lab-shared-ip">Shared-IP</a> is also enabled by default. With Shared-IP, you can access (Remote Desktop) your servers by using a single external IP. Every of your Servers will have a different port for RDP on the external IP.</p>
<p>That&apos;s normally not a problem, unless you come to the point where you want to change the size of your server(s).</p>
<blockquote>
<p><strong>Note:</strong> You can not change the size of a server with a shared IP.</p>
</blockquote>
<p>Well, you can, but you have to disconnect the network adapter before you can resize. It&apos;s not a big problem but you should be aware of that...</p>
<h4 id="serversizing">Server Sizing</h4>
<p>It does not help if you build a lab with cheapest server sizes, but the infrastructure is so slow that working is a pain... You also don&apos;t have to oversize it, but finding the right balance of size and performance may need some adjustments (that&apos;s why I had to resize my servers).<br>
I also recommend to use SSD Disks for the OS and other IO intensive volumes from the beginning... Converting an OS Disk to SSD in a later stage can become a challenge.</p>
<h4 id="datadisks">Data Disks</h4>
<p>Do not install everything on the OS Volume just to reduce costs. Data Disks can be re-attached to different servers. So if you have for example a dedicated Data-Disk with your Package- and Installation Sources (this one does not need to be a high performance SSD), you can re-use this disk in case of you rebuild the lab.<br>
For Recovery tests, the Servers should have the same volumes as in Production.</p>
<blockquote>
<p><strong>Note</strong>: Disk-Storage can generate costs even if the Servers are turned off..</p>
</blockquote>
<h4 id="activedirectorydomain">Active Directory Domain</h4>
<p>As mentioned before, if you plan to do some recovery tests, you <strong>must</strong> use the same Active Directory Domain Name as in your Prod Environment. As long as you do not connect your Lab with your Prod Network (e.g. VPN), it will be fine...<br>
Maybe you can involve the AD Team to let them restore the Prod AD in Lab. See: <a href="https://docs.microsoft.com/en-us/windows/win32/ad/backing-up-and-restoring-an-active-directory-server">Backing Up and Restoring an Active Directory Server</a>. One benefit will be to get all Service Accounts from Prod. If it&apos;s not possible to restore your prod AD (there may be some legal and security constrains), build your own domain with the same name as in prod. Create your Service Accounts before restoring the site.</p>
<h4 id="designyourlab">Design your LAB</h4>
<p><strong>Before</strong> you create the first Machine, define the number of Servers you want to build and try to calculate the costs based on <a href="https://azure.microsoft.com/en-us/pricing/calculator">Azure Pricing calculator</a>. If you are going to restore your Prod Site, define the Site Systems you want to include in your DR test. It does not make sense to build dozens of Distribution-Points an a Lab.</p>
<p>The following diagram was a scenario to test high availability with an active/passive site server. It&apos;s a LAB design for some specific test scenarios...<br>
<img src="https://rzander.azurewebsites.net/content/images/2019/10/LabDesign.png" alt="alt" loading="lazy"><br>
The expected calculated costs are 2000$ per Month, but only if the Environment is running 7/24. You may need a working day or two to set it up but you can shutdown it over night (or per default, Azure DevTest Lab will do that for you automatically). At the end, the infrastructure costs for that Test was less than 300$.</p>
<h4 id="marketplaceimages">Marketplace Images</h4>
<p>Using predefined Marketplace Images (like &quot;SQL Server 2017 Enterprise Windows Server 2019&quot;) will reduce the time you need to setup the environment... But remember that if you want to restore a Site On-Premise in case of a disaster, you need to have the installation source and OS images to setup a server.</p>
<blockquote>
<p><strong>Note</strong>: To restore a ConfigMgr Site, you have to install the same SQL Version (and ServicePack) as in Production.</p>
</blockquote>
<p>and another important one:</p>
<blockquote>
<p>Marketplace Images do <strong>not</strong> include licenses for the product you install !!!</p>
</blockquote>
<h4 id="artifacts">Artifacts</h4>
<p>I&apos;m the author of several Artifacts (automatated Installation routines) in the public Azure DevTest Lab <a href="https://github.com/Azure/azure-devtestlab/tree/master/Artifacts">repository</a>  (Install RuckZuck Package, CreateDomain, ConfigurationMangaer CB + TP ...) and I often use these Artifacts for my &quot;adhoc&quot; Site Server installations. In case of a more complex Environment or a DR test, I recommend to setup (and document) the steps you need to install and restore a site manually.</p>
<h4 id="notesqlalwaysonavailabilitygroupsinazure">Note: SQL AlwaysOn availability groups in Azure</h4>
<p>I&apos;m not an SQL expert but I was able to setup an SQL AlwaysOn availability group (by following the <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/sql/virtual-machines-windows-portal-sql-availability-group-tutorial">Tutorial</a>)<br>
But the Listener was not working... I was not able to open a connection from a remote server to the Listener.. It took me a while to figure out that the Azure load balancer does need a special setup. See: <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/sql/virtual-machines-windows-portal-sql-alwayson-int-listener">Configure a load balancer for an Always On availability group in Azure</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Using NodeRed to publish data to Azure Table Storage]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>In my HomeAutomation project, I&apos;m using <a href="https://nodered.org/">NodeRed</a> and <a href="https://www.iobroker.net/">ioBroker</a> as an On-Premise Workflow engine. But for reporting, I wanted to have some data in Azure Table Storage...</p>
<p>As none of the existing NodeRed Nodes where able to fulfill my needs, I&apos;ve implemented my own Workflow with</p>]]></description><link>https://rzander.azurewebsites.net/using-nodered-to-publish-data-to-azure-table-storage/</link><guid isPermaLink="false">6229196894dbdcb06ccb3e38</guid><dc:creator><![CDATA[Roger Zander]]></dc:creator><pubDate>Sun, 27 Oct 2019 14:10:06 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>In my HomeAutomation project, I&apos;m using <a href="https://nodered.org/">NodeRed</a> and <a href="https://www.iobroker.net/">ioBroker</a> as an On-Premise Workflow engine. But for reporting, I wanted to have some data in Azure Table Storage...</p>
<p>As none of the existing NodeRed Nodes where able to fulfill my needs, I&apos;ve implemented my own Workflow with nothing else than the &quot;<strong>http request</strong>&quot; node..</p>
<p>As I have three different data-sources, the full workflow does look like this:<br>
<img src="https://rzander.azurewebsites.net/content/images/2019/10/AzureLog.png" alt="alt" loading="lazy"><br>
The first node does listen to some specific ioBroker events. The second Node will prepare the input to make a HTTP <a href="https://docs.microsoft.com/en-us/rest/api/storageservices/insert-or-merge-entity">Merge</a> request and the third node will send the request to the cloud.</p>
<p>In detail, the &quot;<strong>MERGE</strong>&quot; function is a simple script to prepare Headers, URL etc.:</p>
<pre><code>var URL = &quot;https://{StorageAccountName}.table.core.windows.net&quot;
var Table = &quot;{TableName}&quot;
var SASToken = &quot;{paste your SAS-Token here}&quot;
var PartitionKey = &quot;{aUniqueKey}&quot;
var Device = msg.topic.split(&apos;/&apos;)[2] + &quot;:&quot; + msg.topic.split(&apos;/&apos;)[3]
var Attrib = msg.topic.split(&apos;/&apos;)[4]
var body = { PartitionKey: PartitionKey ,RowKey: Device , [Attrib] : msg.payload}
msg.payload = body
msg.headers = {};
msg.headers[&apos;x-ms-version&apos;] = &apos;2017-04-17&apos;;
msg.headers[&apos;Content-Type&apos;] = &apos;application/json&apos;;
msg.headers[&apos;Accept&apos;] = &apos;application/json;odata=fullmetadata&apos;;
msg.url = URL + &quot;/&quot; + Table + &quot;(PartitionKey=&apos;&quot; + PartitionKey + &quot;&apos;,RowKey=&apos;&quot; + Device+ &quot;&apos;)&quot; + SASToken
msg.method = &apos;merge&apos;
return msg;
</code></pre>
<ul>
<li><strong>Device</strong>: unique device identifier. In my case: one row per device</li>
<li><strong>Attrib</strong>: Name of the column to store the data value</li>
<li><strong>body</strong>: JSON body including PartitionKey,RowKey and Attribute Name and Value to merge</li>
</ul>
<blockquote>
<p>Note: The benefit of using a <strong>Merge</strong> is that it will create the row if the RowKey does not exists.</p>
</blockquote>
<p>The &quot;http request&quot; node must be configured to get the Method from the msg.method property:<br>
<img src="https://rzander.azurewebsites.net/content/images/2019/10/AzureLog2.png" alt="alt" loading="lazy"></p>
<p>That&apos;s all you need to publish some data to Azure Table Storage...</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>