【问题标题】:Rename computer and join to domain in one step with PowerShell使用 PowerShell 一步重命名计算机并加入域
【发布时间】:2011-09-07 05:59:43
【问题描述】:

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

  1. 重命名计算机
  2. 将计算机加入域

条件:第 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

  1. 调用重命名计算机
  2. 呼叫加入计算机域
  3. 重启

结果: Rename-Computer 的输出表明名称已更改,但重新启动后,名称没有更改,但计算机已加入到域

尝试 2

  1. 呼叫加入计算机域
  2. 调用重命名计算机
  3. 重启

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

尝试 3

  1. 调用重命名计算机
  2. 重启
  3. 呼叫加入计算机域
  4. 重启

结果:一切正常,但需要额外重启。可以,但我想在第 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 等效项似乎需要两次重新启动。

标签: powershell powershell-2.0


【解决方案1】:

你可以直接使用Add-Computer,“-NewName”有一个参数

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

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

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

【讨论】:

  • 看起来 -NewName 参数已添加到 PowerShell 3.0 中的 Add-Computer
  • add-computer -NewName 对我不起作用。我必须先运行 rename-computer,然后 add-computer -options JoinWithNewName。
【解决方案2】:

此解决方案有效:

  • 通过身份验证进入 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)

【讨论】:

    【解决方案3】:

    在重命名计算机或加入域时,实际上有几个原因必须重新启动(这与 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"'
    

    如果您遇到问题,请告诉我。

    【讨论】:

      【解决方案4】:

      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
      

      【讨论】:

        【解决方案5】:

        我能够使用以下方法通过一次重新启动来完成这两项任务,并且它与以下 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)
        

        【讨论】:

          【解决方案6】:

          我今天也在寻找同样的东西,终于找到了办法。我被暗示这是可能的,因为使用了 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
          

          【讨论】:

          • Rename-Computer 在 CTP3 中被移除
          【解决方案7】:

          使用管理员凭据一步完成:

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

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

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

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

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

          分两步:

          第一步

          Rename-Computer -NewName xxxx -Restart
          

          您不必在此处输入 -ComputerName,因为它假定您在本地计算机上。如果远程执行此操作;不同的故事。

          第 2 步

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

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

          【讨论】:

            【解决方案8】:
            $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
            

            为我工作^^

            【讨论】:

            【解决方案9】:

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

            我想我明白为什么 Attent one 不起作用。这是因为将计算机加入域以某种方式也在重命名计算机(域名部分,输入机器名称)。

            那么您是否尝试以完整的 WMI 方式执行此操作,您在 Win32_ComputerSystem class 中有一个名为 JoinDomainOrWorkgroup 的方法。在同一水平上做可能会给你更多的机会让它发挥作用。

            【讨论】:

            • 好主意。实际上,我确实尝试过通过 WMI 使用 JoinDomainOrWorkgroup(虽然我没有提到它),但结果相同。
            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                【解决方案12】:

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

                $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
                

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

                谢谢大家的回答。

                【讨论】:

                  【解决方案13】:

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

                  $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
                  

                  【讨论】:

                  • 这会在计算机加入域之前重新启动计算机
                  【解决方案14】:

                  还添加本地帐户 + 在提示时重命名计算机 + 在提示时加入域

                  #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
                  

                  【讨论】:

                    【解决方案15】:

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

                    代码:

                    $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
                    

                    【讨论】:

                      【解决方案16】:

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

                      换句话说,调出系统属性|计算机名称选项卡,然后使用 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}”) 开始睡眠 – 秒 1

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

                      【讨论】:

                        【解决方案17】:

                        我有一个稍微扩大的问题。我需要重命名一台机器,然后重新加入一个它已经是其成员的域,并且找不到在哪里执行此操作,但它似乎与此处的内容非常接近。上面的个别解决方案没有这样做,但有一些团结......如果你尝试重命名,你会被拒绝。如果您重命名然后重新加入,则会收到帐户已存在错误。您需要通过加入工作组来退出域,然后您可以运行重命名并加入一个命令。

                        $Chops = Get-Credential 
                        # Or bring in a stored credential
                        $NewComputerName = "WhoImGonnaBe" 
                        # or value from CSV
                        $MyDomainName = "MyDomain"
                        Add-Computer -WorkgroupName NotADomain -force -DomainCredential $Chops
                        Add-Computer -DomainName $MyDomainName -Computername $ENV:Computername -NewName $NewComputerName -DomainCredential $Chops -Force -Restart
                        #  If running locally you really only need the -NewName and can omit the -Computername
                        

                        【讨论】:

                          猜你喜欢
                          • 2019-07-05
                          • 2015-03-17
                          • 2012-05-10
                          • 2017-06-12
                          • 2017-04-07
                          • 2015-03-20
                          • 1970-01-01
                          • 2016-09-20
                          • 2021-12-31
                          相关资源
                          最近更新 更多