Niet-permanente infrastructuur virtueel apparaat (NP-VDI)
Met NP-VDI kan uw IT-team snel virtuele bureaubladen, samen met fysieke apparaten inrichten, alles van één geïntegreerd platform. Het ingebouwde automatische beheer bespaart tijd, vermindert de handmatige werklast en verkrijgt uitgebreide controle over eindpunten in cloudomgevingen.
Functieworkflow
Agentimplementatie op basisimage
-
De agent is geïnstalleerd (niet geregistreerd) op een schone VM.
-
De agent wordt vervolgens handmatig geregistreerd als een "basisimage" met de geleverde opdrachtregelprogramma’s.
De basisimage afsluiten:
-
Zodra de agent van de basisimage is geregistreerd en de configuratie is gevalideerd, wordt de VM "verzegeld"via de opdrachtregel.
Produceringsexemplaren:
-
Er kunnen nieuwe NP-VDI-exemplaren worden opgestart vanaf de basisimage, waarbij doorgaans voor nieuw MAC-adres wordt gegenereerd voor elke sessie.
-
Ivanti Neurons detecteert en volgt deze als unieke eindpunten op korte termijn die worden beheerd onder de basisimage.
Beleidsbeheer
-
Beleidswijzigingen kunnen worden gemaakt op het niveau van de basisimage. Alle geproduceerde exemplaren neem het laatst toegepaste beleid over bij de volgende aanmelding.
Stap 1: De basisimage voorbereiden
Volg deze stappen om de basisimage voor te bereiden:
- Navigeer naar Agent > Agentimplementatie > Handmatige installatie.
- Kies een agentbeleid en inschrijvingssleutel op het tabblad Handmatige installatie.
- Selecteer Windows. Kies dan een Installatiemodus en klik op Downloaden.
Het installatieprogramma van de agent wordt gedownload.Deze actie downloadt twee bestanden. Sla het installatieprogramma op met de bestandsnaam "IvantiCloudAgent.exe.options". Dit bestand zal worden gebruikt voor de installatie.
- Installeer de gedownloade NP-VDI-agent.
De agent installeren:- Wijzig de naam van het gekoppelde bestand IvantiCloudAgent.exe.options vóór de installatie.
- Voer het installatieprogramma uit: Wanneer de optie Activeringssleutel of Cookie verschijnt, klikt u op Annuleren.
Dit installeert de agent op het eindpunt zonder het te registreren naar de tenant.
- Reigstreer de agent als een basisimage. Om een basisimage te registreren, voert u de volgende opdracht uit als een beheerder vanaf de installatielocatie van de agent:
STAgentCtl.exe register --asBaseImage <Base Image Name> --instanceIdType MacAddress --enrollmentkey "%enrollmentkey%" --baseurl https://agentreg.ivanticloud.com
In de bovenstaande opdracht:
is <Base Image Name> de naam van het basisimage-apparaat.
is %enrollmentkey% een combinatie van tenantid_activationkey.
instanceIdType kan "Mac-adres", "Hostnaam" of “Aangepast” zijn. Dit wordt gebruikt als de unieke vlag voor het identificeren van het exemplaar.
Als "Aangepast" wordt gebruikt, kan een tagList-optie met een door komma's gescheiden lijst van aangepaste tags worden opgegeven om die agent te identificeren. Raadpleeg de sectie Lijst aangepast tags en Tags bijwerken voor meer informatie over aangepaste tags.
Zowel de tenantid als activationkey kunnen worden gevonden in het gekoppelde .options-bestand, gedownload met de agent zoals weergegeven in het onderstaande voorbeeld:
tenantid = 11111111-1111-1111-1111-4gc02d5b0f0d
activationkey = 9aI7SOQNybweiM2QKI7kcqIG8ufUFU21AvZwJwAEx6C-SAO5UGK62YkEgm89kvC2m-xwLesZA4t1_TBtEjIQMVaBU0KsVe-V60ZLBwWu83YREcUp3diAFvHjBvLtkxT3
cloudhost=https:agentreg.ivanticlouddev.comDe inschrijvingssleutel voor de bovenstaande code is:
%enrollmentkey% = 11111111-1111-1111-1111-4gc02d5b0f0d_9aI7SOQNybweiM2QKI7kcqIG8ufUFU21AvZwJwAEx6C-SAO5UGK62YkEgm89kvC2m-xwLesZA4t1_TBtEjIQMVaBU0KsVe-V60ZLBwWu83YREcUp3diAFvHjBvLtkxT3De opdrachtregel voor het registreren van een apparaat met de voorbeeldtenant voor een basisimage met de naam “Win11” zal als volgt zijn:
STAgentCtl.exe register --asBaseImage Win11 --instanceIdType MacAddress --enrollmentkey “11111111-1111-1111-1111-4gc02d5b0f0d_9aI7SOQNybweiM2QKI7kcqIG8ufUFU21AvZwJwAEx6C-SAO5UGK62YkEgm89kvC2m-xwLesZA4t1_TBtEjIQMVaBU0KsVe-V60ZLBwWu83YREcUp3diAFvHjBvLtkxT3" --baseurl https://agentreg.ivanticloud.com
- De basisimage bijwerken:
- Download het PowerShell-script van het Ivanti community-portaal: Ivanti-Neurons -Niet-permanente-VDI - Agentscript.
Voordat u het PowerShell-script uitvoert, moetu controleren of de beheerder de relevante machtigingen heeft om dit uit te voeren op de basisimage amdat het uitvoeringsbeleid op het eindpunt dit kan blokkeren:
Gebruik de opdracht "Get-ExecutionPolicy" om te controleren.
Gebruik de opdracht "Set-ExecutionPolicy RemoteSigned" om te wijzigen.
- Als het script wordt uitgevoerd zonder enige parameters, zal het script het volgende proberen:
- Ontzegelen van de agent.
- Updates uitvoeren voor zowel agenten als engines.
- De agent opnieuw verzegelen.
- Als de agent al ontzegeld is en deze ontzegeld moet blijven na de update. Geef de parameter "DoNotSeal" door om alle stappen uit te voeren, behalve het verzegelen van de image.
- De standaard time-out voor updates is 300 seconden. U kunt de tijd wijzigen door het argument “-TimeoutSec” door te geven.
Voor extra referenties is een kopie van het script toegankelijk onder de sectie Bijlage.
- De basisimage voorbereiden:
- Voer de opdracht "STAgentCtl.exe prepareImage" uit om een verzegelde, niet-permanente basisimage te maken die gereed is voor NP-VDI.
Deze opdracht is verplicht en stopt alle services en verwijdert alle gegevens die verwant zijn met de huidige Agent-id van de basis-image. Wanneer het niet-permanente exemplaar opstart, worden de services opnieuw opgestart.De agent-id zal wijzigen met elk niet-permanent exemplaar dat vanaf de basisimage wordt opgestart.
- Gebruik de volgende opdrachten om de basisimage handmatig te verzegelen (buiten het upgradescript):
- Om de basisimage handmatig te verzegelen, voert u "STAgentCtl.exe seal" in.
Gebruik de opdracht "unseal" om het beeld te ontzegelen. Deze blijft actief tot het opnieuw opstarten van het systeem of wanneer de opdracht "Verzegelen" wordt gebruikt.
- Om de basisimage handmatig te verzegelen, voert u "STAgentCtl.exe seal" in.
- Voer de opdracht "STAgentCtl.exe prepareImage" uit om een verzegelde, niet-permanente basisimage te maken die gereed is voor NP-VDI.
- (Optioneel) Bereid de image voor op gebruik met "sysprep".
Als de voorbereiding van de niet-permanente desktop een sysprep-fase is, wordt de privésleutel van het agentcertificaat verwijderd uit de certificaatopslag. Volg deze stappen om dit probleem aan te pakken:De beheerder moet zijn eigen exportwachtwoord voor het certificaat leveren, anders zal dit proces mislukken.
- Zoek het serienummer van het certificaat met de opdracht certutil -store “Ivanti Cloud Agent Agent”.
Dit toont het certificaat in de agentcertificaatopslag. - Na het uitvoeren van de opdracht “stagentctl prepareImage” in Stap 7, kunt u het agentcertificaat exporteren met de volgende opdracht:
certutil -exportPFX -privatekey -p "%pfxpass%" “Ivanti Cloud Agent Agent” %serialnumber% "%ProgramFiles%\Ivanti\Ivanti Cloud Agent\agent.pfx" NoChain,NoRoot
In de bovenstaande opdracht:
%pfxpass% is een wachtwoord die door de beheerder is geleverd.
%serialnumber% is het gevonden serienummer van het agentcertificaat.
- Download het script SetupComplete.cmd dat hier beschikbaar is vanaf de website van de Ivanti-community: Privésleutel herstellen vanaf het bestandsscript exported .pfx.
- Bewerk het script SetupComplete.cmd en werk het wachtwoord bij om het af te stemmen op het wachtwoord dat wordt gebruikt voor het exporteren van het certificaat dat wordt in Stap 2 wordt gebruikt.
- Bewaar het script op %WINDIR%\Setup\Scripts\SetupComplete.cmd op de gouden afbeelding.
Het script wordt automatisch één keer uitgevoerd zodra de Windows-instelling is voltooid (Dit is wat er gebeurt wanneer het apparaat de eerste keer wordt opgestart na de sysprep).Dit zal de privésleutel van het geëxporteerde pfx-bestand herstellen en vervolgens zowel het pfx-bestand als het script zelf verwijderen zodat het geheim niet wordt gelekt in de niet-permanente exemplaren.
Het certificaat met het onderwerp OU “ST Agent” (bijv. "Subject: OU=ST Agent, CN=011472EFB12BABF06122F2903BBE12AC4E32EBFE5082”) moet worden geëxporteerd met het overeenkomende serienummer van dat gegeven.
- Zoek het serienummer van het certificaat met de opdracht certutil -store “Ivanti Cloud Agent Agent”.
Stap 2: NP-VDI-exemplaren maken en testen
Om een nieuw exemplaar op te starten vanaf de basisimage, volgt u deze stappen:
-
Zorg dat er een nieuw MAC-adres is toegewezen aan elk exemplaar (om te verzekeren dat de optie instanceIdType MacAddress zal werken).
U kunt er ook voor zorgen dat een andere hostnaam of tag wordt gebruikt. -
Start het exemplaar van de virtuele machine en bevestig dat het exemplaar verschijnt in de Neurons UI als een uniek NP-VDI-eindpunt. Ga hiervoor naar de sectie Agenten > Agentbeheer van de Ivanti Neurons-interface.
Er is een nieuwe kolom VDI-type beschikbaar die aangeeft of het apparaat een basisimage-, niet-permanent of permanent apparaat. -
Elke agenteindpunt is nu gekoppeld van de pagina Agentbeheer naar de pagina Apparaten. Klik op de naam van het Agenteindpunt om een nieuw venster te starten met het apparaat in de Apparaatweergave.
-
Klik op de optie Gekoppelde exemplaren om alle exemplaren die zijn opgestart vanaf deze basisafbeelding, weer te geven.
De Niet-permanente exemplaren worden getagd als Niet-permanent in de apparaatweergave/
Stap 3: het beleid opnieuw toewijzen met NP-VDI
Volg deze stappen om een beleid direct opnieuw toe te wijzen aan de basisimage vanaf de Ivanti Neurons-interface:
-
Navigeer naar Agenten > Agentbeleidslijnen.
-
Selecteer de basisimage en kies Beleid opnieuw toewijzen vanaf het menu Acties.
-
Kies het beleid om het opnieuw toe te wijzen en klik op Opslaan.
Hiermee wordt het beleid opnieuw toegewezen. Nadat het beleid opnieuw is toegewezen naar de basisimage, zullen alle niet-permanente VDI-exemplaren het beleid overnemen wanneer ze de volgende keer aanmelden (dit is standaard elke 200 minuten). -
Valideer dat nieuwe exemplaren het bijgewerkte beleid overnemen na het aanmelden, ofwel via de Ivanti Neurons Agents- of Agent Management-interface of vanaf de niet-permanente image zelf, met de opdrachtregel "Stagentctl-status".
Het is niet mogelijk om herstartacties uit te voeren op een NP-VDI-exemplaar. Dit zou het apparaat naar zijn oorspronkelijke status resetten, waardoor de gebruiker mogelijk het werk kwijtraakt dat tijdens sessie werd voltooid.
Daarnaast bevatten de acties die via het overzicht Apparaten beschikbaar zijn voor niet-permanente exemplaren, geen acties voor het opnieuw opstarten.
Extra STAgentCtle.exe opdrachten
U kunt de volgende extra opdrachten gebruiken:
-
Om de basisagent voor updates te openen, voert u de opdracht "Stagentctl.exe ontzegelen" uit.
-
Om de opdrachtregel om te wachten tot de update is voltooid, te forceren voordat de besturing wordt weergegeven, voert u de opdracht "Stagentctl.exe update –wait" in.
De opdracht "wachten" kan problemen aantreffen wanneer de agent wordt bijgewerkt omdat de uitvoerbare bestanden van de agent hiervoor moeten worden uitgevoerd waardoor opnieuw moet worden opgestart na de update. Om dit probleem biedt Ivanti een PowerShell-script dat toestaat dat een synchrone updateopdracht wordt uitgevoerd.
-
Om de basisagent voor updates te sluiten, voert u de opdracht "Stagentctl.exe verzegelen" uit.
Lijst aangepaste tags
Een Lijst aangepaste tags is een door gebruikers gedefinieerde verzameling van tags die kan worden toegewezen aan eindpunten in Ivanti Neurons, inclusief NP-VDI-exemplaren. Aangepaste tags helpen bij het classificeren, organiseren en identificeren van apparaten op basis van zakelijke, operationele of technische vereisten.
Als u de tag "Verkoop-[MacAddress]" gebruikt, wordt een unieke tag gegenereerd voor elk apparaat door [MacAddress] te vervangen door het werkelijke MAC-adres van het apparaat.. Deze functie is vooral nuttig voor het genereren van unieke tags voor niet-permanente VDI-exemplaren.
Gebruik de volgende syntaxis om te verwijzen naar apparaatkenmerken en omgevingsvariabelen:
-
Om te verwijzen naar het MAC-adres, gebruikt u "[MacAddress]"
-
Om te verwijzen naar de hostnaam, gebruikt u [HostName]"
-
Om te verwijzen naar een omgevingsvariabele, gebruikt u "[env:<name>]"
Waarbij <name> de hoofdlettergevoelige naam van de omgevingsvariabele is..
Tags bijwerken
Tags die zijn toegewezen tijdens de registratie van de basisimage, blijven statisch voor alle gekoppelde exemplaren. Als u tags moet bijwerken, registreert/verzegelt u de basisimage opnieuw of gebruikt u automatisering voor het toewijzen van tags op basis van de huidige criteria na de VM-implementatie.
Bijlage
.SYNOPSIS
Werkt een niet-permanente agent bij terwijl wordt gewacht tot de update is voltooid en verzegelt daarna optioneel de agent.
.PARAMETER TimeoutSec
Totale time-out in seconden.
.PARAMETER UpgradeCode
Upgradecode van de agent die moet worden bijgewerkt.
.PARAMETER DoNotSeal
Deze parameter bepaalt om de agent niet te verzegelen na het bijwerken.
#>
param
(
[int] $TimeoutSec = 300,
[guid] $UpgradeCode = "{0C5D7E9C-0424-462D-A570-2A7469EE3739}", # Neurons Agent
[switch] $DoNotSeal
)
functiecontrole-UpdatersComplete
{
$updaters = Get-Process -Name "STAgentUpdater" -ErrorAction SilentlyContinue
return ($updaters.Count -eq 0)
}
functie Wait-UpdatersComplete([DateTime] $timeoutDateTime, [int] $checkIntervalSec)
{
terwijl ((Get-Date) -lt $timeoutDateTime)
{
als (Check-UpdatersComplete)
{
return
}
Start-slapen -Seconden $checkIntervalSec
}
throw "Time-out bij wachten tot alle updaters zijn voltooid."
}
functie Get-AgentVersionFromManifest([string] $manifestPath, [string] $platformKey)
{
if (-not (Test-Path $manifestPath))
{
throw "Kan manifest niet vinden op '$manifestPath'."
}
[xml]$manifestXml = Get-Content $manifestPath
$agentFile = $manifestXml.manifest.files.file | Where-Object { $_.key -eq $platformKey }
als (-not ($agentFile))
{
throw "Agent-invoer met sleutel='$platformKey' not found."
}
als (-not ($agentFile.version))
{
throw "Kan agentversie niet vinden in manifest."
}
return [version]::Parse($agentFile.version)
}
functie Get-CurrentAgentVersion([guid] $agentUpgradeCode)
{
$agentProductCode = Get-ProductCode -UpgradeCode $agentUpgradeCode
$agentObject = Get-WmiObject -Class Win32_Product | Where-Object { [guid]::Parse($_.IdentifyingNumber) -eq $agentProductCode }
als (-not ($agentObject))
{
throw "Geïnstalleerde agent niet gevonden."
}
als (-not ($agentObject.Version))
{
throw "Geïnstalleerde agentversie niet gevonden."
}
return [version]::Parse($agentObject.Version)
}
functie Check-AgentUpToDate([string] $manifestPath, [guid] $agentUpgradeCode, [string] $platformKey)
{
$manifestVersion = Get-AgentVersionFromManifest -ManifestPath $manifestPath -PlatformKey $platformKey
$currentVersion = Get-CurrentAgentVersion -AgentUpgradeCode $agentUpgradeCode
return ($currentVersion -ge $manifestVersion)
}
functie 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-slapen -Seconden $checkIntervalSec
}
throw "Wachten tot time-out agentupdate optreedt."
}
functie Update-Agent([DateTime] $timeoutDateTime, [string] $manifestPath, [guid] $agentUpgradeCode, [string] $agentCtlPath, [string] $platformKey)
{
$timeoutSec = [math]::Ceiling(($timeoutDateTime - (Get-Date)).TotalSeconds)
als ($timeoutSec -le 0)
{
throw "Kan aanmelden niet uitvoeren vanwege een kleine time-out."
}
& $agentCtlPath update --checkin --wait $timeoutSec
als (-not $?)
{
throw "Inchecken bewerking is mislukt."
}
& $agentCtlPath update --all
als (-not $?)
{
throw "Bijwerken bewerking is mislukt."
}
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)
als ($timeoutSec -le 0)
{
throw "Kan laatste update niet uitvoeren vanwege een kleine time-out."
}
& $agentCtlPath update --all --wait $timeoutSec
als (-not $?)
{
throw "Laatste updatebewerking is mislukt."
}
}
functie 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
als ($productCode.Count -eq 0)
{
throw "Upgradecode '$upgradeCode' niet gevonden."
}
als ($productCode.Count -gt 1)
{
throw "Er zijn meerdere producten met dezelfde upgradecode '$upgradeCode' gevonden."
}
return [guid]::Parse($productCode)
}
functie Get-AgentEnvironment([string] $installDirPath)
{
$configPath = Join-Path $installDirPath "AgentEnvironment.config"
als (-Not (Test-Path $configPath))
{
throw "Configuratiebestand niet gevonden op $configPath."
}
[xml]$agentEnvironment = Get-Content $configPath
return $agentEnvironment
}
functie Get-InstallLocation([guid] $productCode)
{
$productObject = Get-WmiObject -Class Win32_Product | Where-Object { [guid]::Parse($_.IdentifyingNumber) -eq $productCode }
als ($null -eq $productObject)
{
throw "De product-GUID is niet gevonden."
}
return $productObject.InstallLocation
}
$timeoutDateTime = (Get-Date).AddSeconds($TimeoutSec)
Schrijven-host "Informatie verzamelen..."
proberen
{
$agentProductCode = Get-ProductCode -UpgradeCode $UpgradeCode
$installDirPath = Get-InstallLocation -ProductCode $agentProductCode
Schrijven-host " Installatiemap: $installDirPath"
$agentEnvironment = Get-AgentEnvironment -InstallDirPath $installDirPath
$dataDirPath = $agentEnvironment.agentEnvironment.agentDataDirectory
Schrijven-host " gegevensmap: $dataDirPath"
$regPath = Join-Path "HKLM:" $agentEnvironment.agentEnvironment.registryPath
Schrijven-host " Registersleutel: $regPath"
$platformKey = Get-ItemProperty -Path $regPath -Name "PlatformManifestKey" -ErrorAction Stop | Select-Object -ExpandProperty "PlatformManifestKey" -ErrorAction Stop
Schrijven-host " Platformsleutel: $platformKey"
$agentCtlPath = Join-Path $installDirPath "STAgentCtl.exe"
$manifestPath = Join-Path $dataDirPath "manifest.xml"
}
catch
{
Write-Error "ERROR: $_"
exit -1
}
als ((Get-Date) -gt $timeoutDateTime)
{
Schrijven-Fout "FOUT: time-out verstreken voordag de agentupdate kon starten."
exit -1
}
Schrijven-Host "De agent ontzegelen..."
& $agentCtlPath unseal
als (-not $?)
{
Schrijven-fout "FOUT: kan ontzegeling niet uitvoeren."
exit -1
}
Schrijven-Host "De agent bijwerken..."
$result = -1
proberen
{
Update-Agent -TimeoutDateTime $timeoutDateTime -ManifestPath $manifestPath -AgentUpgradeCode $UpgradeCode -AgentCtlPath $agentCtlPath -PlatformKey $platformKey
$result = 0
}
catch
{
Write-Error "ERROR: $_"
}
als ($DoNotSeal)
{
als ($result -eq 0)
{
Schrijven-Host "De agent is bijgewerkt."
}
anders
{
Schrijven-fout "FOUT: agent-update is mislukt."
}
exit $result
}
Schrijven-Host "De agent verzegelen..."
& $agentCtlPath seal
als (-not $?)
{
Schrijven-fout "FOUT: kan agent niet verzegelen!"
exit -1
}
als ($result -eq 0)
{
Schrijven-Host "De agent is bijgewerkt en verzegeld."
}
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% Agentsleutel herstellen gestart >> "%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 kan agentsleutel niet importeren >> "%logfile%"
)
ECHO Agentsleutelbestand verwijderen >> "%logfile%"
del "%certFile%" >> "%logfile%" 2>&1
IF %ERRORLEVEL% NEQ 0 (
ECHO Verwijderen agentsleutelbestand is mislukt >> "%logfile%"
)
ECHO %date% %time% Agentsleutel herstellen is voltooid >> "%logfile%"
) ELSE (
ECHO %date% %time% Agentsleutel herstellen is mislukt: geen agentsleutelbestand gevonden >> "%logfile%"
)
ECHO Script verwijderen >> "%logfile%"
del "%scriptPath%" >> "%logfile%" 2>&1
"REM er kunnen geen opdrachten meer worden uitgevoerd vanaf dit punt omdat het scriptbestand werd verwijderd"