StoreFront SDK

Last published : Nov 13, 2026
Citrix StoreFront 提供了一个基于多个 Microsoft Windows PowerShell 2.0 版模块的 SDK。借助此 SDK,您可以执行与使用 StoreFront MMC 控制台相同的任务,以及仅使用控制台无法完成的任务。
注意:
PowerShell SDK 与 PowerShell 6 或更高版本不兼容。
有关 SDK 参考,请参阅 StoreFront SDK。

使用 SDK

SDK 包含多个 PowerShell 管理单元,当您安装和配置各种 StoreFront 组件时,安装向导会自动安装这些管理单元。
要访问和运行 cmdlet,请执行以下操作:
  1. 确保 StoreFront 管理控制台已关闭。
  2. 以管理员身份启动 PowerShell 命令行提示符或 Windows PowerShell ISE。
    您必须使用 StoreFront 服务器上本地管理员组的成员身份运行 shell 或脚本。
  3. 要在脚本中使用 SDK cmdlet,请将 PowerShell 中的执行策略设置为 RemoteSigned。有关 PowerShell 执行策略的详细信息,请参阅 Microsoft 文档。

SDK 入门

要创建脚本,请执行以下步骤:
  1. 将 StoreFront 安装提供的 SDK 示例之一复制到 %ProgramFiles%\Citrix\Receiver StoreFront\PowerShellSDK\Examples 文件夹中。
  2. 为了帮助您自定义自己的脚本,请查看示例脚本以了解每个部分的功能。有关详细信息,请参阅示例用例,其中详细解释了脚本的操作。
  3. 将示例脚本转换并改编为更易于使用的脚本。为此:
    • 使用 PowerShell ISE 或类似工具编辑脚本。
    • 使用变量分配要重用或修改的值。
    • 删除任何不需要的命令。
    • 请注意,StoreFront cmdlet 可以通过前缀 STF 识别。
    • 使用 Get-Help cmdlet,提供 cmdlet 名称和 -Full 参数以获取有关特定命令的更多信息。

示例

注意:
创建脚本时,为确保始终获得最新的增强功能和修复,Citrix® 建议您遵循上述过程,而不是复制和粘贴示例脚本。
示例 描述
创建简单部署 脚本:创建一个简单部署,其中包含一个配置了单个 XenDesktop 服务器的 StoreFront 控制器。
创建远程访问部署 脚本:在之前的脚本基础上,为部署添加远程访问。
创建具有最佳启动网关的远程访问部署 脚本:在之前的脚本基础上,添加首选的最佳启动网关以提供更好的用户体验。

示例:创建简单部署

以下示例展示了如何创建配置了一个 XenDesktop® 控制器的简单部署。
在开始之前,请确保您已遵循 SDK 入门 中详述的步骤。此示例可以使用所述方法进行自定义,以生成用于自动化 StoreFront 部署的脚本。
注意:
为确保您始终获得最新的增强功能和修复,Citrix 建议您遵循本文档中描述的步骤,而不是复制和粘贴示例脚本。

了解脚本

本节解释了 StoreFront 生成的脚本的每个部分的作用。这将有助于您自定义自己的脚本。
  • 设置错误处理要求并导入所需的 StoreFront 模块。在较新版本的 PowerShell 中不需要导入。
    Param(
        [Parameter(Mandatory=$true)]
        [Uri]$HostbaseUrl,
        [long]$SiteId = 1,
        [ValidateSet("XenDesktop","XenApp","AppController","VDIinaBox")]
        [string]$Farmtype = "XenDesktop",
        [Parameter(Mandatory=$true)]
        [string[]]$FarmServers,
        [string]$StoreVirtualPath = "/Citrix/Store",
        [bool]$LoadbalanceServers = $false,
        [int]$Port = 80,
        [int]$SSLRelayPort = 443,
        [ValidateSet("HTTP","HTTPS","SSL")]
        [string]$TransportType = "HTTP"
        )
        \# Import StoreFront modules. Required for versions of PowerShell earlier than 3.0 that do not support autoloading
        Import-Module Citrix.StoreFront
        Import-Module Citrix.StoreFront.Stores
        Import-Module Citrix.StoreFront.Authentication
        Import-Module Citrix.StoreFront.WebReceiver
  • 根据提供的 \$StoreVirtualPath 自动设置身份验证和 Citrix Receiver for Web 服务的虚拟路径。\$StoreVirtualPath 等同于 \$StoreIISpath,因为虚拟路径始终是 IIS 中的路径。因此,在 PowerShell 中,它们的值为“/Citrix/Store”、“/Citrix/StoreWeb”或“/Citrix/StoreAuth”等。
    \# Determine the Authentication and Receiver virtual path to use based of the Store
    $authenticationVirtualPath = "$($StoreIISPath.TrimEnd('/'))Auth"
    $receiverVirtualPath = "$($StoreVirtualPath.TrimEnd('/'))Web"
  • 如果尚未存在部署,则创建一个新部署,以准备添加所需的 StoreFront 服务。-Confirm:$false 抑制了确认部署可以继续的要求。
    \# Determine if the deployment already exists
    $existingDeployment = Get-STFDeployment
    if(-not $existingDeployment)
    {
        \# Install the required StoreFront components
        Add-STFDeployment -HostBaseUrl $HostbaseUrl -SiteId $SiteId -Confirm:$false
    }
    elseif($existingDeployment.HostbaseUrl -eq $HostbaseUrl)
    {
        \# The deployment exists but it is configured to the desired hostbase url
        Write-Output "A deployment has already been created with the specified hostbase url on this server and will be used."
    }
    else
    {
        Write-Error "A deployment has already been created on this server with a different host base url."
    }
  • 如果在指定的虚拟路径不存在身份验证服务,则创建一个新的身份验证服务。默认的用户名和密码身份验证方法已启用。
    \# Determine if the authentication service at the specified virtual path exists
    $authentication = Get-STFAuthenticationService -VirtualPath $authenticationVirtualPath
    if(-not $authentication)
    {
        \# Add an Authentication service using the IIS path of the Store appended with Auth
        $authentication = Add-STFAuthenticationService $authenticationVirtualPath
    }
    else
    {
        Write-Output "An Authentication service already exists at the specified virtual path and will be used."
    }
  • 如果在指定的虚拟路径不存在存储服务,则创建一个新的存储服务,该服务配置有一个 XenDesktop 控制器,其服务器在数组 $XenDesktopServers 中定义。
    \# Determine if the store service at the specified virtual path exists
    $store = Get-STFStoreService -VirtualPath $StoreVirtualPath
    if(-not $store)
    {
    \# Add a Store that uses the new Authentication service configured to publish resources from the supplied servers
    $store = Add-STFStoreService -VirtualPath $StoreVirtualPath -AuthenticationService $authentication -FarmName $Farmtype -FarmType $Farmtype -Servers $FarmServers -LoadBalance $LoadbalanceServers \`
            -Port $Port -SSLRelayPort $SSLRelayPort -TransportType $TransportType
    }
    else
    {
        Write-Output "A Store service already exists at the specified virtual path and will be used. Farm and servers will be appended to this store."
        \# Get the number of farms configured in the store
        $farmCount = (Get-STFStoreFarmConfiguration $store).Farms.Count
        \# Append the farm to the store with a unique name
        Add-STFStoreFarm -StoreService $store -FarmName "Controller$($farmCount + 1)" -FarmType $Farmtype -Servers $FarmServers -LoadBalance $LoadbalanceServers -Port $Port \`
            -SSLRelayPort $SSLRelayPort -TransportType $TransportType
    }
  • 在指定的 IIS 虚拟路径添加 Citrix Receiver™ for Web 服务,以访问在上面创建的存储中发布的应用程序。
    \# Determine if the receiver service at the specified virtual path exists
    $receiver = Get-STFWebReceiverService -VirtualPath $receiverVirtualPath
    if(-not $receiver)
    {
        \# Add a Receiver for Web site so users can access the applications and desktops in the published in the Store
        $receiver = Add-STFWebReceiverService -VirtualPath $receiverVirtualPath -StoreService $store
    }
    else
    {
        Write-Output "A Web Receiver service already exists at the specified virtual path and will be used."
    }
  • 为存储启用 XenApp 服务,以便较旧的 Citrix Receiver 或 Citrix Workspace 应用程序客户端可以连接到已发布的应用程序。
    \# Determine if PNA is configured for the Store service
    $storePnaSettings = Get-STFStorePna -StoreService $store
    if(-not $storePnaSettings.PnaEnabled)
    {
    \# Enable XenApp services on the store and make it the default for this server
    Enable-STFStorePna -StoreService $store -AllowUserPasswordChange -DefaultPnaService
    }

示例:创建远程访问部署

以下示例在前一个脚本的基础上添加了一个具有远程访问功能的部署。
在开始之前,请确保您已遵循 SDK 入门 中详述的步骤。此示例可以使用所述方法进行自定义,以生成用于自动化 StoreFront 部署的脚本。
注意:
为确保您始终获得最新的增强功能和修复,Citrix 建议您遵循本文档中描述的步骤,而不是复制和粘贴示例脚本。

理解脚本

本节解释了 StoreFront 生成的脚本的每个部分的作用。这将有助于您自定义自己的脚本。
  • 设置错误处理要求并导入所需的 StoreFront 模块。在较新版本的 PowerShell 中不需要导入。
    Param(
        [Parameter(Mandatory=$true)]
        [Uri]$HostbaseUrl,
        [Parameter(Mandatory=$true)]
        [long]$SiteId = 1,
        [string]$Farmtype = "XenDesktop",
        [Parameter(Mandatory=$true)]
        [string[]]$FarmServers,
        [string]$StoreVirtualPath = "/Citrix/Store",
        [bool]$LoadbalanceServers = $false,
        [int]$Port = 80,
        [int]$SSLRelayPort = 443,
        [ValidateSet("HTTP","HTTPS","SSL")]
        [string]$TransportType = "HTTP",
        [Parameter(Mandatory=$true)]
        [Uri]$GatewayUrl,
        [Parameter(Mandatory=$true)]
        [Uri]$GatewayCallbackUrl,
        [Parameter(Mandatory=$true)]
        [string[]]$GatewaySTAUrls,
        [string]$GatewaySubnetIP,
        [Parameter(Mandatory=$true)]
        [string]$GatewayName
    )
    Set-StrictMode -Version 2.0

    \# Any failure is a terminating failure.
    $ErrorActionPreference = 'Stop'
    $ReportErrorShowStackTrace = $true
    $ReportErrorShowInnerException = $true
    \# Import StoreFront modules. Required for versions of PowerShell earlier than 3.0 that do not support autoloading
    Import-Module Citrix.StoreFront
    Import-Module Citrix.StoreFront.Stores
    Import-Module Citrix.StoreFront.Roaming
  • 通过调用之前的示例脚本来创建内部访问 StoreFront 部署。基本部署将扩展以支持远程访问。
    \# Create a simple deployment by invoking the SimpleDeployment example
    $scriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
    $scriptPath = Join-Path $scriptDirectory "SimpleDeployment.ps1"
    & $scriptPath -HostbaseUrl $HostbaseUrl -SiteId $SiteId -FarmServers $FarmServers -StoreVirtualPath $StoreVirtualPath -Farmtype $Farmtype \`
        -LoadbalanceServers $LoadbalanceServers -Port $Port  -SSLRelayPort $SSLRelayPort -TransportType $TransportType
  • 获取在简单部署中创建的服务,因为它们需要更新以支持远程访问场景。
    \# Determine the Authentication and Receiver sites based on the Store
    $store = Get-STFStoreService -VirtualPath $StoreVirtualPath
    $authentication = Get-STFAuthenticationService -StoreService $store
    $receiverForWeb = Get-STFWebReceiverService -StoreService $store
  • 在远程访问所需的 Citrix Receiver for Web 服务上启用 CitrixAGBasic,该服务使用 Citrix Gateway。从支持的协议中获取 Citrix Receiver for Web CitrixAGBasic 和 ExplicitForms 身份验证方法。
    \# Get the Citrix Receiver for Web CitrixAGBasic and ExplicitForms authentication method from the supported protocols
    \# Included for demonstration purposes as the protocol name can be used directly if known
    $receiverMethods = Get-STFWebReceiverAuthenticationMethodsAvailable | Where-Object { $_ -match "Explicit" -or $_ -match "CitrixAG" }
    \# Enable CitrixAGBasic in Receiver for Web (required for remote access)
    Set-STFWebReceiverService $receiverForWeb -AuthenticationMethods $receiverMethods
  • 在身份验证服务上启用 CitrixAGBasic。远程访问需要此功能。
    \# Get the CitrixAGBasic authentication method from the protocols installed.
    \# Included for demonstration purposes as the protocol name can be used directly if known
    $citrixAGBasic = Get-STFAuthenticationProtocolsAvailable | Where-Object { $_ -match "CitrixAGBasic" }
    \# Enable CitrixAGBasic in the Authentication service (required for remote access)
    Enable-STFAuthenticationServiceProtocol -AuthenticationService $authentication -Name $citrixAGBasic
  • 添加新的远程访问网关,提供可选的子网 IP 地址,并将其注册到可远程访问的存储中。
    \# Add a new Gateway used to access the new store remotely
    Add-STFRoamingGateway -Name "NetScaler10x" -LogonType Domain -Version Version10_0_69_4 -GatewayUrl $GatewayUrl '
    \-CallbackUrl $GatewayCallbackUrl -SecureTicketAuthorityUrls $GatewaySTAUrls
    \# Get the new Gateway from the configuration (Add-STFRoamingGateway will return the new Gateway if -PassThru is supplied as a parameter)
    $gateway = Get-STFRoamingGateway -Name $GatewayName
    \# If the gateway subnet was provided then set it on the gateway object
    if($GatewaySubnetIP)
    {
        Set-STFRoamingGateway -Gateway $gateway -SubnetIPAddress $GatewaySubnetIP
    }
    \# Register the Gateway with the new Store
    Register-STFStoreGateway -Gateway $gateway -StoreService $store -DefaultGateway

示例:创建具有最佳启动网关的远程访问部署

以下示例基于之前的脚本,添加了一个具有最佳启动网关远程访问的部署。
在开始之前,请确保您遵循 (/zh-cn/storefront/2203-ltsr/sdk-overview.html#get-started-with-the-sdk) 中详述的步骤。可以使用所述方法自定义此示例,以生成用于自动化 StoreFront 部署的脚本。
注意:
为确保您始终获得最新的增强功能和修复,Citrix 建议您遵循本文档中描述的步骤,而不是复制和粘贴示例脚本。

理解脚本

本节解释了 StoreFront 生成的脚本的每个部分的作用。这将有助于您自定义自己的脚本。
  • 设置错误处理要求并导入所需的 StoreFront 模块。在较新版本的 PowerShell 中不需要导入。
    Param(
        [Parameter(Mandatory=$true)]
        [Uri]$HostbaseUrl,
        [long]$SiteId = 1,
        [string]$Farmtype = "XenDesktop",
        [Parameter(Mandatory=$true)]
        [string[]]$FarmServers,
        [string]$StoreVirtualPath = "/Citrix/Store",
        [bool]$LoadbalanceServers = $false,
        [int]$Port = 80,
        [int]$SSLRelayPort = 443,
        [ValidateSet("HTTP","HTTPS","SSL")]
        [string]$TransportType = "HTTP",
        [Parameter(Mandatory=$true)]
        [Uri]$GatewayUrl,
        [Parameter(Mandatory=$true)]
        [Uri]$GatewayCallbackUrl,
        [Parameter(Mandatory=$true)]
        [string[]]$GatewaySTAUrls,
        [string]$GatewaySubnetIP,
        [Parameter(Mandatory=$true)]
        [string]$GatewayName,
        [Parameter(Mandatory=$true)]
        [Uri]$OptimalGatewayUrl,
        [Parameter(Mandatory=$true)]
        [string[]]$OptimalGatewaySTAUrls,
        [Parameter(Mandatory=$true)]
        [string]$OptimalGatewayName
    )
    Set-StrictMode -Version 2.0
    \# Any failure is a terminating failure.
    $ErrorActionPreference = 'Stop'
    $ReportErrorShowStackTrace = $true
    $ReportErrorShowInnerException = $true
    \# Import StoreFront modules. Required for versions of PowerShell earlier than 3.0 that do not support autoloading
    Import-Module Citrix.StoreFront
    Import-Module Citrix.StoreFront.Stores
    Import-Module Citrix.StoreFront.Roaming
  • 调用远程访问部署脚本以配置基本部署并添加远程访问。
    \# Create a remote access deployment
    $scriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
    $scriptPath = Join-Path $scriptDirectory "RemoteAccessDeployment.ps1"
    & $scriptPath -HostbaseUrl $HostbaseUrl -SiteId $SiteId -FarmServers $FarmServers -StoreVirtualPath $StoreVirtualPath -Farmtype $Farmtype \`
        -LoadbalanceServers $LoadbalanceServers -Port $Port  -SSLRelayPort $SSLRelayPort -TransportType $TransportType \`
        -GatewayUrl $GatewayUrl -GatewayCallbackUrl $GatewayCallbackUrl -GatewaySTAUrls $GatewaySTAUrls -GatewayName $GatewayName
  • 添加首选的最佳启动网关,并从已配置网关列表中获取它。
    \# Add a new Gateway used for remote HDX access to desktops and apps
    $gateway = Add-STFRoamingGateway -Name $OptimalGatewayName -LogonType UsedForHDXOnly -GatewayUrl $OptimalGatewayUrl -SecureTicketAuthorityUrls $OptimalGatewaySTAUrls -PassThru
  • 获取商店服务以使用最佳网关,注册它并将其分配给来自指定场的启动。
    \# Get the Store configured by SimpleDeployment.ps1
    $store = Get-STFStoreService -VirtualPath $StoreVirtualPath
    \# Register the Gateway with the new Store for launch against all of the farms (currently just one)
    $farmNames = @($store.FarmsConfiguration.Farms | foreach { $_.FarmName })
    Register-STFStoreOptimalLaunchGateway -Gateway $gateway -StoreService $store -FarmName $farmNames