使用 UEFI 程序集 & Configuration Manager 使用 SEMM 管理设备

Surface UEFI 设备的 Surface Enterprise Management Mode (SEMM) 功能允许管理员管理和帮助保护 Surface UEFI 设置的配置。 对于大多数组织来说,此过程是通过使用 Surface IT Toolkit 中的 UEFI 配置器工具创建 Windows Installer (.msi) 包来完成的。 然后,这些包将运行或部署到客户端 Surface 设备,以在 SEMM 中注册设备并更新 Surface UEFI 设置配置。

对于具有终结点Configuration Manager的组织,可以使用 Surface UEFI 配置器 .msi 流程来部署和管理 SEMM。 Surface UEFI 管理器是一种轻型安装程序,使 SEMM 管理所需的程序集在设备上可用。 在托管客户端上使用 Surface UEFI Manager 安装这些程序集时,可以通过Configuration Manager使用部署为应用程序的 PowerShell 脚本来管理 SEMM。 这样就无需使用外部 Surface UEFI 配置器工具。

注意

尽管本文中所述的过程可能适用于早期版本的 Configuration Manager 或其他第三方管理解决方案,但只有 Configuration Manager 的 Current Branch 支持使用 Surface UEFI 管理器和 PowerShell 管理 SEMM。

必备条件

在开始本文中所述的过程之前,请先熟悉以下技术和工具:

重要提示

还需要访问要用于保护 SEMM 的证书。 有关此证书的要求的详细信息,请参阅 SEMM 证书要求

请务必将此证书保存在安全的位置并正确备份。 如果此证书丢失或不可用,则无法重置 Surface UEFI、更改托管的 Surface UEFI 设置或从已注册的 Surface 设备中删除 SEMM。

下载 Surface UEFI 管理器

使用 Configuration Manager 管理 SEMM 需要在每台客户端 Surface 设备上安装 Surface UEFI 管理器。 可以从 Surface IT 工具包工具库下载 Surface UEFI 管理器。

下载用于Configuration Manager的 SEMM 脚本

在客户端 Surface 设备上安装 UEFI 管理器后,可以使用 PowerShell 脚本部署和管理 SEMM。 从 Surface IT 工具包获取脚本示例。

部署 Surface UEFI 管理器

Surface UEFI 管理器部署是典型的应用程序部署。 Surface UEFI Manager 安装程序文件是一个标准 Windows Installer 文件,你可以使用 标准静默选项安装该文件。

安装 Surface UEFI 管理器的命令如下所示。

msiexec /i "SurfaceUEFIManagerSetup.msi" /q

卸载 Surface UEFI 管理器的命令如下所示。

msiexec /x {541DA890-1AEB-446D-B3FD-D5B3BB18F9AF} /q

若要创建新应用程序并将其部署到包含 Surface 设备的集合,请执行以下步骤:

  1. “开始”屏幕或“开始”菜单打开Configuration Manager控制台。

  2. 选择窗口左下角的“ 软件库 ”。

  3. 展开“软件库”的“ 应用程序管理 ”节点,然后选择“ 应用程序”。

  4. 选择窗口顶部“开始”选项卡下的“Create应用程序”按钮。 这会启动Create应用程序向导。

  5. Create应用程序向导提供了一系列步骤:

    • 常规 - 默认情况下,“ 从安装文件自动检测有关此应用程序的信息 ”选项处于选中状态。 在 “类型” 字段中,默认情况下还会选择 Windows Installer (.msi 文件) 。 选择“ 浏览 ”导航到并选择“ SurfaceUEFIManagerSetup.msi”,然后选择“ 下一步”。

      注意

      SurfaceUEFIManagerSetup.msi 的位置必须位于网络共享上,并且位于不包含其他文件的文件夹中。 无法使用本地文件位置。

    • 导入信息 - Create应用程序向导分析 .msi 文件并读取应用程序名称和产品代码。 SurfaceUEFIManagerSetup.msi 应作为内容文件行下的唯一 文件列出,如图 1 所示。 选择“ 下一步 ”以继续。

      将自动分析 Surface UEFI 管理器设置中的信息。

      图 1. Surface UEFI 管理器设置中的信息会自动分析

    • 常规信息 - 可以修改应用程序的名称以及有关发布者和版本的信息,或在此页上添加注释。 Surface UEFI 管理器的安装命令显示在“安装程序”字段中。 “为系统安装”的默认安装行为允许 Surface UEFI 管理器安装 SEMM 所需的程序集,即使用户未登录到 Surface 设备也是如此。 选择“ 下一步 ”以继续。

    • 摘要 - 在 “导入信息” 步骤中分析的信息以及从 “常规信息” 步骤中选择的信息将显示在此页面上。 选择“ 下一步 ”以确认选择并创建应用程序。

    • 进度 – 在应用程序导入并添加到软件库时显示进度栏和状态。

    • 完成 – 应用程序创建过程完成后,将显示成功创建应用程序的确认。 选择“关闭”以完成Create应用程序向导。

在 Configuration Manager 中创建应用程序后,可以将其分发到分发点,并将其部署到集合,包括 Surface 设备。 此应用程序不会在 Surface 设备上安装或启用 SEMM。 它仅提供使用 PowerShell 脚本启用 SEMM 所需的程序集。

如果不想在不使用 SEMM 管理的设备上安装 Surface UEFI 管理器程序集,可以将 Surface UEFI 管理器配置为 SEMM Configuration Manager脚本的依赖项。 本文后面的部署 SEMM Configuration Manager脚本部分介绍了此方案。

Create或修改 SEMM Configuration Manager脚本

在设备上安装所需的程序集后,使用 PowerShell 脚本完成在 SEMM 中注册设备和配置 Surface UEFI 的过程,并使用 Configuration Manager 部署为脚本应用程序。 可以修改这些脚本,以满足组织和环境的需求。 例如,可以为不同部门或角色中的受管理 Surface 设备创建多个配置。 从 Surface IT 工具包下载适用于 SEMM 和Configuration Manager的脚本示例

若要使用 Configuration Manager 执行 SEMM 部署,需要两个主要脚本:

  • ConfigureSEMM.ps1 - 在 Surface IT 工具包Surface 设备脚本下提供。 使用此脚本为具有所需 Surface UEFI 设置的 Surface 设备创建配置包,以将指定的设置应用于 Surface 设备、在 SEMM 中注册设备,以及设置用于在 SEMM 中标识设备注册的注册表项。
  • ResetSEMM.ps1 - 在 Surface IT 工具包的“其他 Surface 设备脚本”下提供。 使用此脚本在 Surface 设备上重置 SEMM,这会从 SEMM 中取消注册 SEMM 并删除对 Surface UEFI 设置的控制。

示例脚本包括如何设置 Surface UEFI 设置以及如何控制对这些设置的权限的示例。 可以修改这些设置来保护 Surface UEFI,并根据环境的需求设置 Surface UEFI 设置。 本文的以下部分介绍了 ConfigureSEMM.ps1 脚本,并探讨需要对脚本进行哪些修改才能满足你的要求。

注意

SEMM Configuration Manager脚本和导出的 SEMM 证书文件 (.pfx) 应放置在同一文件夹中,没有其他文件,然后才能将其添加到Configuration Manager。

在受支持的设备上管理 USB 端口

可以通过以下方法之一实现动态 USB-C 禁用:

本文的以下部分介绍了 ConfigureSEMM.ps1 脚本,并探讨需要对脚本进行哪些修改才能满足你的要求。

指定证书和包名称

需要修改的脚本的第一个区域是指定和加载 SEMM 证书的部分,还指示 SurfaceUEFIManager 版本,以及 SEMM 配置包和 SEMM 重置包的名称。 证书名称和 SurfaceUEFIManager 版本在 ConfigureSEMM.ps1 脚本的第 56 行到第 73 行指定。

56	$WorkingDirPath = split-path -parent $MyInvocation.MyCommand.Definition
57	$packageRoot = "$WorkingDirPath\Config"
58	$certName = "FabrikamSEMMSample.pfx"
59  $DllVersion = "2.26.136.0"
60
61  $certNameOnly = [System.IO.Path]::GetFileNameWithoutExtension($certName)
62  $ProvisioningPackage = $certNameOnly + "ProvisioningPackage.pkg"
63  $ResetPackage = $certNameOnly + "ResetPackage.pkg"
64
65	if (-not (Test-Path $packageRoot))  { New-Item -ItemType Directory -Force -Path $packageRoot }
66	Copy-Item "$WorkingDirPath\$certName" $packageRoot
67	
68	$privateOwnerKey = Join-Path -Path $packageRoot -ChildPath $certName
69	$ownerPackageName = Join-Path -Path $packageRoot -ChildPath $ProvisioningPackage
70	$resetPackageName = Join-Path -Path $packageRoot -ChildPath $ResetPackage
71	
72	# If your PFX file requires a password then it can be set here, otherwise use a blank string.
73	$password = "1234" 

$certName 变量的 FabrikamSEMMSample.pfx 值替换为第 58 行的 SEMM 证书文件的名称。 该脚本 (脚本所在的文件夹中创建名为 Config) 的工作目录,然后将证书文件复制到此工作目录。

所有者包和重置包也将在 Config 目录中创建,并保存脚本生成的 Surface UEFI 设置和权限的配置。

在第 73 行,将 $password 变量的值从 1234 替换为证书文件的密码。 如果不需要密码,请删除 1234 文本。

注意

在 SEMM 中注册设备需要证书指纹的最后两个字符。 此脚本将向用户显示这些数字,允许用户或技术人员在系统重新启动以在 SEMM 中注册设备之前记录这些数字。 该脚本使用以下代码(位于第 150-155 行)来实现此目的。

150	# Device owners will need the last two characters of the thumbprint to accept SEMM ownership.
151	# For convenience we get the thumbprint here and present to the user.
152	$pw = ConvertTo-SecureString $password -AsPlainText -Force
153	$certPrint = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
154	$certPrint.Import($privateOwnerKey, $pw, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet)
155	Write-Host "Thumbprint =" $certPrint.Thumbprint

有权访问证书文件 (.pfx 的管理员) 可以随时通过在 CertMgr 中打开 .pfx 文件来读取指纹。 若要使用 CertMgr 查看指纹,请遵循以下过程:

  1. 右键单击 .pfx 文件,然后选择“ 打开”。
  2. 在导航窗格中展开文件夹。
  3. 选择“ 证书”。
  4. 在“main”窗格中右键单击证书,然后选择“打开”。
  5. 选择“ 详细信息 ”选项卡。
  6. 必须在“显示”下拉菜单中选择“全部”或“仅属性”。
  7. 选择字段 “指纹”。

注意

还必须在 ResetSEMM.ps1 脚本的此部分中输入 SEMM 证书名称和密码,以便Configuration Manager通过卸载操作从设备中删除 SEMM。

配置权限

你将在其中指定 Surface UEFI 配置的脚本的第一个区域是 “配置权限” 区域。 此区域从示例脚本中的第 210 行开始,注释 为 #配置权限 ,并继续为第 247 行。 以下代码片段首先设置所有 Surface UEFI 设置的权限,以便只能由 SEMM 修改它们,然后添加显式权限以允许本地用户修改 Surface UEFI 密码、TPM 以及前置和后置摄像头。

210	# Configure Permissions
211	foreach ($uefiV2 IN $surfaceDevices.Values) {
212 if ($uefiV2.SurfaceUefiFamily -eq $Device.Model) {
213 Write-Host "Configuring permissions"
214 Write-Host $Device.Model
215 Write-Host "======================="
216
217	# Here we define which "identities" will be allowed to modify which settings
218	#   PermissionSignerOwner = The primary SEMM enterprise owner identity
219	#   PermissionLocal = The user when booting to the UEFI pre-boot GUI
220	#   PermissionSignerUser, PermissionSignerUser1, PermissionSignerUser2 =
221	#     Additional user identities created so that the signer owner
222	#     can delegate permission control for some settings.
223	$ownerOnly = [Microsoft.Surface.IUefiSetting]::PermissionSignerOwner
224	$ownerAndLocalUser = ([Microsoft.Surface.IUefiSetting]::PermissionSignerOwner -bor [Microsoft.Surface.IUefiSetting]::PermissionLocal)
225	
226	# Make all permissions owner only by default
227	foreach ($setting IN $uefiV2.Settings.Values) {
228	$setting.ConfiguredPermissionFlags = $ownerOnly
229	}
230	
231 # Allow the local user to change their own password
232	$uefiV2.SettingsById[501].ConfiguredPermissionFlags = $ownerAndLocalUser
233
234	Write-Host ""
235	 
236	# Create a unique package name based on family and LSV.
237	# We will choose a name that can be parsed by later scripts.
238	$packageName = $uefiV2.SurfaceUefiFamily + "^Permissions^" + $lsv + ".pkg"
239	$fullPackageName = Join-Path -Path $packageRoot -ChildPath $packageName
240	
241	# Build and sign the Permission package then save it to a file.
242	$permissionPackageStream =  $uefiV2.BuildAndSignPermissionPackage($privateOwnerKey, $password, "", $null, $lsv)
243	$permissionPackage = New-Object System.IO.Filestream($fullPackageName, [System.IO.FileMode]::CreateNew, [System.IO.FileAccess]::Write)
244	$permissionPackageStream.CopyTo($permissionPackage)
245	$permissionPackage.Close()
246	}
247	}

每个 $uefiV 2 变量通过设置名称或 ID 来标识 Surface UEFI 设置,然后配置以下值之一的权限:

  • $ownerOnly – 仅向 SEMM 授予修改此设置的权限。
  • $ownerAndLocalUser - 向启动到 Surface UEFI 的本地用户以及 SEMM 授予修改此设置的权限。

有关 Surface UEFI 的可用设置名称和 ID 的信息,请参阅本文的设置 名称和 ID 部分。

配置设置

将指定 Surface UEFI 配置的脚本的第二个区域是 ConfigureSEMM.ps1 脚本的 “配置设置” 区域,用于配置是启用或禁用每个设置。 示例脚本包括将所有设置设置为默认值的说明。 然后,该脚本会明确说明如何禁用 IPv6 for PXE Boot,并使 Surface UEFI 管理员密码保持不变。 可以在示例脚本的第 291 行到第 335 行找到从 #配置设置 注释开始的此区域。 区域如下所示。

291	# Configure Settings
292	foreach ($uefiV2 IN $surfaceDevices.Values) {
293 if ($uefiV2.SurfaceUefiFamily -eq $Device.Model) {
294 Write-Host "Configuring settings"
295 Write-Host $Device.Model
296 Write-Host "===================="
297
298	# In this demo, we will start by setting every setting to the default factory setting.
299	# You may want to start by doing this in your scripts
300	# so that every setting gets set to a known state.
301	foreach ($setting IN $uefiV2.Settings.Values) {
302	$setting.ConfiguredValue = $setting.DefaultValue
303	}
304	
305	$EnabledValue = "Enabled"
306 $DisabledValue = "Disabled"
307
308 # If you want to set something to a different value from the default,
309	# here are examples of how to accomplish this.
310	# This disables IPv6 PXE boot by name:
311 $uefiV2.Settings["IPv6 for PXE Boot"].ConfiguredValue = $DisabledValue
312
313 # This disables IPv6 PXE Boot by ID:
314 $uefiV2.SettingsById[400].ConfiguredValue = $DisabledValue
315
316 Write-Host ""
317
318	# If you want to leave the setting unmodified, set it to $null
319	# PowerShell has issues setting things to $null so ClearConfiguredValue()
320	# is supplied to do this explicitly.
321	# Here is an example of leaving the UEFI administrator password as-is,
322	# even after we initially set it to factory default above.
323	$uefiV2.SettingsById[501].ClearConfiguredValue()
324	
325	# Create a unique package name based on family and LSV.
326	# We will choose a name that can be parsed by later scripts.
327	$packageName = $uefiV2.SurfaceUefiFamily + "^Settings^" + $lsv + ".pkg"
328	$fullPackageName = Join-Path -Path $packageRoot -ChildPath $packageName
329	
330	# Build and sign the Settings package then save it to a file.
331	$settingsPackageStream =  $uefiV2.BuildAndSignSecuredSettingsPackage($privateOwnerKey, $password, "", $null, $lsv)
332	$settingsPackage = New-Object System.IO.Filestream($fullPackageName, [System.IO.FileMode]::CreateNew, [System.IO.FileAccess]::Write)
333	$settingsPackageStream.CopyTo($settingsPackage)
334	$settingsPackage.Close()
335	}

与脚本的 “配置权限” 部分中设置的权限一样,每个 Surface UEFI 设置的配置都是通过定义 $uefiV 2 变量来执行的。 对于定义 $uefiV 2 变量的每一行,Surface UEFI 设置由设置名称或 ID 标识,配置的值设置为“启用或禁用”。

如果不想更改 Surface UEFI 设置的配置,例如,若要确保将所有 Surface UEFI 设置重置为默认值的操作不会清除 Surface UEFI 管理员密码,可以使用 ClearConfiguredValue () 强制不更改此设置。 在示例脚本中,这在第 323 行上使用,以防止清除 Surface UEFI 管理员密码,该密码在示例脚本中通过其设置 ID 501 进行标识。

有关 Surface UEFI 的可用设置名称和 ID 的信息,请参阅本文后面的 设置名称和 ID 部分。

设置注册表项

为了识别Configuration Manager的已注册系统,ConfigureSEMM.ps1 脚本会编写注册表项,这些注册表项可用于将注册的系统标识为已随 SEMM 配置脚本一起安装。 可以在以下位置找到这些密钥。

HKLM\SOFTWARE\Microsoft\Surface\SEMM

以下代码片段(位于第 380-477 行)用于编写这些注册表项。

380	# For Configuration Manager or other management solutions that wish to know what version is applied, tattoo the LSV and current DateTime (in UTC) to the registry:
381	$UTCDate = (Get-Date).ToUniversalTime().ToString()
382	$certIssuer = $certPrint.Issuer
383	$certSubject = $certPrint.Subject
384	
385	$SurfaceRegKey = "HKLM:\SOFTWARE\Microsoft\Surface\SEMM"
386	New-RegKey $SurfaceRegKey
387	$LSVRegValue = Get-ItemProperty $SurfaceRegKey LSV -ErrorAction SilentlyContinue
388	$DateTimeRegValue = Get-ItemProperty $SurfaceRegKey LastConfiguredUTC -ErrorAction SilentlyContinue
389	$OwnershipSessionIdRegValue = Get-ItemProperty $SurfaceRegKey OwnershipSessionId -ErrorAction SilentlyContinue
390	$PermissionSessionIdRegValue = Get-ItemProperty $SurfaceRegKey PermissionSessionId -ErrorAction SilentlyContinue
391	$SettingsSessionIdRegValue = Get-ItemProperty $SurfaceRegKey SettingsSessionId -ErrorAction SilentlyContinue
392	$IsResetRegValue = Get-ItemProperty $SurfaceRegKey IsReset -ErrorAction SilentlyContinue
393	$certUsedRegValue = Get-ItemProperty $SurfaceRegKey CertName -ErrorAction SilentlyContinue
394	$certIssuerRegValue = Get-ItemProperty $SurfaceRegKey CertIssuer -ErrorAction SilentlyContinue
395	$certSubjectRegValue = Get-ItemProperty $SurfaceRegKey CertSubject -ErrorAction SilentlyContinue
396	
397	
398	If ($LSVRegValue -eq $null)
399	{
400	    New-ItemProperty -Path $SurfaceRegKey -Name LSV -PropertyType DWORD -Value $lsv | Out-Null
401	}
402	Else
403	{
404	    Set-ItemProperty -Path $SurfaceRegKey -Name LSV -Value $lsv
405	}
406	
407	If ($DateTimeRegValue -eq $null)
408	{
409	    New-ItemProperty -Path $SurfaceRegKey -Name LastConfiguredUTC -PropertyType String -Value $UTCDate | Out-Null
410	}
411	Else
412	{
413	    Set-ItemProperty -Path $SurfaceRegKey -Name LastConfiguredUTC -Value $UTCDate
414	}
415	
416	If ($OwnershipSessionIdRegValue -eq $null)
417	{
418	    New-ItemProperty -Path $SurfaceRegKey -Name OwnershipSessionId -PropertyType String -Value $ownerSessionIdValue | Out-Null
419	}
420	Else
421	{
422	    Set-ItemProperty -Path $SurfaceRegKey -Name OwnershipSessionId -Value $ownerSessionIdValue
423	}
424	
425	If ($PermissionSessionIdRegValue -eq $null)
426	{
427	    New-ItemProperty -Path $SurfaceRegKey -Name PermissionSessionId -PropertyType String -Value $permissionSessionIdValue | Out-Null
428	}
429	Else
430	{
431	    Set-ItemProperty -Path $SurfaceRegKey -Name PermissionSessionId -Value $permissionSessionIdValue
432	}
433	
434	If ($SettingsSessionIdRegValue -eq $null)
435	{
436	    New-ItemProperty -Path $SurfaceRegKey -Name SettingsSessionId -PropertyType String -Value $settingsSessionIdValue | Out-Null
437	}
438	Else
439	{
440	    Set-ItemProperty -Path $SurfaceRegKey -Name SettingsSessionId -Value $settingsSessionIdValue
441	}
442	
443	If ($IsResetRegValue -eq $null)
444	{
445	    New-ItemProperty -Path $SurfaceRegKey -Name IsReset -PropertyType DWORD -Value 0 | Out-Null
446	}
447	Else
448	{
449	    Set-ItemProperty -Path $SurfaceRegKey -Name IsReset -Value 0
450	}
451	
452	If ($certUsedRegValue -eq $null)
453	{
454	    New-ItemProperty -Path $SurfaceRegKey -Name CertName -PropertyType String -Value $certName | Out-Null
455	}
456	Else
457	{
458	    Set-ItemProperty -Path $SurfaceRegKey -Name CertName -Value $certName
459	}
460	
461	If ($certIssuerRegValue -eq $null)
462	{
463	    New-ItemProperty -Path $SurfaceRegKey -Name CertIssuer -PropertyType String -Value $certIssuer | Out-Null
464	}
465	Else
466	{
467	    Set-ItemProperty -Path $SurfaceRegKey -Name CertIssuer -Value $certIssuer
468	}
469	
470	If ($certSubjectRegValue -eq $null)
471	{
472	    New-ItemProperty -Path $SurfaceRegKey -Name CertSubject -PropertyType String -Value $certSubject | Out-Null
473	}
474	Else
475	{
476	    Set-ItemProperty -Path $SurfaceRegKey -Name CertSubject -Value $certSubject
477	}

设置名称和 ID

若要为 Surface UEFI 设置配置 Surface UEFI 设置或权限,必须通过其设置名称或设置 ID 引用每个设置。 对于 Surface UEFI 的每个新更新,可能会添加新设置。 在 Surface Tools for IT) 中从 SEMM_Powershell.zip 运行 ShowSettingsOptions.ps1 脚本 (提供了可用设置的详细信息。 运行 ShowSettingsOptions.ps1 的计算机必须安装 Surface UEFI 管理器,但脚本不需要 Surface 设备。

部署 SEMM Configuration Manager脚本

准备好在客户端设备上配置和启用 SEMM 后,下一步是在 Configuration Manager 中添加这些脚本作为应用程序。 在打开Configuration Manager之前,请确保以下文件位于不包含其他文件的共享文件夹中:

  • ConfigureSEMM.ps1
  • ResetSEMM.ps1
  • SEMM 证书 (例如 SEMMCertificate.pfx)

SEMM Configuration Manager脚本作为脚本应用程序添加到Configuration Manager。 使用 ConfigureSEMM.ps1 安装 SEMM 的命令如下所示。

Powershell.exe -file ".\ConfigureSEMM.ps1"

使用 ResetSEMM.ps1 卸载 SEMM 的命令如下所示。

Powershell.exe -file ".\ResetSEMM.ps1"

若要将 SEMM Configuration Manager 脚本添加到作为应用程序Configuration Manager,请使用以下过程:

  1. 使用本文前面的部署 Surface UEFI 管理器部分中的步骤 1 到步骤 5 启动Create应用程序向导。

  2. 按如下所示继续执行Create应用程序向导:

    • 常规 – 选择 “手动指定应用程序信息”,然后选择“ 下一步”。

    • 常规信息 - 输入应用程序的名称 (例如 SEMM) ,以及在此页上所需的任何其他信息,例如发布者、版本或注释。 选择“ 下一步 ”以继续。

    • 应用程序目录 - 此页上的字段可以保留其默认值。 选择下一步

    • 部署类型 – 选择“添加”以启动Create部署类型向导。

    • 继续执行Create部署类型向导的步骤,如下所示:

      • 常规 - 从“类型”下拉菜单中选择“脚本安装程序”。 将自动选择“ 手动指定部署类型信息 ”选项。 选择“ 下一步 ”以继续。
      • 常规信息 - 输入部署类型的名称 (例如 SEMM 配置脚本) ,然后选择“ 下一步 ”继续。
      • 内容 – 选择“内容位置”字段旁边的“浏览”,然后选择 SEMM Configuration Manager脚本所在的文件夹。 在 “安装程序” 字段中,键入本文前面找到的 安装命令 。 在 “卸载程序” 字段中,输入本文前面找到的 卸载命令 (如图 2) 所示。 选择“ 下一步 ”移动到下一页。

      将 SEMM Configuration Manager 脚本设置为安装和卸载命令。

      图 2. 将 SEMM Configuration Manager 脚本设置为安装和卸载命令

      • 检测方法 – 选择“添加子句”以添加 SEMM Configuration Manager脚本注册表项检测规则。 随即显示 “检测规则 ”窗口,如图 3 所示。 使用以下设置:

        • “设置类型”下拉菜单中选择“注册表”。
        • Hive 下拉菜单中选择“HKEY_LOCAL_MACHINE”。
        • “密钥”字段中输入 SOFTWARE\Microsoft\Surface\SEMM
        • “值”字段中输入“CertName”。
        • 从“数据类型”下拉菜单中选择“字符串”。
        • 选择“ 此注册表设置必须满足以下规则”以指示存在此应用程序 按钮。
        • “值 ”字段中输入在脚本的第 58 行中输入的证书的名称。
        • 选择“ 确定” 关闭“ 检测规则” 窗口。

      使用注册表项标识在 SEMM 中注册的设备。

      图 3. 使用注册表项标识在 SEMM 中注册的设备

      • 选择“ 下一步 ”转到下一页。

      • 用户体验 - 从 “安装 行为”下拉菜单中选择“ 系统安装 ”。 如果希望用户自行记录并输入证书指纹,请将登录要求保留为“ 仅当用户登录时”。 如果希望管理员输入用户的指纹,而用户不需要查看指纹,请从“登录要求”下拉菜单中选择“是否登录用户”。

      • 要求 - ConfigureSEMM.ps1 脚本会在尝试启用 SEMM 之前自动验证设备是否为 Surface 设备。 但是,如果你打算将此脚本应用程序部署到具有除使用 SEMM 管理的设备以外的设备的集合,可以在此处添加要求,以确保此应用程序仅在 Surface 设备或打算使用 SEMM 管理的设备上运行。 选择“ 下一步 ”以继续。

      • 依赖项 – 选择“ 添加 ”以打开“ 添加依赖项” 窗口。

        • 选择“ 添加 ”,打开“ 指定所需的应用程序 ”窗口。

          • 在“ 依赖项组 名称”字段中输入 SEMM 依赖项的名称, (例如 SEMM 程序集) 。

          • “可用应用程序”列表和 MSI 部署类型中选择“Surface UEFI 管理器”,然后选择“确定”以关闭“指定所需的应用程序”窗口。

          • 如果想要在尝试使用Configuration Manager脚本启用 SEMM 时自动在设备上安装 Surface UEFI 管理器,请保持选中“自动安装检查”框。 选择 “确定” 以关闭 “添加依赖项” 窗口。
      • 选择“ 下一步 ”以继续。

      • 摘要 - 在整个Create部署类型向导中输入的信息会显示在此页上。 选择“ 下一步 ”以确认选择。

      • 进度 - 此页上会显示为 SEMM 脚本应用程序添加部署类型的进度栏和状态。

      • 完成 – 该过程完成后,将显示部署类型创建确认。 选择“关闭”以完成Create部署类型向导。

    • 摘要 - 将显示在整个Create应用程序向导中输入的信息。 选择“ 下一步 ”以创建应用程序。

    • 进度 – 此页上会显示将应用程序添加到软件库的进度栏和状态。

    • 完成 – 应用程序创建过程完成后,将显示成功创建应用程序的确认。 选择“关闭”以完成Create应用程序向导。

在Configuration Manager软件库中提供脚本应用程序后,可以使用你准备到设备或集合的脚本来分发和部署 SEMM。 如果已将 Surface UEFI 管理器程序集配置为将自动安装的依赖项,则可以在一个步骤中部署 SEMM。 如果尚未将程序集配置为依赖项,则必须在启用 SEMM 之前将其安装在要管理的设备上。

使用此脚本应用程序和最终用户可见的配置部署 SEMM 时,PowerShell 脚本将启动,证书的指纹将显示在 PowerShell 窗口。 你可以让用户记录此指纹,并在设备重启后 Surface UEFI 提示时输入指纹。

或者,可以将应用程序安装配置为自动重新启动,并配置为不可见地安装给用户。 在这种情况下,需要技术人员在重新启动时在每个设备上输入指纹。 有权访问证书文件的任何技术人员都可以通过 CertMgr 查看证书来读取指纹。 本文Create或修改 SEMM Configuration Manager 脚本部分介绍了如何使用 CertMgr 查看指纹。

使用这些脚本从使用 Configuration Manager 部署的设备中删除 SEMM 与使用 Configuration Manager 卸载应用程序一样简单。 此操作启动 ResetSEMM.ps1 脚本,并使用在部署 SEMM 期间使用的相同证书文件正确取消注册设备。

注意

Surface 建议仅在需要取消注册设备时才创建重置包。 这些重置包通常仅对一个设备有效,由序列号标识。 但是,可以创建一个通用重置包,该包适用于使用此证书在 SEMM 中注册的任何设备。

强烈建议像在 SEMM 中注册设备时所用的证书一样仔细保护通用重置包。 请记住,与证书本身一样,此通用重置包可用于从 SEMM 取消注册组织的任何 Surface 设备。

安装重置包时,LSV) 的最低支持值 (重置为 1。 可以使用现有配置包重新注册设备。 在获取所有权之前,设备将提示输入证书指纹。

因此,在 SEMM 中重新注册设备需要在该设备上创建并安装一个新包。 由于此操作是新注册,而不是已在 SEMM 中注册的设备上的配置更改,因此在获取所有权之前,设备将提示输入证书指纹。