【发布时间】:2011-09-07 05:59:43
【问题描述】:
目标:在运行 Windows Server 2008 R2 的计算机上,使用 PowerShell 2.0 来:
- 重命名计算机
- 将计算机加入域
条件:第 1 步和第 2 步必须一起执行,即它们之间没有重启计算机
我正在使用的功能
这些是我为每个步骤创建的 PowerShell 函数。
重命名计算机
根据我的 Internet 研究,PowerShell 2.0 在发布前的某个时间点有一个名为 Rename-Computer 的内置 cmdlet,但由于 CTP 3 中未知的原因而将其删除。我的版本使用 WMI。
function Rename-Computer
{
param ( [Parameter(Mandatory=$true)][string]$name )
process
{
try
{
$computer = Get-WmiObject -Class Win32_ComputerSystem
$result = $computer.Rename($name)
switch($result.ReturnValue)
{
0 { Write-Host "Success" }
5
{
Write-Error "You need administrative rights to execute this cmdlet"
exit
}
default
{
Write-Host "Error - return value of " $result.ReturnValue
exit
}
}
}
catch
{
Write-Host "Exception occurred in Rename-Computer " $Error
}
}
}
将计算机加入域
如您所见,此函数实际上只是内置 cmdlet Add-Computer 的包装器,它收集域名并创建一些凭据以供使用。
function Join-ComputerToDomain
{
param ( [Parameter(Mandatory=$true)][string]$domain )
process
{
try
{
$_domainCredential = $Host.UI.PromptForCredential("Enter domain credentials", "Enter domain credentials to be used when joining computer to the domain", "", "NetBiosUserName")
Add-Computer -DomainName $_domain -cred $_domainCredential
}
catch
{
Write-Error "Exception occurred in Join-ComputerToDomain " $Error
}
}
}
我尝试过的步骤
尝试 1
- 调用重命名计算机
- 呼叫加入计算机域
- 重启
结果: Rename-Computer 的输出表明名称已更改,但重新启动后,名称没有更改,但计算机已加入到域
尝试 2
- 呼叫加入计算机域
- 调用重命名计算机
- 重启
结果: Rename-Computer 的返回值为 1326(登录失败:未知用户名或错误密码)。我认为这是因为一旦加入域,重命名就需要域凭据。我尝试在 Rename-Computer 中使用 Get-WmiObject 调用的凭据,但它引发了一个错误,即无法在本地系统上使用不同的凭据。
尝试 3
- 调用重命名计算机
- 重启
- 呼叫加入计算机域
- 重启
结果:一切正常,但需要额外重启。可以,但我想在第 2 步消除重启。
【问题讨论】:
-
我认为你做不到。从技术上讲,这些都是重命名操作,并且由于没有重新启动,任何一个都无法真正完成,因此最后一个操作优先。不幸的是,我不相信有一种方法可以通过重新启动来完成这项工作。您可以使用 RunOnce 注册表项 (msdn.microsoft.com/en-us/library/aa376977%28v=vs.85%29.aspx) 在重新启动时自动加入域,但您仍然需要重新启动才能执行这两项操作。
-
我相信你是对的,乔。这与我在 Microsoft TechNet 上提出这个问题时得到的答案基本相同。如果您想稍微充实一下并将其作为此问题的答案,我可以将其标记为答案。
-
在我看来,手动操作是可能的……在 XP 上,重命名计算机,然后将其插入域并重新启动一次。我错了吗?
-
JPBlanc - 我不确定。我最近没有在 XP 上尝试过——我目前正在使用 Server 2008,看来 2 次重启是唯一的方法。
-
在 Server 2008 和 Server 2012 RC 中通过 GUI 执行机器重命名和域加入是可能的,最后一步只需重新启动一次。不过,PowerShell 等效项似乎需要两次重新启动。