

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用会话脚本来管理您的用户的流式传输体验
<a name="pools-images-session-scripts"></a>

WorkSpaces Pool 提供实例会话脚本。当用户的流式传输会话中发生特定事件时，您可以使用这些脚本来运行自己的自定义脚本。例如，您可以使用自定义脚本在用户的直播会话开始之前准备 P WorkSpaces ools 环境。您还可以在用户完成其流式传输会话后使用自定义脚本清理流实例。

会话脚本是在 WorkSpace 图像中指定的。这些脚本在用户上下文或系统上下文中运行。如果您的会话脚本使用标准输出来编写信息、错误或调试消息，则可以选择将这些脚本保存到 Amazon Web Services 账户内的 Amazon S3 存储桶中。

**Topics**
+ [在流式传输会话开始前运行脚本](#run-scripts-before-streaming-sessions-begin)
+ [在流式传输会话结束后运行脚本](#run-scripts-after-streaming-sessions-end)
+ [创建并指定会话脚本](#create-specify-session-scripts)
+ [会话脚本配置文件](#session-script-configuration-file)
+ [使用 Windows PowerShell 文件](#using-powershell-files-with-session-scripts)
+ [记录会话脚本输出](#logging-session-output)
+ [结合使用永久存储与会话脚本](#use-storage-connectors-with-session-scripts)
+ [为会话脚本日志启用 Amazon S3 存储桶存储](#enable-S3-bucket-storage-session-script-logs)

## 在流式传输会话开始前运行脚本
<a name="run-scripts-before-streaming-sessions-begin"></a>

您可以将脚本配置为在用户的应用程序启动和其流式传输会话开始前运行最多 60 秒。这样一来，您就可以在用户开始流式传输其应用程序之前自定义 WorkSpaces 池环境。在会话脚本运行时，会为您的用户显示加载转盘。当您的脚本成功完成或超过最长等待时间时，用户的流式传输会话将开始。如果脚本未成功完成，则会为用户显示错误消息。但是，不会阻止您的用户使用其流式传输会话。

在指定 Windows 实例上的文件名时，您必须使用双反斜杠。例如：

```
C:\\Scripts\\Myscript.bat
```

如果未使用双反斜杠，则会显示一个错误以通知您 `.json` 文件格式不正确。

**注意**  
脚本成功完成后，它们必须返回值 0。如果您的脚本返回的值不是 0，则会向用户 WorkSpaces 显示错误消息。

在流式传输会话开始前运行脚本时，会发生以下过程：

1. 您的用户连接到未加入域的 WorkSpaces 池 WorkSpace 中。它们使用 SAML 2.0 连接。

1. 发生下列情况之一：
   + 如果为用户启用了应用程序设置持久性，则会下载并装入用于存储用户的自定义项和 Windows 设置的应用程序设置虚拟硬盘 (VHD) 文件。在此情况下，需要 Windows 用户登录。

     有关应用程序设置持久性的信息，请参阅[为您的 P WorkSpaces ools 用户启用应用程序设置持久性](app-settings-persistence.md)。
   + 如果未启用应用程序设置持久性，则表示 Windows 用户已登录。

1. 您的会话脚本启动。如果为用户启用了持久性存储，则还会启动存储连接器安装。有关持久性存储的信息，请参阅[为 WorkSpaces 池启用和管理永久存储](persistent-storage.md)。
**注意**  
无需完成存储连接器安装即可启动流式传输会话。如果会话脚本在存储连接器安装完成之前完成，则流式传输会话将启动。  
有关监控存储连接器的装载状态的信息，请参阅[结合使用永久存储与会话脚本](#use-storage-connectors-with-session-scripts)。

1. 您的会话脚本完成或超时。

1. 用户的流式传输会话启动。

## 在流式传输会话结束后运行脚本
<a name="run-scripts-after-streaming-sessions-end"></a>

您还可以将脚本配置为在用户的流式传输会话结束后运行。例如，当用户从 WorkSpaces 客户端工具栏中选择 “**结束会话**” 或达到会话允许的最大持续时间时，您可以运行脚本。您还可以使用这些会话脚本在流实例终止之前清理您的 WorkSpaces 环境。例如，您可以使用脚本来释放文件锁定或上传日志文件。在流式传输会话结束后运行脚本时，会发生以下过程：

1. 您的用户的 WorkSpaces 直播会话已结束。

1. 会话终止脚本启动。

1. 会话终止脚本完成或超时。

1. 发生 Windows 用户注销。

1. 发生以下一种情况或同时发生以下两种情况（如果适用）：
   + 如果为用户启用了应用程序设置持久性，则会卸载用于存储用户的自定义项和 Windows 设置的应用程序设置 VHD 文件，并将该文件上传到您账户中的 Amazon S3 存储桶。
   + 如果为您的用户启用持久性存储，则存储连接器将完成最终同步并进行卸载。

1. 已 WorkSpace 终止。

## 创建并指定会话脚本
<a name="create-specify-session-scripts"></a>

完成以下过程， WorkSpaces 在 WorkSpaces 池中为你创建和指定会话脚本。

1. 连接到要 WorkSpaces 从中创建自定义映像的 Windows。

1. 如果目录 `/AWSEUC/SessionScripts` 尚不存在，请创建它。

1. 使用[会话脚本配置模板](https://docs.aws.amazon.com/workspaces/latest/adminguide/pools-images-session-scripts.html#session-script-configuration-file)创建配置文件 `/AWSEUC/SessionScripts/config.json`（如果尚不存在）。

1. 导航到 `C:\AWSEUC\SessionScripts`，并打开 `config.json` 配置文件。

   有关会话脚本参数的信息，请参阅[会话脚本配置文件](#session-script-configuration-file)。

1. 完成更改后，保存并关闭 `config.json` 文件。

1. 完成从中创建图像的步骤 WorkSpace。有关更多信息，请参阅 [为 P WorkSpaces ools 创建自定义镜像和捆绑包](pools-images-custom-image.md)。

## 会话脚本配置文件
<a name="session-script-configuration-file"></a>

要在 Windows 实例上找到会话脚本配置文件，请导航到 `C:\AWSEUC\SessionScripts\config.json`。该文件的格式如下所示。

**注意**  
配置文件为 JSON 格式。验证您在此文件中键入的任何文本是否为有效的 JSON 格式。

```
{
  "SessionStart": {
    "executables": [
      {
        "context": "system",
        "filename": "",
        "arguments": "",
        "s3LogEnabled": true
      },
      {
        "context": "user",
        "filename": "",
        "arguments": "",
        "s3LogEnabled": true
      }
    ],
    "waitingTime": 30
  },
  "SessionTermination": {
    "executables": [
      {
        "context": "system",
        "filename": "",
        "arguments": "",
        "s3LogEnabled": true
      },
      {
        "context": "user",
        "filename": "",
        "arguments": "",
        "s3LogEnabled": true
      }
    ],
    "waitingTime": 30
  }
}
```

您可以在会话脚本配置文件中使用以下参数。

**`SessionStart/SessionTermination `**  
要基于对象的名称在相应会话事件中运行的会话脚本。  
**类型**：字符串  
**必需**：否  
**允许的值：****SessionStart**、**SessionTermination**

**`WaitingTime`**  
会话脚本的最大持续时间（以秒为单位）。  
**类型**：整数  
**必需**：否  
**约束：**最大持续时间为 60 秒。如果会话脚本未在此持续时间内完成，则它们将停止。如果您需要脚本继续运行，则将其作为单独的过程启动。

**`Executables`**  
要运行的会话脚本的详细信息。  
**类型**：字符串  
**是否必需**：是  
**约束：**每个会话事件可以运行的脚本的最大数目为 2（一个用于用户上下文，一个用于系统上下文）。

**`Context`**  
要在其中运行会话脚本的上下文。  
**类型**：字符串  
**是否必需**：是  
**允许的值：****user**、**system**

**`Filename`**  
要运行的会话脚本的完整路径。如果未指定此参数，则会话脚本不会运行。  
**类型**：字符串  
**必需**：否  
**约束：**文件名和完整路径的最大长度为 1000 个字符。  
**允许的值：****.bat**、**.exe**、**.sh**  
你也可以使用 Windows PowerShell 文件。有关更多信息，请参阅 [使用 Windows PowerShell 文件](#using-powershell-files-with-session-scripts)。

**`Arguments`**  
会话脚本或可执行文件的参数。  
**类型**：字符串  
**必需**：否  
**长度约束：**最大长度为 1000 个字符。

**`S3LogEnabled`**  
当此参数的值设置为 **True** 时，会在您的 Amazon Web Services 账户中创建一个 S3 存储桶来存储会话脚本所创建的日志。默认情况下，该值设置为 **True**。有关更多信息，请参阅本主题后面的*记录会话脚本输出* 部分。  
**类型**：布尔值  
**必需**：否  
**允许的值：****True**、**False**

## 使用 Windows PowerShell 文件
<a name="using-powershell-files-with-session-scripts"></a>

要使用 Windows PowerShell 文件，请在`filename`参数中指定 PowerShell 文件的完整路径：

```
"filename": 
"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
```

然后，在 **arguments** 参数中指定您的会话脚本：

```
"arguments": "-File \"C:\\path\\to\\session\\script.ps1\"",
```

最后，验证 PowerShell 执行策略是否允许您的 PowerShell 文件运行。

## 记录会话脚本输出
<a name="logging-session-output"></a>

在配置文件中启用此选项后，P WorkSpaces ool 会自动捕获会话脚本中写入标准输出的输出。此输出将上传到您账户中的 Amazon S3 存储桶。您可以查看日志文件以进行故障排除或调试。

**注意**  
当会话脚本返回一个值时或 **WaitingTime** 中设置的值已过去时（以先到者为准），将上传日志文件。

## 结合使用永久存储与会话脚本
<a name="use-storage-connectors-with-session-scripts"></a>

启用 WorkSpaces 永久存储后，存储将在会话启动脚本运行时开始装载。如果您的脚本依赖于正在挂载的永久存储，则可以等待连接器可用。 WorkSpaces 通过以下键维护 Windows 上的 Windows 注册表中存储连接器的装载状态： WorkSpaces

```
HKEY_LOCAL_MACHINE\SOFTWARE\Amazon\AWSEUC\Storage\<provided user
                name>\<Storage connector>
```

注册表项值如下所示：
+ 提供的用户名 – 通过访问模式提供的用户 ID。访问模式及其值如下所示：
  + 用户池 – 用户的电子邮件地址
  + 流式传输 URL – UserID
  + SAML – NameID。如果用户名包含斜杠（例如，域用户的 SAMAccount名称），则该斜杠将替换为 “-” 字符。
+ 存储连接器 – 为用户启用的持久性存储选项的连接器。存储连接器值如下所示：
  + HomeFolder

每个存储连接器注册表项都包含一个 **MountStatus**DWORD 值。下表列出了可能的值**MountStatus**。

**注意**  
要查看这些注册表项，必须在映像上安装 Microsoft .NET Framework 4.7.2 或更高版本。


| 值 | 说明 | 
| --- | --- | 
| 0 |  未为此用户启用存储连接器  | 
| 1 |  存储连接器安装正在进行中  | 
| 2 |  已成功安装存储连接器  | 
| 3 |  存储连接器安装失败  | 
| 4 |  存储连接器安装已启用，但尚未安装  | 

## 为会话脚本日志启用 Amazon S3 存储桶存储
<a name="enable-S3-bucket-storage-session-script-logs"></a>

当您在会话脚本配置中启用 Amazon S3 登录时，P WorkSpaces ool 会捕获会话脚本的标准输出。输出会定期上传到您的 Amazon Web Services 账户中的 S3 存储桶。对于每个 AWS 区域，P WorkSpaces ool 都会在您的账户中创建一个存储桶，该存储桶对于您的账户和该地区都是独一无二的。

您无需执行任何配置任务即可管理这些 S3 存储桶。它们完全由该 WorkSpaces 服务管理。存储在每个存储桶中的日志文件在传输中使用 Amazon S3 的 SSL 端点进行加密，在静态期间使用 Amazon S3 托管的加密密钥进行加密。存储桶以特定格式命名，如下所述：

```
wspool-logs-<region-code>-<account-id-without-hyphens>-random-identifier
```

**`<region-code>`**  
这是在为会话脚本日志启用 Amazon S3 存储桶存储的情况下创建 WorkSpaces 池的 AWS 区域代码。

**`<account-id-without-hyphens>`**  
您的 Amazon Web Services 账户标识符。随机 ID 确保与该区域中的其他存储桶不发生冲突。存储桶名称的第一部分 `wspool-logs` 不随账户或区域而改变。

例如，如果您在美国西部（俄勒冈）区域 (`us-west-2`) 的图像中指定会话脚本`123456789012`，P WorkSpaces ool 将在该地区的账户中创建一个名称显示的 Amazon S3 存储桶。只有具有足够权限的管理员才能删除此存储桶。

```
wspool-logs-us-west-2-1234567890123-abcdefg
```

禁用会话脚本不会删除存储在 S3 存储桶中的日志文件。要永久删除日志文件，您或其他拥有足够权限的管理员必须使用 Amazon S3 控制台或 API 执行此操作。 WorkSpaces Pools 添加了防止意外删除存储桶的存储桶策略。

启用会话脚本后，将为启动的每个流式传输会话创建一个唯一文件夹。

 存储在您账户的 S3 存储桶中的日志文件所在的文件夹路径使用以下结构：

```
<bucket-name>/<stack-name>/<fleet-name>/<access-mode>/<user-id-SHA-256-hash>/<session-id>/SessionScriptsLogs/<session-event>
```

***<bucket-name>***  
存储会话脚本的 S3 存储桶的名称。该名称格式如本节中前面所述。

***<stack-name>***  
会话来自的堆栈的名称。

***<fleet-name>***  
运行会话脚本的 WorkSpaces 池的名称。

***<access-mode>***  
用户的身份方法：用`custom`于 WorkSpaces API 或 CLI、`federated` SAML 以及`userpool`用户池中的用户。

***<user-id-SHA-256-hash>***  
用户特定的文件夹名称。此名称是使用从用户标识符生成的小写 SHA-256 哈希十六进制字符串创建的。

***<session-id>***  
用户的流式传输会话的标识符。每个用户流式传输会话均生成一个唯一 ID。

***<session-event>***  
生成会话脚本日志的事件。事件值为：`SessionStart` 和 `SessionTermination`。

以下示例文件夹结构适用于从 test-stack 和 test-fleet 启动的流式传输会话。该会话使用来自美国西部（俄勒冈）地区的用户 AWS 账户 ID `testuser@mydomain.com` 和 ID 的设置组`test-stack`的 API (`us-west-2`)：`123456789012`

```
wspool-logs-us-west-2-1234567890123-abcdefg/test-stack/test-fleet/custom/a0bcb1da11f480d9b5b3e90f91243143eac04cfccfbdc777e740fab628a1cd13/05yd1391-4805-3da6-f498-76f5x6746016/SessionScriptsLogs/SessionStart/
```

此示例文件夹结构包含一个用于用户上下文会话启动脚本的日志文件，以及一个用于系统上下文会话启动脚本的日志文件（如果适用）。