我在 OSD 的 WinPE 阶段提示用户输入计算机名

I prompt the user for a computer name during the WinPE phase of OSD

在 OSD 部署的 WinPE 阶段,我启动了一个表单供用户输入计算机名称。 PS 脚本的一部分需要导入 ActiveDirectory 模块,但是我无法导入 AD 模块。

Import-Module (Join-Path $(Split-Path $env:SMS_ADMIN_UI_PATH) ConfigurationManager.psd1)
Import-Module ActiveDirectory
文件名设置-OSDComputerNamePrompt-TST.ps1 下面是我要添加的数组之一
Import-Module ActiveDirectory
$ADSites = (Get-ADReplicationSite -filter *).Name

我已将 PowerShell 模块添加到 Boot.Wim 文件中,并且复制了

Prompt for Computer Name form

WinPE 不正常 Windows 并且 Active Directory commandlet 非常特殊(它们需要设置才能在非服务器上工作 OS)所以这是一个糟糕的组合。

正如 iRon 评论的那样,有一些方法可以包含此内容,但这些方法始终不受支持。如果 PE 版本发生变化,可能是因为它必须使用不同的文件来完成,或者可能是新版本完全破解了黑客攻击。 OSD 你不应该依赖这样的东西。 (我不知道您的特定 AD 设置,但对于大多数人来说,在脚本中对域名进行硬编码并在每个站点添加时更新脚本比始终跟上 PE 更改要少得多按设计每年 3 次)

所有在没有模块的情况下工作的 AD 相关内容的回退将是 adsi,它可以在 PE 中工作(要使 Powershell 通常工作,您必须更改启动映像,但 SCCM 支持这些更改,因此它们不提供关于版本更改的额外工作,到目前为止你可能已经这样做了)

使用 adsi,您可以获得这样的网站列表:

$sitesDN = "LDAP://CN=Sites," + $([adsi] "LDAP://RootDSE").Get("ConfigurationNamingContext")
$ADSites = (([adsi]$sitesDN).psbase.children | where {$_.Objectclass -ieq "site"}).Name

附带说明:我假设您有不同的站点需要此代码。如果这是这种方法是 "gold standard" 的情况之一,因为无论 AD 设置如何,它都可以工作,但你个人只有一个不太可能改变的网站(就像很多人可能有的那样)我会建议反对这样一个复杂的解决方案,即使它是故障安全的并且只是硬编码名称。 PE有很多特殊情况,有时很难调试,所以尽可能降低复杂性(当然只要它让你保持同样的方便)。