Einen Maschinenkatalog mit vorbereitetem Image in Azure erstellen
Erstellen Sie vorbereitete Images und verwenden Sie diese, um einen MCS-Maschinenkatalog zu erstellen, indem Sie Folgendes verwenden:
Die wichtigsten Schritte zum Erstellen eines MCS-Maschinenkatalogs mit dem vorbereiteten Image sind:
- Erstellen Sie die Imagestruktur und die anfänglichen Imageversionen.
- Verwenden Sie die Imageversion als vorbereitetes Image, um einen Katalog zu erstellen.
Web Studio verwenden
Imagestruktur und anfängliche Imageversion erstellen
Gehen Sie wie folgt vor, um eine Imagestruktur und die anfängliche Imageversion zu erstellen:
- Navigieren Sie in Web Studio zum Knoten Images und klicken Sie auf Imagestruktur erstellen. Klicken Sie auf der Seite Einführung auf Weiter.
- Geben Sie auf der Seite Imagestruktur den OS-Typ und den Sitzungstyp für die Imagestruktur an.
- Wählen Sie eine vorhandene Ressourcengruppe aus oder erstellen Sie eine neue, um die Image-Ressourcen zu speichern. Um die Imagefreigabe zu aktivieren, wählen Sie Imageversionen in der Azure Compute Gallery platzieren und wählen Sie dann, ob Sie eine neue Galerie erstellen oder eine vorhandene verwenden möchten, um die Imageversionen zu speichern.
-
Wählen Sie auf der Seite Image die Option Ressourcen (nur die für die festgelegte Verbindung anwendbaren Ressourcen werden aufgelistet) und ein Masterimage aus, das als Vorlage zum Erstellen der Imageversion verwendet werden soll. Sie können das Kontrollkästchen Maschinenprofil verwenden aktivieren und ein Maschinenprofil auswählen.
Hinweis:
Bevor Sie ein Image auswählen, stellen Sie sicher, dass auf dem Masterimage VDA 2311 oder höher installiert ist und der MCSIO-Treiber auf dem VDA installiert ist.
-
Auf der Seite Speicher- und Lizenztypen wählen Sie den Speicher- und Lizenztyp aus, der als Teil des Image-Vorbereitungsprozesses verwendet werden soll.
Hinweis:
Wenn Sie auf der Seite Image ein Maschinenprofil auswählen, wird der Lizenztyp des Maschinenprofils basierend auf der Profileinstellung vorausgewählt.
- Auf der Seite Maschinenspezifikation wählen Sie eine Maschinengröße aus. Wenn Sie auf der Seite Image ein Maschinenprofil auswählen, wird die Maschinengröße des Maschinenprofils standardmäßig ausgewählt.
- Auf der Seite NICs wählen oder fügen Sie NICs für das Vorbereitungsimage hinzu. Für jede NIC wählen Sie ein zugehöriges virtuelles Netzwerk aus.
- Auf der Seite Datenträgereinstellungen wählen Sie den kundenseitig verwalteten Verschlüsselungsschlüssel (CMEK) aus. Wenn das Maschinenprofil keinen CMEK hat, das Masterimage jedoch einen hat, wird der CMEK aus dem Masterimage vorausgewählt.
- Auf der Seite Versionsbeschreibung geben Sie eine Beschreibung für die erstellte anfängliche Imageversion ein.
- Auf der Seite Zusammenfassung überprüfen Sie die Details der Imagestruktur und der erstellten anfänglichen Imageversion. Geben Sie einen Namen und eine Beschreibung für die Imagestruktur ein. Klicken Sie auf Fertig stellen.
Imageversionen erstellen
Imageversionen ermöglichen die Verwaltung verschiedener Iterationen oder Updates eines bestimmten Images. Diese Funktionalität ermöglicht es Ihnen, mehrere Versionen eines Images für verschiedene Zwecke zu verwalten.
Um Imageversionen aus der anfänglichen Imageversion zu erstellen, gehen Sie wie folgt vor:
Hinweis:
Die Hostingeinheit aller Imageversionen muss dieselbe sein.
- Gehen Sie zum Knoten Images, wählen Sie eine Imageversion oder eine Imagestruktur aus und klicken Sie auf Imageversion erstellen.
- Auf der Seite ‘Imagedefinition’ können Sie die Hosting-Einheit ändern und das Masterimage sowie das Maschinenprofil für diese Imageversion erneut auswählen.
- Wenn die Konfiguration der Imageversion von der ursprünglich konfigurierten Imageversion abweichen soll, konfigurieren Sie die Einstellungen auf den Seiten Speicher- und Lizenztypen, Maschinenspezifikation, NICs und Datenträgereinstellungen des Dialogfelds Imageversion erstellen.
- Fügen Sie eine Beschreibung für die Imageversion hinzu. Klicken Sie auf Fertig stellen.

Hinweis:
Wenn die Erstellung der Imageversion aus irgendeinem Grund fehlschlägt, bietet die Registerkarte Problembehandlung unten eine Option zum Wiederholen.
Freigegebenes vorbereitetes Image
Um vorbereitete Images für Azure über verschiedene Hosteinheiten hinweg freizugeben, führen Sie die folgenden Schritte aus:
- Klicken Sie mit der rechten Maustaste auf eine Imageversion und wählen Sie Imagefreigabe verwalten. Alle Hosteinheiten unter der ausgewählten Verbindung werden aufgelistet. Die Ressourcen, von denen die Imageversion erstellt wurde, sind für alle Aktionen deaktiviert.
- Wählen Sie die Hosteinheiten aus, mit denen Sie das Image freigeben möchten, und klicken Sie auf Speichern. Die Spalte Freigabestatus zeigt ‘In Bearbeitung’ an.
- Klicken Sie auf die Registerkarte Ressourcen, um weitere Details zum Freigabestatus zu erhalten.
Hinweis:
Wenn der Status der Imageversionsfreigabe ‘In Bearbeitung’ ist, ist die Option zum Löschen der Imageversion oder Verwalten der Imagefreigabe deaktiviert.
Maschinenkatalog aus dem Knoten ‘Images’ erstellen
Verwenden Sie die Option Katalog erstellen im Knoten Images, um einen Katalog mithilfe der Imageversion zu erstellen.
Alternativ können Sie die Version beim Erstellen eines Katalogs im Knoten Maschinenkataloge auswählen, wobei auf die Option für vorbereitete Images im Workflow zur Katalogerstellung verwiesen wird. Siehe Maschinenkatalog über den Knoten „Maschinenkataloge“ erstellen
Gehen Sie wie folgt vor, um einen MCS-Maschinenkatalog über den Knoten Images zu erstellen:
- Wählen Sie eine Image-Version aus und klicken Sie auf Katalog erstellen. Klicken Sie auf der Seite Einführung auf Weiter.
- Wählen Sie auf der Seite Desktop-Erfahrung die gewünschte Desktop-Erfahrung aus.
- Von der Seite Image bis zur Seite Datenträgereinstellungen sind die Einstellungen basierend auf der ausgewählten Image-Version vorausgewählt.
- Auf der Seite Ressourcengruppe können Sie wählen, ob Sie eine neue Ressourcengruppe erstellen oder eine vorhandene Ressourcengruppe verwenden möchten, um die Ressourcen dieses Katalogs zu platzieren.
- Schließen Sie die Einstellungen auf den folgenden Seiten ab.
- Überprüfen Sie auf der Seite Zusammenfassung die Details des Maschinenkatalogs. Geben Sie einen Namen und eine Beschreibung für den Maschinenkatalog ein. Klicken Sie auf Fertig stellen.
- Gehen Sie zum Knoten Maschinenkataloge, um den erstellten Maschinenkatalog anzuzeigen.
Maschinenkatalog über den Knoten „Maschinenkataloge“ erstellen
Gehen Sie wie folgt vor, um einen MCS-Maschinenkatalog über den Knoten Maschinenkataloge zu erstellen:
- Klicken Sie im linken Navigationsbereich auf Maschinenkataloge.
- Klicken Sie auf Maschinenkatalog erstellen. Die Seite Maschinenkatalog-Setup wird angezeigt. Klicken Sie auf den Seiten Einführung, Maschinentyp und Maschinenverwaltung jeweils auf Weiter.
- Wählen Sie auf der Seite Maschinenverwaltung die folgenden Einstellungen aus:
- Wählen Sie Maschinen, die energieverwaltet sind (z. B. virtuelle Maschinen oder Blade-PCs).
- Wählen Sie Citrix Bereitstellungstechnologie. Wählen Sie dann Citrix Machine Creation Services™.
- Im Feld Ressourcen werden die Ressourcen aufgelistet, die zu verschiedenen Zonen gehören. Wählen Sie eine beliebige Azure-Netzwerkressource aus und klicken Sie auf Weiter.
- Auf der Seite Image: Gehen Sie für den Master-Image-Typ wie folgt vor:
- Wählen Sie Master-Image.
- Wählen Sie unter dem Master-Image ein Image aus. Das Blade listet alle Images auf, die zur selben Region gehören wie die Ressourcen.
- Klicken Sie auf Fertig.
- Wählen Sie für den Typ des vorbereiteten Images Vorbereitetes Image.
- Wählen Sie unter dem vorbereiteten Image eine Image-Version einer Image-Definition aus.
- Klicken Sie auf den Namen der Image-Version. Um weitere Details zur ausgewählten Image-Version anzuzeigen, klicken Sie auf die unterstrichene Versionsnummer.
- Wenn die ausgewählte Image-Version mit einem Maschinenprofil konfiguriert ist, wählen Sie ein Maschinenprofil aus. Wenn die ausgewählte Image-Version nicht mit einem Maschinenprofil konfiguriert ist, können Sie kein Maschinenprofil verwenden.
- Konfigurieren Sie die Einstellungen auf den folgenden Seiten.
- Auf der Seite Datenträgereinstellungen können Sie, wenn das ausgewählte vorbereitete Image einen Datenträgerverschlüsselungssatz verwendet, den Verschlüsselungssatz nicht entfernen, aber den Schlüssel in einen anderen Verschlüsselungsschlüssel ändern.
- Auf der Seite Ressourcengruppe können Sie wählen, ob Sie eine neue Ressourcengruppe erstellen oder eine vorhandene Ressourcengruppe verwenden möchten, um die Ressourcen dieses Katalogs zu platzieren.
- Schließen Sie die Einstellungen auf den folgenden Seiten ab.
- Überprüfen Sie auf der Seite Zusammenfassung die Details des Maschinenkatalogs. Geben Sie einen Namen und eine Beschreibung für den Maschinenkatalog ein. Klicken Sie auf Fertig stellen.
PowerShell verwenden
Ein vorbereitetes Image erstellen
Die detaillierten PowerShell-Befehle zum Erstellen einer vorbereiteten Image-Versionsspezifikation lauten wie folgt:
-
Überprüfen Sie die verfügbaren Imagedefinitionsnamen mit
Test-ProvImageDefinitionNameAvailable command. Beispiel:Test-ProvImageDefinitionNameAvailable -ImageDefinitionName <string[]> <!--NeedCopy--> -
Erstellen Sie eine Imagedefinition mit dem Befehl
New-ProvImageDefinition. Beispiel:New-ProvImageDefinition -ImageDefinitionName image1 -OsType Windows -VdaSessionSupport MultiSession <!--NeedCopy--> -
Erstellen Sie eine neue Konfiguration für die Imagedefinition in der angegebenen Hostingverbindung mit dem Befehl
Add-ProvImageDefinitionConnection.Die
CustomPropertiesfürAdd-ProvImageDefinitionConnectionkann Folgendes umfassen. Wenn Sie die Parameter nicht verwenden, werden Standardwerte verwendet.-
ResourceGroups: Die Ressourcengruppe, die die Basisdatenträger enthält. -
UseSharedImageGallery: Indikator für den Typ der Basisdatenträger. Verwenden Sietruefür ACG (Image-Freigabe) undfalsefür Snapshot. -
ImageGallery: Der Galeriename, wenn der Basisdatenträger eine ACG-Image-Version ist.
Beispiel:
-
Im Falle eines Snapshots und einer vom Kunden bereitgestellten Ressourcengruppe:
$CustomerOwnRsourceGroupProperties = @" <CustomProperties xmlns="http:// schemas.citrix.com/2014/xd/machinecreation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Property xsi:type="StringProperty" Name="ResourceGroups" Value="yangj_image" /> </CustomProperties> "@ <!--NeedCopy--> -
Im Falle von ACG und einer vom Kunden bereitgestellten Ressourcengruppe und Image-Galerie:
$CustomerOwnAllProperties = @" <CustomProperties xmlns="http://schemas.citrix.com/2014/xd/machinecreation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Property xsi:type="StringProperty" Name="UseSharedImageGallery" Value="true" /> <Property xsi:type="StringProperty" Name="ResourceGroups" Value="rg" /> <Property xsi:type="StringProperty" Name="ImageGallery" Value="gallery" /> </CustomProperties> "@ <!--NeedCopy--> -
Im Falle von ACG und nur einer vom Kunden bereitgestellten Ressourcengruppe:
$CustomerOwnResourceGroupProperties = @" <CustomProperties xmlns="http://schemas.citrix.com/2014/xd/machinecreation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Property xsi:type="StringProperty" Name="UseSharedImageGallery" Value="true" /> <Property xsi:type="StringProperty" Name="ResourceGroups" Value="rg" /> </CustomProperties> "@ <!--NeedCopy--> -
Im Falle von ACG und einer von Citrix verwalteten Ressourcengruppe und Image-Galerie:
$CustomerOwnResourceGroupNothingProperties = @" <CustomProperties xmlns="http://schemas.citrix.com/2014/xd/machinecreation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Property xsi:type="StringProperty" Name="UseSharedImageGallery" Value="true" /> </CustomProperties> "@ <!--NeedCopy-->
Add-ProvImageDefinitionConnection -ImageDefinitionName image1 -HypervisorConnectionName Azure28 [-CustomProperties $CustomProperties] <!--NeedCopy--> -
-
Erstellen Sie eine Image-Version mit dem
New-ProvImageVersionBefehl. Zum Beispiel:New-ProvImageVersion -ImageDefinitionName image1 -Description "version 1" <!--NeedCopy--> -
Fügen Sie der Image-Version eine Master-Image-Versionsspezifikation mit dem
Add-ProvImageVersionSpecBefehl hinzu. Zum Beispiel:Add-ProvImageVersionSpec -ImageDefinitionName image1 -ImageVersionNumber 1 -HostingUnitName azure -MasterImagePath "XDHyp:\HostingUnits\azure\image.folder\azureresourcegroup.resourcegroup\win2022-snapshot.snapshot" <!--NeedCopy-->Hinweis:
Sie können nur eine Master-Image-Versionsspezifikation zu einer Image-Version für eine Hosting-Einheit hinzufügen.
-
Erstellen Sie eine vorbereitete Image-Versionsspezifikation aus der Master-Image-Versionsspezifikation mit dem
New-ProvImageVersionSpecBefehl. Zum Beispiel:New-ProvImageVersionSpec -SourceImageVersionSpecUid c6e7384c-b2f8-46d6-9519-29a2c57ed3cb -NetworkMapping @{"0"="XDHyp:\HostingUnits\azure\virtualprivatecloud.folder\azureresourcegroup.resourcegroup\azure-vnet-eastus.virtualprivatecloud\dev.network"} -ServiceOffering"XDHyp:\HostingUnits\azure\serviceoffering.folder\Standard_B2ms.serviceoffering" -CustomProperties "<CustomProperties xmlns=`"http://schemas.citrix.com/2014/xd/machinecreation`" xmlns:xsi=`"http://www.w3.org/2001/XMLSchema-instance`"></CustomProperties>" -RunAsynchronously <!--NeedCopy--> -
Sie können die vorbereitete Image-Versionsspezifikation auch mit einer anderen Hosting-Einheit innerhalb derselben Hosting-Verbindung mit dem
Add-ProvImageVersionSpecHostingUnitBefehl teilen. Zum Beispiel:Add-ProvImageVersionSpecHostingUnit -ImageVersionSpecUid xxxxxxx -HostingUnitName AzureWest <!--NeedCopy-->Hinweis:
Eine Hosting-Einheit und ein Vorbereitungstyp können nur eine vorbereitete Instanz haben.
Beispiel für den vollständigen Satz von PowerShell-Befehlen zum Erstellen einer Image-Definition, einer Image-Version und einer vorbereiteten Image-Versionsspezifikation:
New-ProvImageDefinition -ImageDefinitionName image1 -OsType Windows -VdaSessionSupport MultiSession
$CustomProperties = @"
<CustomProperties xmlns="http://schemas.citrix.com/2014/xd/machinecreation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Property xsi:type="StringProperty" Name="UseSharedImageGallery" Value="true" />
<Property xsi:type="StringProperty" Name="ResourceGroups" Value="rg" />
<Property xsi:type="StringProperty" Name="ImageGallery" Value="gallery" />
</CustomProperties>
"@
Add-ProvImageDefinitionConnection -ImageDefinitionName image1 -HypervisorConnectionName Azure28 -CustomProperties $CustomProperties
$imageVersion = New-ProvImageVersion -ImageDefinitionName image1 -Description "version 1"
$SourceImageVersionSpec = Add-ProvImageVersionSpec -ImageVersionUid $imageVersion.ImageVersionUid `
-HostingUnitUid $hostingunit.HostingUnitUid `
-MasterImagePath "XDHyp:\HostingUnits\azure28\image.folder\abc.resourcegroup\def-snapshot.snapshot"
New-ProvImageVersionSpec -NetworkMapping @{"0" = "XDHyp:\HostingUnits\azure28\virtualprivatecloud.folder\East US.region\virtualprivatecloud.folder\studio-mcs-infrastructure.resourcegroup\studio-mcs-vnet-eastus.virtualprivatecloud\mcs-dev.network" } -CustomProperties "<CustomProperties xmlns=`"http://schemas.citrix.com/2014/xd/machinecreation`" xmlns:xsi=`"http://www.w3.org/2001/XMLSchema-instance`"><Property xsi:type=`"StringProperty`" Name=`"LicenseType`" Value=`"Windows_Server`" /></CustomProperties>" -ServiceOffering "XDHyp:\HostingUnits\azure28\serviceoffering.folder\Standard_B2s.serviceoffering" -SourceImageVersionSpecUid $SourceImageVersionSpec.ImageVersionSpecUid
Add-ProvImageVersionSpecHostingUnit -ImageVersionSpecUid xxxxxxx -HostingUnitName AzureWest
$PreparedImageVersionSpec = Get-ProvImageVersionSpec -ImageVersionUid $imageVersion.ImageVersionUid | Where SourceImageVersionSpecUid-eq $SourceImageVersionSpec.ImageVersionSpecUid
<!--NeedCopy-->
Hinweis:
- Alle Image-Versionsspezifikationen in einer Image-Definition müssen derselben Hosting-Einheit angehören.
- Eine Image-Version kann nur eine Master-Image-Versionsspezifikation und eine vorbereitete Image-Versionsspezifikation haben.
- Alle Image-Versionsspezifikationen müssen entweder ein Maschinenprofil haben, oder keine der Image-Versionsspezifikationen darf ein Maschinenprofil haben.
Katalog mit einer vorbereiteten Image-Versionsspezifikation erstellen
Erstellen Sie einen MCS-Maschinenkatalog aus der vorbereiteten Image-Versionsspezifikation mit dem New-ProvScheme Befehl. Zum Beispiel:
New-ProvScheme -ProvisioningSchemeName <string> -ImageVersionSpecUid <Guid> -HostingUnitUid <Guid> -IdentityPoolUid <Guid> [-VMCpuCount <int>] [-VMMemoryMB <int>] [-UseWriteBackCache] [-NetworkMapping <Hashtable>] [-CleanOnBoot] [-Scope <string[]>] [-Metadata <Hashtable>] [-ServiceOffering <string>] [-SecurityGroup <string[]>] [-TenancyType <string>] [-MachineProfile <string>] [-CustomProperties <string>] [-ResetAdministratorPasswords] [-UseFullDiskCloneProvisioning] [-RunAsynchronously] [-PurgeJobOnSuccess] [-ProvisioningSchemeType <ProvisioningSchemeType>]
<!--NeedCopy-->
Oder,
New-ProvScheme -ProvisioningSchemeName <string> -ImageVersionSpecUid <Guid> -HostingUnitName <string> -IdentityPoolName <string> [-VMCpuCount <int>] [-VMMemoryMB <int>] [-UseWriteBackCache] [-NetworkMapping <Hashtable>] [-CleanOnBoot] [-Scope <string[]>] [-Metadata <Hashtable>] [-ServiceOffering <string>] [-SecurityGroup <string[]>] [-TenancyType <string>] [-MachineProfile <string>] [-CustomProperties <string>] [-ResetAdministratorPasswords] [-UseFullDiskCloneProvisioning] [-RunAsynchronously] [-PurgeJobOnSuccess] [-ProvisioningSchemeType <ProvisioningSchemeType>]
<!--NeedCopy-->
Wenn Sie eine ACG-Image-Versionsspezifikation verwenden möchten, dann legen Sie UseSharedImageGallery als true fest. Zum Beispiel:
$provSchemeCustomProperties= @"
<CustomProperties xmlns="http://schemas.citrix.com/2014/xd/machinecreation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Property xsi:type="StringProperty" Name="UseSharedImageGallery" Value="true" />
<Property xsi:type="StringProperty" Name="StorageAccountType" Value="StandardSSD_LRS" />
</CustomProperties>
"@
New-ProvScheme -ProvisioningSchemeName assignimage -ImageVersionSpecUid $PreparedImageVersionSpec.ImageVersionSpecUid `
-HostingUnitUid $hostingunit.HostingUnitUid `
-IdentityPoolUid $IdentityPool.IdentityPoolUid `
-CleanOnBoot -Scope @() -SecurityGroup @() `
-ServiceOffering "XDHyp:\HostingUnits\azure28\serviceoffering.folder\Standard_B2s.serviceoffering" `
-NetworkMapping @{"0"="XDHyp:\HostingUnits\azure28\virtualprivatecloud.folder\East US.region\virtualprivatecloud.folder\studio-mcs-infrastructure.resourcegroup\studio-mcs-vnet-eastus.virtualprivatecloud\mcs-dev.network"} `
-CustomProperties $provSchemeCustomProperties
<!--NeedCopy-->
Beispiel für den vollständigen Satz von PowerShell-Befehlen zum Erstellen eines Katalogs:
$Catalog = New-BrokerCatalog -AllocationType "Random" -IsRemotePC $False -MinimumFunctionalLevel "L7_20" -Name "azurecatalog" -PersistUserChanges "Discard" -ProvisioningType "MCS" -Scope @() -SessionSupport "MultiSession"
$IdentityPool = New-AcctIdentityPool -AllowUnicode -Domain "azure.local" -IdentityPoolName "azurecatalog" -IdentityType "ActiveDirectory" -NamingScheme "azure##" -NamingSchemeType "Numeric" -Scope @()
$PreparedImageVersionSpec = Get-ProvImageVersionSpec -ImageDefinitionName image1 -ImageVersionNumber 1 -Filter "PreparationType -eq 'Mcs'"
$Task = New-ProvScheme -ProvisioningSchemeName azurecatalog -ImageVersionSpecUid $PreparedImageVersionSpec.ImageVersionSpecUid -HostingUnitName azure -IdentityPoolName azurecatalog -CleanOnBoot -Scope @() -SecurityGroup @() -ServiceOffering "XDHyp:\HostingUnits\azure\serviceoffering.folder\Standard_B2s.serviceoffering" -NetworkMapping @{"0"="XDHyp:\HostingUnits\azure\virtualprivatecloud.folder\azureresourcegroup.resourcegroup\azure-vnet-eastus.virtualprivatecloud\dev.network"} -CustomProperties "<CustomProperties xmlns=`"http://schemas.citrix.com/2014/xd/machinecreation`" xmlns:xsi=`"http://www.w3.org/2001/XMLSchema-instance`"> <Property xsi:type="StringProperty" Name="UseSharedImageGallery" Value="true" /><Property xsi:type=`"StringProperty`" Name=`"StorageAccountType`" Value=`"StandardSSD_LRS`" /></CustomProperties>" -RunAsynchronously
Get-ProvTask -TaskId $Task.TaskId
$ProvScheme = Get-ProvScheme -ProvisioningSchemeName azurecatalog
Set-BrokerCatalog -Name $Catalog.Name -ProvisioningSchemeId $ProvScheme.ProvisioningSchemeUid
<!--NeedCopy-->