Srdelayed.exe

在操作系统启动初期执行系统状态还原操作的应用程序可能无法使用文件管理功能移动、删除或设置某些系统文件的短名称。 Srdelayed.exe 是一个可执行文件,在 Windows Server 2008 中提供了 Windows Server Backup (WSB) 功能,可以使系统状态恢复应用程序移动、删除和设置系统文件的短名称。

Srdelayed 工具适用于系统状态恢复应用程序;它不会替换文件管理功能。 仅当应用程序无法使用 MoveFileExDeleteFileSetFileShortName 函数移动、删除或设置系统文件的短名称时,才应使用此工具。 在系统状态还原和重启期间,系统还原和 wbadmin.exe 命令行工具使用 Srdelayed.exe 在特定系统文件上移动、删除和设置短名称。 因此,Srdelayed 可能对需要能够在其自己的系统状态恢复应用程序中还原这些系统文件的开发人员有用。

Srdelayed 可以执行以下操作:

  • 与具有 MOVEFILE_DELAY_UNTIL_REBOOT 标志的 MoveFileEx 函数类似的移动文件操作
  • 类似于 DeleteFile 函数的删除文件操作
  • SetFileShortName 函数类似的设置短名称操作

若要使用 Srdelayed,应用程序需要完整路径到 Srdelayed.exe 文件的位置,以及已创作的 Unicode 文本文件的完整路径,以包含工具需要执行所请求的所有文件管理操作的信息。 应用程序负责确保此文本文件不包含操作的冗余请求,并处理文件管理操作的任何必需顺序。 例如,由于文件夹必须为空才能删除,因此应用程序需要确保在请求删除文件夹之前,文本文件指定删除文件夹中的所有文件。

如果注册表中尚不存在 SetupExecute 条目,应用程序需要在以下注册表项下创建名为 SetupExecuteREG_MULTI_SZ 类型项:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager

应用程序应使用以下格式将 SetupExecute 的值设置为 Srdelayed.exe 文件的位置的完整路径以及文本文件位置的完整路径。 在文本文件的路径前加前缀 "\\??\",如下所示:

Srdelayed.exe 的完整路径 \\??\文本文件的完整路径

例如,SetupExecute 的以下值指示 Srdelayed.exe 位于 System32 文件夹中,并且文本文件名为 DelayedOperations:

C:\Windows\System32\srdelayed.exe \\??\C:\temp\DelayedOperations

路径和名称中的空格应进行十六进制编码。 例如,对于 Program Files,将路径编码为"\\??\C:Program%20Files\a.dll"。

重启时还原注册表或系统时,应用程序需要确保 SetupExecute 写入正确的注册表配置单元中。 在运行 Srdelayed.exe 之前,将恢复注册表。 应用程序需要将 SetupExecute 写入注册表的恢复版本,因为这是读取的版本。

Srdelayed 输入文件的格式

Srdelayed 执行文件管理操作所需的所有信息都指定为 Unicode 文本文件中的 Unicode 字符字符串。 Unicode 字符的字符串分为每个分区为四个字段的记录。 每个记录指定单个移动文件、删除文件或设置短名称操作。 每个记录的四个字段包含操作的参数。 Srdelayed.exe 按照其记录在字符串中出现的顺序执行每个操作。 应用程序应为此文件中的任何重复记录检查并删除重复项。

以下字符串说明了请求两个操作的文件的格式,并包含两条记录。 每个参数字段以单个 L'\0' 字符结尾。 记录由四个连续字段组成。 附加的单个 L'\0' 字符将追加到所有记录的末尾。

<ParamA1>L'\0'<ParamA2>L'\0'<ParamA3>L'\0'<ParamA4>L'\0'<ParamB1>L'\0'<ParamB2>L'\0'<ParamB3>L'\0'<ParamB4>L'\0'L'\0'
|-----------------------RecordA------------------------|------------------------RecordB------------------------|

第一、第二、第三和第四个参数字段的含义取决于记录是描述移动、删除还是设置短名称操作。

移动文件记录的格式

字段 1 将此标识为移动文件的请求。 此字段中的值始终为 L"MoveFile",区分大小写。

字段 2 指定文件的源位置。 Srdelayed 移动文件操作不支持移动文件夹。 必须在此字段中指定文件。 此字段的值是追加到 "\\??\" 的文件的完整路径除非路径包含全局唯一标识符 (GUID),否则该标识符使用 "\\?\" 作为前缀。 在追加到 "\\??\" 之前删除 "\\?\"。

字段 3 指定文件的目标。 移动文件操作仅在卷内工作。 源和目标必须位于同一卷上。 此字段的值是追加到 "\\??\" 的文件的完整路径除非路径包含全局唯一标识符 (GUID),否则该标识符使用 "\\?\" 作为前缀。 在追加到 "\\??\" 之前删除 "\\?\"。

字段 4 从 Srdelayed 接收状态信息。 此字段中的值应设置为新记录的 L“NotExecuted”。

以下示例按驱动器路径引用文件。 如果源的路径和名称为 C:\Stage\a.dll,则此记录请求 Srdelayed 将其移动到 C:\temp\a.dll。

MoveFile \\??\C:\Stage\a.dll \\??\C:\temp\a.dll NotExecuted

以下示例按卷 GUID 路径引用文件。 如果源的路径和名称为 \\?\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\Stage\a.dll, 此记录请求 Srdelayed 将其移动到 \\?\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\temp\a.dll

MoveFile \\??\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\Stage\a.dll \\??\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\temp\a.dll NotExecuted

删除文件记录的格式

字段 1 将此标识为删除文件的请求。 此字段中的值始终为 L"DeleteFile",区分大小写。

字段 2 未使用。 此字段中的值应设置为 L"Unused"。

字段 3 指定要删除的文件。 文件夹必须为空才能删除。 在删除文件夹之前,使用删除文件操作删除文件夹中的所有文件。 此字段的值是追加到 "\\??\" 的文件的完整路径除非路径包含全局唯一标识符 (GUID),否则该标识符使用 "\\?\" 作为前缀。 在追加到 "\\??\" 之前删除 "\\?\"。

字段 4 从 Srdelayed 接收状态信息。 此字段中的值应设置为新记录的 L“NotExecuted”。

以下示例按驱动器路径引用文件。 如果路径和名称为 C:\temp\b.dll,则此记录请求 Srdelayed 删除文件。

DeleteFile Unused \\??\C:\temp\b.dll NotExecuted

以下示例按卷 GUID 引用文件。 如果路径和名称为 \\?\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\temp\b.dll,则此记录请求 Srdelayed 删除该文件。

DeleteFile Unused \\??\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\temp\b.dll\ NotExecuted

设置短名称记录的格式

字段 1 将此标识为设置文件的短名称的请求。 此字段中的值始终为 L"SetFileShortName",区分大小写。

字段 2 指定短名称。

字段 3 字段指定接收短名称的路径和长名称。 此字段的值是附加到 "\\??\" 的文件的路径和长名称,除非该路径包括使用 "\\?\" 作为前缀的全局唯一标识符 (GUID)。 在追加到 "\\??\" 之前删除 "\\?\"。

字段 4 从 Srdelayed 接收状态信息。 此字段中的值应设置为新记录的 L“NotExecuted”。

以下示例按驱动器路径引用文件。 如果文件的路径和名称为 C:\temp\ShortFileName.dll,则此记录请求文件接收短名称 ShortN~1.dll。

SetFileShortName ShortN~1.dll \\??\C:\temp\ShortFileName.dll NotExecuted

以下示例按卷 GUID 引用文件。 如果文件的路径和名称为 \\?\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\temp\ShortFileName.dll\,则此记录请求该文件接收短名称 ShortN~1.dll。

SetFileShortName ShortN~1.dll \\??\Volume{26a21bda-a627-11d7-9931-806e6f6e6963}\temp\ShortFileName.dll\ NotExecuted

Srdelayed 操作状态

Srdelayed 将字符串 L"SC=xxxxxxx"写入文本文件的每个记录的第四个字段,其中 xxxxxxx 是指示所请求操作的状态的十六进制。 当值为 0 时,表示操作成功。

Srdelayed 在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion 下创建一个名为 SystemRestore 的注册表项,以记录整个还原操作的结果。 如果 Srdelayed 成功执行所有请求的操作,则名称 RestoreStatusResult 将在此键下写入,值为零。 如果 Srdelayed 无法执行任何请求的操作,则名称 RestoreStatusResult 和 RestoreStatusDetails 使用非零值在此键下写入。 仅当 Srdelayed 无法执行任何请求的操作时,才会在此键下写入名称 RestoreStatusDetails。 如果设置文件的短名称的操作失败,Srdelayed 将继续执行下一个操作。 Srdelayed 认为移动文件和删除文件操作至关重要,如果移动或删除操作失败,则不会继续。