Office-Updates lassen sich anhand der URLs nur schwer unterscheiden. In WSUS Offline Update werden Office-Updates deshalb anhand der Produkt-Kategorie-Id identifiziert. Die richtige Zuordnung setzt aber voraus, dass in der Datei UpdateCategoriesAndFileIds.txt die Bundle-Records immer vor den untergeordneten Update-Records stehen. Diese Sortierung fehlt leider in der Datei wsusscn2.cab vom 10.12.2019 03:27.
Ein neuer Ansatz könnte sein, mit einer XSLT-Datei direkt die Produkt-Kategorie-Id auszuwählen und dann die RevisionId und UpdateId auszugeben:
- Code: Select all
<?xml version="1.0"?>
<!--
Author: H. Buhrmester, 2019
Filename: extract-office-revision-update-ids.xsl
This file selects Office updates by the ProductFamily Id
"477b856e-65c4-4473-b621-a8b230bb70d9".
The distinction of the categories by type - UpdateClassification,
ProductFamily, Company, Product - is not necessary at this point,
because all UUIDs should be unique by definition.
https://en.wikipedia.org/wiki/Universally_unique_identifier
This xslt file extracts the following fields:
Field 1: Bundle RevisionId
Field 2: UpdateId
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:__="http://schemas.microsoft.com/msus/2004/02/OfflineSync" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="no" method="text" />
<xsl:template match="/">
<xsl:for-each select="__:OfflineSyncPackage/__:Updates/__:Update/__:Categories/__:Category[@Id='477b856e-65c4-4473-b621-a8b230bb70d9']">
<xsl:text>#</xsl:text>
<xsl:value-of select="../../@RevisionId" />
<xsl:text>#,</xsl:text>
<xsl:value-of select="../../@UpdateId" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Diese Datei ignoriert die verschiedenen Kategorie-Typen: UpdateClassification, ProductFamily, Company und Product. Diese Unterscheidung sollte aber auch nicht notwendig sein, da alle UUIDs eindeutig sein sollten (tatsächlich gibt es mindestens eine Überschneidung mit den Update-Ids, aber die werden aufgrund des unterschiedlichen Pfades ausgeschlossen):
https://en.wikipedia.org/wiki/Universally_unique_identifierUm das Ergebnis zu überprüfen, braucht man zwei weitere XSLT-Dateien: Die Dateien extract-update-revision-and-file-ids.xsl und extract-update-cab-exe-ids-and-locations.xsl sind in WSUS Offline Update bereits enthalten und werden für die Berechnung der superseded Updates eingesetzt. Sie befinden sich im Ordner wsusoffline/xslt.
https://forums.wsusoffline.net/viewtopic.php?f=5&t=5676Mit der XSLT-Datei extract-update-revision-and-file-ids.xsl wird die Datei BundledUpdateRevisionAndFileIds.txt erstellt. Diese enthält die Zuordnung von Bundle-RevisionIds und Update-RevisionIds in den ersten beiden Spalten. Die dritte Spalte enthält die FileIds der Payload Files.
Die dritte XSLT-Datei extract-update-cab-exe-ids-and-locations.xsl erstellt die Datei UpdateCabExeIdsAndLocations.txt mit den FileIds und URLs.
Durch die Verknüpfung dieser Dateien kommt man also von den Office-Bundle-RevisionIds zu den FileIds und den URLs.
Das Ergebnis ist eine Liste mit 5581 Office-URLs, aber ohne Links, die nicht dazugehören.
Ein Shell-Skript zum Extrahieren aller Office-Downloads ist:
- Code: Select all
#!/bin/bash
# extract-office-locations.bash
# Sample implementation for the extraction of all Office updates.
export LC_ALL=C
# Extract File 1, featuring a new xslt file
echo "Extracting office-revision-update-ids.txt ..."
xmlstarlet transform \
extract-office-revision-update-ids.xsl \
package.xml \
| sort --unique \
> office-revision-update-ids.txt
# Extract File 2, using xslt file from the calculation of superseded
# updates
echo "Extracting BundledUpdateRevisionAndFileIds.txt ..."
xmlstarlet transform \
extract-update-revision-and-file-ids.xsl \
package.xml \
| sort --unique \
> BundledUpdateRevisionAndFileIds.txt
# Extract File 3, using xslt file from the calculation of superseded
# updates
echo "Extracting UpdateCabExeIdsAndLocations.txt ..."
xmlstarlet transform \
extract-update-cab-exe-ids-and-locations.xsl \
package.xml \
| sort --unique \
> UpdateCabExeIdsAndLocations.txt
# Join first two files to get the FileIds
echo "Creating file office-file-ids.txt ..."
join -t ',' -o 2.3 \
office-revision-update-ids.txt \
BundledUpdateRevisionAndFileIds.txt \
| sort --unique \
> office-file-ids.txt
# Join with third file to get the FileLocations (URLs)
echo "Creating file office-locations.txt ..."
join -t ',' -o 2.2 \
office-file-ids.txt \
UpdateCabExeIdsAndLocations.txt \
| sort --unique \
> office-locations.txt
exit 0
Dasselbe als Batch-Datei:
- Code: Select all
@echo off
REM Example script to extract all Office updates
REM H. Buhrmester, 2019
REM
REM - XSLT.vbs is in wsusoffline\cmd
REM - gsort.exe and join.exe are in wsusoffline\bin
REM - extract-update-revision-and-file-ids.xsl and
REM extract-update-cab-exe-ids-and-locations.xsl are in wsusoffline\xslt
REM - package.xml must be extracted from wsusscn2.cab
REM
REM Put everything into one directory to run this script
set CSCRIPT_PATH=%SystemRoot%\System32\cscript.exe
echo Extracting office-revision-update-ids.txt ...
%CSCRIPT_PATH% //Nologo //E:vbs XSLT.vbs package.xml extract-office-revision-update-ids.xsl office-revision-update-ids-unsorted.txt
gsort.exe -u -T "%TEMP%" office-revision-update-ids-unsorted.txt > office-revision-update-ids.txt
echo Extracting BundledUpdateRevisionAndFileIds.txt ...
%CSCRIPT_PATH% //Nologo //E:vbs XSLT.vbs package.xml extract-update-revision-and-file-ids.xsl BundledUpdateRevisionAndFileIds-unsorted.txt
gsort.exe -u -T "%TEMP%" BundledUpdateRevisionAndFileIds-unsorted.txt > BundledUpdateRevisionAndFileIds.txt
echo Extracting UpdateCabExeIdsAndLocations.txt ...
%CSCRIPT_PATH% //Nologo //E:vbs XSLT.vbs package.xml extract-update-cab-exe-ids-and-locations.xsl UpdateCabExeIdsAndLocations-unsorted.txt
gsort.exe -u -T "%TEMP%" UpdateCabExeIdsAndLocations-unsorted.txt > UpdateCabExeIdsAndLocations.txt
echo Creating file office-file-ids.txt ...
join.exe -t "," -o "2.3" office-revision-update-ids.txt BundledUpdateRevisionAndFileIds.txt > office-file-ids-unsorted.txt
gsort.exe -u -T "%TEMP%" office-file-ids-unsorted.txt > office-file-ids.txt
echo Creating File office-locations.txt ...
join.exe -t "," -o "2.2" office-file-ids.txt UpdateCabExeIdsAndLocations.txt > office-locations-unsorted.txt
gsort.exe -u -T "%TEMP%" office-locations-unsorted.txt > office-locations.txt