Nicht persistente virtuelle Geräteinfrastruktur (NP-VDI)
Mit NP-VDI kann Ihr IT-Team virtuelle Desktops zusammen mit physischen Geräten von einer einzigen einheitlichen Platform aus bereitstellen. Die integrierte automatisierte Verwaltung spart Zeit, reduziert den manuellen Aufwand und bietet eine umfassende Kontrolle über Endpunkte in Cloud-Umgebungen.
Funktions-Workflow
Agentenbereitstellung mit Basisabbild:
-
Der Agent ist auf einer bereinigten VM installiert (nicht registriert).
-
Der Agent wird anschließend manuell über das bereitgestellte Befehlszeilentool als "Basisabbild" registriert.
Versiegeln des Basisabbilds:
-
Nachdem der Basisabbild-Agent registriert und die Konfiguration validiert wurde, wird die VM über die Befehlszeile "versiegelt".
Erzeugen von Instanzen:
-
Neue NP-VDI-Instanzen können über das Basisabbild erzeugt werden, wodurch in der Regel eine neue MAC-Adresse für jede Sitzung generiert wird.
-
Ivanti Neurons erkennt und verfolgt diese als eindeutige, kurzfristige Endpunkte, die unter dem Basisabbild verwaltet werden.
Richtlinienverwaltung:
-
Richtlinienänderungen können auf Ebene des Basisabbilds vorgenommen werden. Beim nächsten Check-in übernehmen alle erzeugten Instanzen die neueste angewendete Richtlinie.
Schritt 1: Basisabbild vorbereiten
So bereiten Sie das Basisabbild vor:
- Navigieren Sie zu Agent > Agentenbereitstellung > Manuelle Installation.
- Wählen Sie auf der Registerkarte "Manuelle Installation" eine Agentenrichtlinie und einen Registrierungsschlüssel aus.
- Wählen Sie Windows aus. Wählen Sie anschließend einen Installationsmodus und klicken Sie auf Herunterladen.
Das Agenten-Installationsprogramm wird heruntergeladen.Durch diese Aktion werden zwei Dateien heruntergeladen. Speichern Sie das Installationsprogramm unter dem Dateinamen IvantiCloudAgent.exe.options. Diese Datei wird für die Installation verwendet.
- Installieren Sie den heruntergeladenen NP-VDI-Agenten.
So installieren Sie den Agenten:- Benennen Sie die zugehörige Datei IvantiCloudAgent.exe.options vor dem Installieren um.
Dadurch wird ausgeschlossen, dass die ausführbare Agentendatei die Datei .options verwendet, in der die Details zur Mandantenregistrierung enthalten sind. - Führen Sie das Installationsprogramm aus. Wenn die Option "Aktivierungsschlüssel oder Cookie" angezeigt wird, klicken Sie auf Abbrechen.
Dadurch wird der Agent auf dem Endpunkt installiert, jedoch nicht beim Mandanten registriert.
- Benennen Sie die zugehörige Datei IvantiCloudAgent.exe.options vor dem Installieren um.
- Registrieren Sie den Agenten als Basisabbild. Für die Registrierung als Basisabbild führen Sie den folgenden Befehl als Administrator vom Installationsort des Agenten aus:
STAgentCtl.exe register --asBaseImage <Base Image Name> --instanceIdType MacAddress --enrollmentkey "%enrollmentkey%" --baseurl https://agentreg.ivanticloud.com
Folgendes gilt für den obigen Befehl:
<Base Image Name> ist der Name des Geräts mit dem Basisabbild.
%enrollmentkey% ist eine Kombination aus tenantid_activationkey.
instanceIdType kann "MacAddress", "HostName" oder "Custom" sein. Mit diesem eindeutigen Flag wird die Instanz identifiziert.
Wenn "Custom" verwendet wird, kann eine tagList-Option angegeben werden, die eine durch Komma getrennte Liste benutzerdefinierter Tags enthält, um diesen Agenten zu identifizieren. Weitere Informationen zu benutzerdefinierten Tags finden Sie im Abschnitt Liste benutzerdefinierter Tags und Tags aktualisieren.
Sowohl die tenantid als auch der activationkey befinden sich in der zugehörigen .options-Datei, die zusammen mit dem Agenten heruntergeladen wird, wie im folgenden Beispiel dargestellt:
tenantid = 11111111-1111-1111-1111-4gc02d5b0f0d
activationkey = 9aI7SOQNybweiM2QKI7kcqIG8ufUFU21AvZwJwAEx6C-SAO5UGK62YkEgm89kvC2m-xwLesZA4t1_TBtEjIQMVaBU0KsVe-V60ZLBwWu83YREcUp3diAFvHjBvLtkxT3
cloudhost=https:agentreg.ivanticlouddev.comDer Registrierungsschlüssel für den obigen Code lautet:
%enrollmentkey% = 11111111-1111-1111-1111-4gc02d5b0f0d_9aI7SOQNybweiM2QKI7kcqIG8ufUFU21AvZwJwAEx6C-SAO5UGK62YkEgm89kvC2m-xwLesZA4t1_TBtEjIQMVaBU0KsVe-V60ZLBwWu83YREcUp3diAFvHjBvLtkxT3Die Befehlszeile zum Registrieren eines Geräts mit dem Beispielmandanten für ein Basisabbild mit dem Namen "Win11" sieht wie folgt aus:
STAgentCtl.exe register --asBaseImage Win11 --instanceIdType MacAddress --enrollmentkey "11111111-1111-1111-1111-4gc02d5b0f0d_9aI7SOQNybweiM2QKI7kcqIG8ufUFU21AvZwJwAEx6C-SAO5UGK62YkEgm89kvC2m-xwLesZA4t1_TBtEjIQMVaBU0KsVe-V60ZLBwWu83YREcUp3diAFvHjBvLtkxT3" --baseurl https://agentreg.ivanticloud.com
- So aktualisieren Sie das Basisabbild:
- Laden Sie das PowerShell-Skript vom Ivanti Community-Portal herunter: Ivanti-Neurons – Nicht persistente VDI – Agentenskript.
Überprüfen Sie vor dem Ausführen des PowerShell-Skripts, ob der Administrator über die entsprechenden Berechtigungen verfügt, um das Skript auf dem Basisabbild auszuführen, da dies mitunter durch die Ausführungsrichtlinie auf dem Endpunkt blockiert wird:
Verwenden Sie zum Überprüfen den Befehl Get-ExecutionPolicy.
Verwenden Sie zum Ändern den Befehl Set-ExecutionPolicy RemoteSigned.
- Wenn das Skript ohne Parameter ausgeführt wird, versucht das Skript Folgendes:
- Versiegelung des Agenten aufheben
- Updates für Agenten und Engines ausführen
- Agent erneut versiegeln
- Wenn der Agent bereits nicht versiegelt ist, sollte dies auch nach dem Update so bleiben. Führen Sie den Parameter DoNotSeal aus, um alle gleichen Schritte auszuführen, außer das Abbild zu versiegeln.
- Die Standardzeitüberschreitung für Updates beträgt 300 Sekunden. Sie können die Zeit ändern, indem Sie das Argument "-TimeoutSec" übergeben.
Zu Referenzzwecken ist eine Kopie des Skripts im Abschnitt Anhang verfügbar.
- So bereiten Sie das Basisabbild vor:
- Führen Sie den Befehl STAgentCtl.exe prepareImage aus, um ein versiegeltes, nicht persistentes Basisabbild für NP-VDI vorzubereiten.
Dieser Befehl ist obligatorisch und stoppt alle Dienste und löscht alle Daten, die sich auf die tatsächliche Agenten-ID des Basisabbilds beziehen. Beim Hochfahren der nicht persistenten Instanz werden die Dienste neugestartet.Die Agenten-ID ändert sich mit jeder nicht persistenten Instanz, die aus dem Basisabbild erzeugt wird.
- Verwenden Sie die folgenden Befehle, um das Basisabbild manuell zu versiegeln (außerhalb des Upgradeskripts):
- Um das Basisabbild manuell zu versiegeln, geben Sie STAgentCtl.exe seal ein.
Verwenden Sie den Befehl unseal, um die Versiegelung des Abbilds aufzuheben. Dieser bleibt solange aktiv, bis das System neu gestartet wird oder der Befehl seal verwendet wird.
- Um das Basisabbild manuell zu versiegeln, geben Sie STAgentCtl.exe seal ein.
- Führen Sie den Befehl STAgentCtl.exe prepareImage aus, um ein versiegeltes, nicht persistentes Basisabbild für NP-VDI vorzubereiten.
- (Optional) Bereiten Sie das Abbild mit sysprep für die Verwendung vor.
Wenn die Vorbereitung des nicht persistenten Desktops eine sysprep-Phase enthält, entfernt diese den privaten Schlüssel des Agentenzertifikats aus dem Zertifikatspeicher. Führen Sie zur Lösung des Problems folgende Schritte aus:Der Administrator muss sein eigenes Kennwort für den Zertifikatexport angeben, andernfalls schlägt dieser Vorgang fehl.
- Machen Sie die Zertifikatseriennummer mit dem Befehl certutil -store "Ivanti Cloud Agent Agent" ausfindig.
- Nach Ausführen des Befehls "stagentctl prepareImage" in Schritt 7 können Sie das Agentenzertifikat mit dem folgenden Befehl exportieren:
certutil -exportPFX -privatekey -p "%pfxpass%" "Ivanti Cloud Agent Agent" %serialnumber% "%ProgramFiles%\Ivanti\Ivanti Cloud Agent\agent.pfx" NoChain,NoRoot
Folgendes gilt für den obigen Befehl:
%pfxpass% ist ein vom Administrator bereitgestelltes Kennwort.
%serialnumber% ist die lokalisierte Seriennummer des Agentenzertifikats.
- Laden Sie das auf der Ivanti Community-Website unter Privaten Schlüssel aus exportierter .pfx-Datei wiederherstellen – Skript verfügbare Skript SetupComplete.cmd herunter.
- Bearbeiten Sie das Skript SetupComplete.cmd und ändern Sie das Kennwort so, dass es mit dem Kennwort übereinstimmt, das zum Exportieren des Zertifikats verwendet wird und in Schritt 2 verwendet wurde.
- Speichern Sie das Skript unter %WINDIR%\Setup\Scripts\SetupComplete.cmd auf dem Golden Image.
Das Skript wird automatisch ausgeführt, sobald die Windows-Einrichtung abgeschlossen ist (erfolgt beim ersten Starten des Geräts nach sysprep).Dadurch wird der private Schlüssel aus der exportierten .pfx-Datei wiederhergestellt. Anschließend werden sowohl die .pfx-Datei als auch das Skript selbst gelöscht, damit der Geheimschlüssel nicht in die nicht-persistenten Instanzen entweichen kann.
Das Zertifikat mit der subject OU "ST Agent" (z. B. "Subject: OU=ST Agent, CN=011472EFB12BABF06122F2903BBE12AC4E32EBFE5082") should be exported, using the corresponding serial number from that entry.
Schritt 2: NP-VDI-Instanzen erstellen und testen
So erzeugen Sie eine neue Instanz aus dem Basisabbild:
-
Stellen Sie sicher, dass jeder neuen Instanz eine neue MAC-Adresse zugewiesen wird (um sicherzustellen, dass die Option instanceIdType MacAddress funktioniert).
Stellen Sie alternativ sicher, dass ein anderer Hostname oder ein anderes Tag verwendet wird. -
Starten Sie die Instanz der virtuellen Maschine und prüfen Sie, ob die Instanz in der Neurons-Benutzeroberfläche als eindeutiger NP-VDI-Endpunkt angezeigt wird. Wechseln Sie dazu zum Abschnitt Agenten > Agentenverwaltung der Ivanti Neurons-Schnittstelle.
Die neue Spalte VDI-Typ gibt an, ob es sich bei dem Gerät um ein Basisabbild, ein nicht persistentes oder ein persistentes Gerät handelt. -
Jeder Endpunkt wird nun von der Seite "Agentenverwaltung" mit der Seite "Geräte" verknüpft. Klicken Sie auf den Namen des Agentenendpunkts, um ein neues Fenster zu öffnen, in dem das Gerät in der Ansicht "Geräte" angezeigt wird.
-
Klicken Sie auf die Option Verknüpfte Instanzen, um alle Instanzen anzuzeigen, die aus diesem Basisabbild erstellt wurden.
Die nicht persistenten Instanzen werden in der Geräteansicht als nicht persistent markiert.
Schritt 3: Richtlinie mit NP-VDI neu zuweisen
Gehen Sie wie folgt vor, um eine Richtlinie direkt über die Ivanti Neurons-Schnittstelle dem Basisabbild neu zuzuweisen:
-
Navigieren Sie zu Agenten > Agentenrichtlinien.
-
Wählen Sie das Basisabbild aus und wählen Sie im Menü Aktionen die Option Richtlinie neu zuweisen aus.
-
Wählen Sie die Richtlinie aus, die neu zugewiesen werden soll, und klicken Sie auf Speichern.
Daraufhin wird die Richtlinie neu zugewiesen. Nachdem die Richtlinie dem Basisabbild neu zugewiesen wurde, übernehmen alle nicht persistenten VDI-Instanzen die Richtlinie beim nächsten Check-in (standardmäßig alle 200 Minuten). -
Bestätigen Sie, dass neue Instanzen die aktualisierte Richtlinie nach dem Check-in übernehmen, entweder über die Schnittstelle Ivanti Neurons Agents oder Agent Management oder über das nicht persistente Abbild selbst, indem Sie die Befehlszeile Stagentctl status verwenden.
Neustartaktionen für eine NP-VDI-Instanz sind nicht möglich. Dies würde das Gerät auf seinen ursprünglichen Zustand zurücksetzen und möglicherweise dazu führen, dass der Benutzer die Arbeitsergebnisse verliert, die er während seiner Sitzung abgeschlossen hat.
Darüber hinaus enthalten Aktionen, die in der Geräteansicht für nicht persistente Instanzen verfügbar sind, keine Neustartaktionen.
Hinweise
Versiegelte und nicht versiegelte Agenten
Ein versiegelter Agent kann sich nicht selbst aktualisieren, neu zertifizieren oder deinstallieren. Das Verhalten eines versiegelten Agenten geht aus der nachstehenden Liste hervor:
-
Versiegelte Agenten können eine neue Richtlinie als Reaktion auf einen Check-in erhalten.
-
Versiegelte Agenten installieren oder deinstallieren keine Module aufgrund einer Richtlinienänderung.
-
-
Versiegelte Agenten aktualisieren Inhalt, jedoch keine Module.
-
Versiegelte wie nicht versiegelte Agenten versuchen nicht, sich neu zu zertifizieren.
-
Versiegelte Agenten deinstallieren sich nicht selbst.
-
Nur Agenten, die als Basisabbilder registriert sind, können versiegelt werden.
-
Ein Agent, der als Basisabbild installiert und registriert ist, wird automatisch versiegelt, nachdem sich der Agent registriert, seinen ersten Check-in durchgeführt und alle relevanten Module installiert hat.
-
Ein versiegelter Agent checkt unmittelbar nach dem Starten ein.
-
Versiegelte Agenten erweitern ihre Agenten-ID stets um eine Instanz-ID.
Neuzertifizierung
Der Prozess der Neuzertifizierung des Agenten setzt voraus, dass der Agent Ivanti Neurons mit seinem neuen öffentlichen Schlüssel aktualisiert. Diese Kommunikation wird mit dem vorhandenen Schlüsselpaar des Agenten authentifiziert. Nachdem sich ein Agent neu zertifiziert hat, geht Ivanti Neurons davon aus, dass er anschließend mit seinem neuen Zertifikat kommuniziert.
Bei NP-VDI-Instanzen bewirkt eine versehentliche oder fehlerhafte Neuzertifizierung einer Instanz, dass alle Instanzen und das Basisabbild ihre Sicherheitszuordnung zu Ivanti Neurons verlieren. Dies würde zu einer schwerwiegenden Störung aller Instanzen führen, die das Basisabbild gemeinsam nutzen. Aufgrund dieses Risikos versucht der Agent nicht, einen Agenten neu zu zertifizieren, bei dem es sich um ein NP-VDI-Basisabbild oder eine NP-VDI-Instanz handelt.
Stattdessen müssen Administratoren bei Ivanti Neurons das Basisabbild neu registrieren, um ein neues Schlüsselpaar zu erstellen. Da dies einmal alle 12 Monate empfohlen wird und wir davon ausgehen, dass die NP-VDI-Basisabbilder häufiger aktualisiert werden, betrachten wir diese Anforderung als gerechtfertigt, um die oben genannten Risiken auszuschließen.
Zusätzliche STAgentCtle.exe-Befehle
Folgende zusätzliche Befehle stehen Ihnen zur Verfügung:
-
Um den Basisagenten für Updates zu öffnen, geben Sie den Befehl Stagentctl.exe unseal ein.
-
Damit die Befehlszeile den Abschluss des Updates abwartet, bevor sie die Steuerung zurückgibt, geben Sie den Befehl Stagentctl.exe update –wait ein.
Der Befehl "wait" kann bei der Aktualisierung des Agenten Probleme verursachen, da er die Ausführung der ausführbaren Dateien des Agenten erfordert, wodurch nach dem Update ein Neustart erforderlich ist. Um dieses Problem zu vermeiden, bietet Ivanti ein PowerShell-Skript an, mit dem ein synchroner Aktualisierungsbefehl ausgeführt werden kann.
-
Geben Sie den Befehl Stagentclt.exe seal ein, um den Basisagenten für Updates zu schließen.
Benutzerdefinierte Tag-Liste
Eine benutzerdefinierte Tag-Liste ist eine benutzerdefinierte Sammlung von Tags, die Endpunkten in Ivanti Neurons zugewiesen werden kann, darunter auch NP-VDI-Instanzen. Benutzerdefinierte Tags erleichtern die Klassifizierung, Organisation und Identifizierung von Geräten basierend auf geschäftlichen, betrieblichen oder technischen Anforderungen.
Wenn Sie beispielsweise das Tag "Sales-[MacAddress]" verwenden, wird ein eindeutiges Tag für jedes Gerät generiert, indem [MacAddress] durch die tatsächliche MAC-Adresse des Geräts ersetzt wird. Diese Funktion ist besonders nützlich, um eindeutige Tags für nicht persistente VDI-Instanzen zu generieren.
Verwenden Sie die folgende Syntax, um Geräteattribute und Umgebungsvariablen zu referenzieren:
-
Verwenden Sie zum Referenzieren der MAC-Adresse [MacAddress].
-
Verwenden Sie zum Referenzieren des Hostnamens [HostName].
-
Verwenden Sie zum Referenzieren einer Umgebungsvariable [env:<name>].
Dabei steht <name> für den Namen der Umgebungsvariable, der zwischen Groß- und Kleinschreibung unterscheidet.
Tags aktualisieren
Die Tags, die während der Registrierung des Basisabbilds zugewiesen wurden, bleiben für alle zugehörigen Instanzen statisch. Wenn Sie Tags aktualisieren, das Basisabbild neu registrieren/versiegeln oder Automatisierung verwenden müssen, um Tags nach der VM-Bereitstellung basierend auf aktuellen Kriterien zuzuweisen.
Anhang
<#
.SYNOPSIS
Aktualisiert einen nicht persistenten Agenten, wartet auf den Abschluss des Updates und versiegelt dann optional den Agenten.
.PARAMETER TimeoutSec
Gesamtzeitüberschreitung in Sekunden.
.PARAMETER UpgradeCode
Upgradecode des Agenten, der gerade aktualisiert wird.
.PARAMETER DoNotSeal
Dieser Parameter gibt an, dass der Agent nach dem Update nicht versiegelt werden soll.
#>
param
(
[int] $TimeoutSec = 300,
[guid] $UpgradeCode = "{0C5D7E9C-0424-462D-A570-2A7469EE3739}", # Neurons Agent
[switch] $DoNotSeal
)
function Check-UpdatersComplete
{
$updaters = Get-Process -Name "STAgentUpdater" -ErrorAction SilentlyContinue
return ($updaters.Count -eq 0)
}
function Wait-UpdatersComplete([DateTime] $timeoutDateTime, [int] $checkIntervalSec)
{
while ((Get-Date) -lt $timeoutDateTime)
{
if (Check-UpdatersComplete)
{
return
}
Start-Sleep -Seconds $checkIntervalSec
}
throw "Timeout waiting for all updaters to complete."
}
function Get-AgentVersionFromManifest([string] $manifestPath, [string] $platformKey)
{
if (-not (Test-Path $manifestPath))
{
throw "Could not find manifest at '$manifestPath'."
}
[xml]$manifestXml = Get-Content $manifestPath
$agentFile = $manifestXml.manifest.files.file | Where-Object { $_.key -eq $platformKey }
if (-not ($agentFile))
{
throw "Agent entry with key='$platformKey' not found."
}
if (-not ($agentFile.version))
{
throw "Unable to find agent version in manifest."
}
return [version]::Parse($agentFile.version)
}
function Get-CurrentAgentVersion([guid] $agentUpgradeCode)
{
$agentProductCode = Get-ProductCode -UpgradeCode $agentUpgradeCode
$agentObject = Get-WmiObject -Class Win32_Product | Where-Object { [guid]::Parse($_.IdentifyingNumber) -eq $agentProductCode }
if (-not ($agentObject))
{
throw "Installed agent not found."
}
if (-not ($agentObject.Version))
{
throw "Installed agent version not found."
}
return [version]::Parse($agentObject.Version)
}
function Check-AgentUpToDate([string] $manifestPath, [guid] $agentUpgradeCode, [string] $platformKey)
{
$manifestVersion = Get-AgentVersionFromManifest -ManifestPath $manifestPath -PlatformKey $platformKey
$currentVersion = Get-CurrentAgentVersion -AgentUpgradeCode $agentUpgradeCode
return ($currentVersion -ge $manifestVersion)
}
function Wait-AgentUpdated([DateTime] $timeoutDateTime, [int] $checkIntervalSec, [string] $manifestPath, [guid] $agentUpgradeCode, [string] $platformKey)
{
while ((Get-Date) -lt $timeoutDateTime)
{
if (Check-AgentUpToDate -ManifestPath $manifestPath -AgentUpgradeCode $agentUpgradeCode -PlatformKey $platformKey)
{
return
}
Start-Sleep -Seconds $checkIntervalSec
}
throw "Waiting for agent update timed out."
}
function Update-Agent([DateTime] $timeoutDateTime, [string] $manifestPath, [guid] $agentUpgradeCode, [string] $agentCtlPath, [string] $platformKey)
{
$timeoutSec = [math]::Ceiling(($timeoutDateTime - (Get-Date)).TotalSeconds)
if ($timeoutSec -le 0)
{
throw "Can't run check-in because of small timeout."
}
& $agentCtlPath update --checkin --wait $timeoutSec
if (-not $?)
{
throw "Check-in operation failed."
}
& $agentCtlPath update --all
if (-not $?)
{
throw "Update operation failed."
}
Wait-AgentUpdated -TimeoutDateTime $timeoutDateTime -CheckIntervalSec 1 -ManifestPath $manifestPath -AgentUpgradeCode $agentUpgradeCode -PlatformKey $platformKey
Wait-UpdatersComplete -TimeoutDateTime $timeoutDateTime -CheckIntervalSec 1
$timeoutSec = [math]::Ceiling(($timeoutDateTime - (Get-Date)).TotalSeconds)
if ($timeoutSec -le 0)
{
throw "Can't run final update because of small timeout."
}
& $agentCtlPath update --all --wait $timeoutSec
if (-not $?)
{
throw "Final update operation failed."
}
}
function Get-ProductCode([guid] $upgradeCode)
{
$upgradeCodeStr = $upgradeCode.ToString("B") # Format as {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
$wmiFilter = "Property='UpgradeCode' AND Value='$upgradeCodeStr'"
$productCode = @(Get-WmiObject -Class Win32_Property -Filter $wmiFilter).ProductCode
if ($productCode.Count -eq 0)
{
throw "Upgrade code '$upgradeCode' not found."
}
if ($productCode.Count -gt 1)
{
throw "Multiple products with the same upgrade code '$upgradeCode' were found."
}
return [guid]::Parse($productCode)
}
function Get-AgentEnvironment([string] $installDirPath)
{
$configPath = Join-Path $installDirPath "AgentEnvironment.config"
if (-Not (Test-Path $configPath))
{
throw "Config file not found at $configPath."
}
[xml]$agentEnvironment = Get-Content $configPath
return $agentEnvironment
}
function Get-InstallLocation([guid] $productCode)
{
$productObject = Get-WmiObject -Class Win32_Product | Where-Object { [guid]::Parse($_.IdentifyingNumber) -eq $productCode }
if ($null -eq $productObject)
{
throw "The product GUID was not found."
}
return $productObject.InstallLocation
}
$timeoutDateTime = (Get-Date).AddSeconds($TimeoutSec)
Write-Host "Gathering information..."
try
{
$agentProductCode = Get-ProductCode -UpgradeCode $UpgradeCode
$installDirPath = Get-InstallLocation -ProductCode $agentProductCode
Write-Host " Install directory: $installDirPath"
$agentEnvironment = Get-AgentEnvironment -InstallDirPath $installDirPath
$dataDirPath = $agentEnvironment.agentEnvironment.agentDataDirectory
Write-Host " Data directory: $dataDirPath"
$regPath = Join-Path "HKLM:" $agentEnvironment.agentEnvironment.registryPath
Write-Host " Registry key: $regPath"
$platformKey = Get-ItemProperty -Path $regPath -Name "PlatformManifestKey" -ErrorAction Stop | Select-Object -ExpandProperty "PlatformManifestKey" -ErrorAction Stop
Write-Host " Platform key: $platformKey"
$agentCtlPath = Join-Path $installDirPath "STAgentCtl.exe"
$manifestPath = Join-Path $dataDirPath "manifest.xml"
}
catch
{
Write-Error "ERROR: $_"
exit -1
}
if ((Get-Date) -gt $timeoutDateTime)
{
Write-Error "ERROR: The timeout expired before the agent update could begin."
exit -1
}
Write-Host "Unsealing the agent..."
& $agentCtlPath unseal
if (-not $?)
{
Write-Error "ERROR: can't perform unseal operation."
exit -1
}
Write-Host "Updating the agent..."
$result = -1
try
{
Update-Agent -TimeoutDateTime $timeoutDateTime -ManifestPath $manifestPath -AgentUpgradeCode $UpgradeCode -AgentCtlPath $agentCtlPath -PlatformKey $platformKey
$result = 0
}
catch
{
Write-Error "ERROR: $_"
}
if ($DoNotSeal)
{
if ($result -eq 0)
{
Write-Host "The agent has been successfully updated."
}
else
{
Write-Error "ERROR: agent update failed."
}
exit $result
}
Write-Host "Sealing the agent..."
& $agentCtlPath seal
if (-not $?)
{
Write-Error "ERROR: can't seal the agent!"
exit -1
}
if ($result -eq 0)
{
Write-Host "The agent has been successfully updated and sealed."
}
exit $result
(@ECHO OFF
set pw=supersecret
set logfile=C:\ProgramData\Ivanti\Ivanti Cloud Agent\Logs\agentkeyrestore.log
set certFile=C:\Program Files\Ivanti\Ivanti Cloud Agent\agent.pfx
set scriptPath=%0%
ECHO %date% %time% Agent key restore started >> "%logfile%"
IF EXIST "%certFile%" (
certutil -f -p "%pw%" -privatekey -importPFX "Ivanti Cloud Agent Agent" "%certFile%" NoCert,NoExport >> "%logfile%" 2>&1
IF %ERRORLEVEL% NEQ 0 (
ECHO Failed to import agent key >> "%logfile%"
)
ECHO Removing agent key file >> "%logfile%"
del "%certFile%" >> "%logfile%" 2>&1
IF %ERRORLEVEL% NEQ 0 (
ECHO Failed to delete agent key file >> "%logfile%"
)
ECHO %date% %time% Agent key restore complete >> "%logfile%"
) ELSE (
ECHO %date% %time% Agent key restore failed: no agent key file found >> "%logfile%"
)
ECHO Removing script >> "%logfile%"
del "%scriptPath%" >> "%logfile%" 2>&1
"REM no further commands can be executed from this point because script file has been deleted"