使用PowerShell一步重命名计算机并加入域

时间:2011-06-02 17:15:02

标签: powershell powershell-v2.0

目标:在运行Windows Server 2008 R2的计算机上,使用PowerShell 2.0:

  1. 重命名计算机
  2. 将计算机加入域
  3. 条件:步骤1和2必须一起执行,即它们之间没有重新启动计算机

    我正在使用的功能

    这些是我为每一步创建的PowerShell函数。

    重命名计算机

    根据我的互联网研究,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 添加计算机的包装器,它收集域名并创建一些要使用的凭据。

    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

    1. 致电重命名计算机
    2. 致电加入计算机领域
    3. 重新启动
    4. 结果:重命名计算机的输出表明名称已更改,但重启后,名称更改,但计算机 已加入到域

      尝试2

      1. 致电加入计算机领域
      2. 致电重命名计算机
      3. 重新启动
      4. 结果:重命名计算机的返回值为1326(登录失败:未知用户名或密码错误)。我认为这是因为一旦它加入域,重命名就需要域凭据。我尝试在Rename-Computer中使用带有Get-WmiObject调用的凭据,但是它引发了一个错误,即无法在本地系统上使用不同的凭据。

        尝试3

        1. 致电重命名计算机
        2. 重新启动
        3. 致电加入计算机领域
        4. 重新启动
        5. 结果:一切正常,但需要额外重启。但是我想在步骤2中消除重启。

16 个答案:

答案 0 :(得分:32)

您可以使用Add-Computer,“-NewName”

有一个参数

示例:Add-Computer -DomainName MYLAB.Local -ComputerName TARGETCOMPUTER -newname NewTARGETCOMPUTER

您可能还想检查参数“-OPTIONS”

http://technet.microsoft.com/en-us/library/hh849798.aspx

答案 1 :(得分:6)

此解决方案正在运行:

  • 使用身份验证(无重新启动)
  • 在Active Directory域中输入计算机
  • 使用身份验证重命名计算机(无重启)
  • 之后,重新启动

在代码中:

# get the credential 
$cred = get-credential

# enter the computer in the right place
Add-Computer -DomainName EPFL -Credential $cred -OUPath "...,DC=epfl,DC=ch"

# rename the computer with credential (because we are in the domain)
$Computer = Get-WmiObject Win32_ComputerSystem
$r = $Computer.Rename("NewComputerName", $cred.GetNetworkCredential().Password, $cred.Username)

答案 2 :(得分:5)

实际上有几个原因需要在重命名计算机或加入域时重新启动(这与AD验证的操作基本相同)。一个是基于NT的计算机(我相信这是从Windows 2000开始),应用程序和网络服务在启动时读取计算机名称。这是时间读取计算机名称的时间,因此如果您在不重新启动的情况下重命名计算机,则网络和应用程序服务将不会响应新计算机名称。当您第一次重命名计算机,然后尝试加入域时,这一点尤为重要,因为如果没有网络堆栈响应正确的计算机名称,就无法完成kerberos握手。

另一个原因是多个注册表项使用了计算机名称,并且这些键在加载到内存时无法更改(这也是为什么某些程序需要重新启动才能完成安装或卸载的原因)。

您可以使用RunOnce注册表项(msdn.microsoft.com/en-us/library/aa376977%28v=vs.85%29.aspx)在重新启动时自动运行您的域加入脚本,但您仍然是将不得不为两个操作重新启动。

如果您真的想变得棘手,可以在重命名脚本中添加一些代码,这些代码会设置RunOnce注册表项以在重新启动时启动域加入脚本。请注意,如果要执行此操作,将写入HKLM配置单元的脚本必须以管理员身份运行(如果启用了UAC,则尤其重要)。

如果你想这样做,你可以在Rename-Computer功能结束时使用这样的东西:

Set-Location -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce'
Set-ItemProperty -Path . -Name joinDomain -Value "C:\scripts\joinDomain.ps1"
Restart-Computer

这将在RunOnce注册表项(假设您运行的是Vista / 7/2008)中创建一个名为“joinDomain”的子项,其值为“C:\ scripts \ joinDomain.ps1”

如果这对您不起作用,请尝试将第二行更改为:

Set-ItemProperty -Path . -Name joinDomain -Value 'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe "C:\scripts\joinDomain.ps1"'

如果您遇到麻烦,请告诉我。

答案 3 :(得分:2)

Add-Computer中的Options JoinWithNewName可以完成这项工作。

  

- JoinWithNewName:将新域中的计算机名重命名为NewName参数指定的名称。使用NewName参数时,将自动设置此选项。此选项旨在与Rename-Computer cmdlet一起使用。如果使用Rename-Computer cmdlet重命名计算机,但不重新启动计算机以使更改生效,则可以使用此参数将计算机加入具有新名称的域。

$oldName = Read-Host -Prompt "Enter Original Computer Name"
$newName = Read-Host -Prompt "Enter New Computer Name"
$domain = Read-Host -Prompt "Enter Domain Name to be added"
$user = Read-Host -Prompt "Enter Domain user name"
$password = Read-Host -Prompt "Enter password for $user" -AsSecureString 
$username = "$domain\$user" 
$credential = New-Object System.Management.Automation.PSCredential($username,$password) 
Rename-Computer -NewName $newName -LocalCredential admin -Force
Write-Host "Please waiting for a moment to change Domain and then restart" -ForegroundColor Red
Add-Computer -ComputerName $oldName -DomainName $domain -Options JoinWithNewName -Credential $credential -Restart

答案 4 :(得分:1)

我能够使用以下方法通过一次重启来完成这两项任务,并且它使用以下JoinDomainOrWorkGroup标志。这是一个新版本并使用Windows 2008 R2 Enterprise。我确认它确实在AD中使用新名称创建了计算机帐户。

1(0x1) 默认。将计算机加入域。如果未指定此值,则联接是计算机到工作组

32(0x20) 允许加入新域,即使计算机已加入域

也是如此
$comp=gwmi win32_computersystem
$cred=get-credential
$newname="*newcomputername*"
$domain="*domainname*"
$OU="OU=Servers, DC=domain, DC=Domain, DC=com"
$comp.JoinDomainOrWorkGroup($domain ,($cred.getnetworkcredential()).password, $cred.username, $OU, 33)
$comp.rename($newname,$cred.getnetworkcredential()).password,$cred.username)

答案 5 :(得分:1)

我今天也在寻找同样的东西,最后还有办法做到了。我被暗示这是可能的,因为使用了sconfig,它询问您是否要在将计算机名称加入域后更改计算机名称。这是我的原始代码行。它可能会增强,但现在想累呢。

$strCompName = Read-host 'Name '
$strAdmin = read-host "Authorized user for this operation "
$strDomain = read-host "Name of the domain to be joined "
add-computer -DomainName $strDomain -Credential $strAdmin
Rename-computer -newname $strCompName -DomainCredential $strAdmin

答案 6 :(得分:1)

一步到位w / admin凭证:

Add-Computer -DomainName xxxx -ComputerName xxxx -NewName xxxx -Credential Domain\Admin -Restart

-DomainName =您的域名(例如corp.local)

-ComputerName =您当地计算机的名称(例如您所在的计算机。使用PS中的“主机名”查找姓名)。

-NewName =您要重命名计算机的内容(例如CORP-ANNE-TX)

-Credentials =您的管理员凭据,授予您执行此操作的权限(例如,Domain \ Admin = example Corp \ JSmith。将显示一个对话框以输入您的密码)

分两步:

第1步

Rename-Computer -NewName xxxx -Restart

这里你不必放置-ComputerName,因为它假设你在本地计算机上。如果远程这样做;不同的故事。

第2步

Add-Computer -DomainName xxxx -Credential xxxx\xxxxx -Restart

xxxx \ xxxx =您的域名和管理员用户名(例如Corp \ Jsmith)

答案 7 :(得分:0)

没有人回答,我尝试了一下:

我想我理解为什么Attent一个不起作用。这是因为将计算机连接到域也会以某种方式重命名计算机(域名部分,输入计算机名称)。

所以你试着用完整的WMI方式来做,你在Win32_ComputerSystem类中有一个名为JoinDomainOrWorkgroup的方法。在同一水平上做这件事可能会让你有更多的机会让它发挥作用。

答案 8 :(得分:0)

重命名 - 计算机已从CTP3中删除,因为在重命名计算机时有很多事情要做,而MS要么不想重新创建该过程,要么不能包含所有必要的位。我认为Jefferey Snover说只使用netdom.exe,因为这是在命令行上重命名计算机的最佳做法。不是你想要的答案,但应该指出你正确的方向

答案 9 :(得分:0)

如果您首先在DC上创建计算机帐户,则可以在一次重新启动时更改名称并加入域。

答案 10 :(得分:0)

我想提供以下自动化功能。它显示了步骤的顺序以及首先设置名称,然后加入域之间的关系。我在脚本中使用它作为Win2008r2和win2012r2的编排点,通过Scalr CMP用于EC2和Openstack云实例。

$userid="$DOMAIN\$USERNAME"
$secure_string_pwd = convertto-securestring "SECRET_PASSWORD" -asplaintext -force
$creds = New-Object System.Management.Automation.PSCredential $userid,$secure_string_pwd

Rename-Computer "newhostname" -DomainCredential $creds -Force
WARNING: The changes will take effect after you restart the computer OLDHOSTNAME.

Add-Computer -NewName "newhostname" -DomainName $DOMAIN -Credential $creds \
-OUPath "OU=MYORG,OU=MYSUBORG,DC=THEDOMAIN,DC=Net" -Force
WARNING: The changes will take effect after you restart the computer OLDHOSTNAME.

Restart-Computer

一个警告是要小心凭证,从密钥库中提取它们而不是如此处所示的硬编码......但这是一个不同的主题。

谢谢大家,感谢您的回答。

答案 11 :(得分:0)

这将提示输入计算机名称并加入域然后重新启动。

$computerName = Get-WmiObject Win32_ComputerSystem 
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null 
$name = [Microsoft.VisualBasic.Interaction]::InputBox("Enter Desired Computer Name ")
$computername.rename("$name")
Add-Computer -DomainName [domainname] -Credential [user\domain]  -Verbose
Restart-Computer

答案 12 :(得分:0)

同时在提示符处添加本地帐户+重命名计算机+在promt

加入域名
#Set A local admin account
$computername = $env:computername   # place computername here for remote access
$username = 'localadmin'
$password = 'P@ssw0rd1'
$desc = 'Local admin account'
$computer = [ADSI]"WinNT://$computername,computer"
$user = $computer.Create("user", $username)
$user.SetPassword($password)
$user.Setinfo()
$user.description = $desc
$user.setinfo()
$user.UserFlags = 65536
$user.SetInfo()
$group = [ADSI]("WinNT://$computername/administrators,group")
$group.add("WinNT://$username,user")

# Set computer name 
$computerName = Get-WmiObject Win32_ComputerSystem 
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null 
$name = [Microsoft.VisualBasic.Interaction]::InputBox("Enter Desired Computer Name ")
$computername.rename("$name")

#Now Join to Domain
Add-Computer -DomainName [domainname] -Credential [user\domain]  -Verbose
Restart-Computer

答案 13 :(得分:0)

我有一个经过测试的代码来加入域并将计算机重命名为servicetag。

代码:

$servicetag = Get-WmiObject win32_bios | Select-Object -ExpandProperty SerialNumber
Add-Computer -Credential DOMAIN\USER -DomainName DOMAIN -NewName $servicetag

DOMAIN\USER =编辑域中可以将计算机加入域的用户。示例:

mydomain\admin

DOMAIN =编辑您要加入的域。示例:

mydomain.local

答案 14 :(得分:0)

这是另一种处理系统属性的“计算机名/域更改”Windows的方法。

换句话说,调出系统属性|计算机名称标签然后使用powershell单击更改。这是不同的方法,它在我的情况下很有用,它可能对其他人有帮助。

  

add-type -AssemblyName microsoft.VisualBasic add-type -AssemblyName   System.Windows.Forms的

     

SystemPropertiesComputerName start-sleep -Seconds 1

     

[Microsoft.VisualBasic.Interaction] :: AppActivate(“系统属性”)

     

[System.Windows.Forms.SendKeys] :: SendWait(“{TAB}”)start-sleep    - 秒1

     

[System.Windows.Forms.SendKeys] :: SendWait(“{ENTER}”)

答案 15 :(得分:0)

$domain = "domain.local"
$password = "Passw@rd" | ConvertTo-SecureString -asPlainText -Force
$username = "$domain\Administrator"
$hostname=hostname
$credential = New-Object System.Management.Automation.PSCredential($username,$password)
Add-Computer -DomainName $domain -ComputerName $hostname -NewName alrootca -Credential $credential -Restart

为我工作^^