Переименуйте компьютер и присоединитесь к домену за один шаг с помощью PowerShell - PullRequest
27 голосов
/ 02 июня 2011

Цель: На компьютере под управлением Windows Server 2008 R2 используйте PowerShell 2.0 для:

  1. Переименование компьютера
  2. Присоединение компьютера к домену

Условие: Шаги 1 и 2 должны выполняться вместе, т. Е. Без перезагрузки компьютера между ними

Используемые функции

Это функции PowerShell, которые я создавал для каждого шага.

Переименование компьютера

Согласно моим исследованиям в Интернете, PowerShell 2.0 на момент до выпуска имел встроенный командлет под названием Переименуйте компьютер , но он был удален по причинам, неизвестным в 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
        }
    }
}

Присоединить компьютер к домену

Как видите, эта функцияна самом деле это просто оболочка для встроенного командлета 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. Вызов Join-ComputerToDomain
  3. Перезагрузка

Результат: Выходные данные Rename-Computer указывают, что имя было изменено, но после перезагрузки имя не изменилось, но компьютер был присоединен к домену

Попытка 2

  1. Вызов Join-ComputerToDomain
  2. Call Rename-Computer
  3. Перезапуск

Результат: Возвращаемое значение от Rename-Computer равно 1326 (Ошибка входа: неизвестный пользовательимя или неверный пароль).Я предполагаю, что это потому, что учетные данные домена необходимы для переименования, когда он присоединен к домену.Я попытался использовать учетные данные с вызовом Get-WmiObject в Rename-Computer, но он выдал ошибку о невозможности использовать другие учетные данные в локальной системе.

Попытка 3

  1. Вызов Переименование компьютера
  2. Перезагрузка
  3. Вызов Join-ComputerToDomain
  4. Перезапуск

Результат: Все работает как положено, но требуется дополнительный перезапуск.Работает, но я хочу устранить перезапуск на шаге 2.

Ответы [ 16 ]

0 голосов
/ 20 апреля 2016

Также добавьте локальную учетную запись + переименуйте компьютер в приглашении + присоединитесь к домену в приглашении

#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
0 голосов
/ 20 апреля 2016

Это запросит имя компьютера и присоединится к домену, а затем перезагрузится.

$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
0 голосов
/ 11 марта 2016

Я хотел бы предложить следующее, которое работало в автоматическом режиме для меня.Он показывает последовательность шагов и взаимосвязь между установкой имени сначала, а затем присоединением к домену.Я использую это в сценарии в качестве точки оркестровки для 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

Одно предостережение: будьте осторожны с учетными данными, извлекайте их из хранилища ключей, а не жестко запрограммируйте, как показано здесь ... но это другая тема.

Спасибо,всем, за ваши ответы.

0 голосов
/ 11 апреля 2013

Если вы сначала создаете учетную запись компьютера на контроллере домена, вы можете изменить имя и присоединиться к домену за одну перезагрузку.

0 голосов
/ 08 июня 2011

Rename-Computer был удален из CTP3, потому что при переименовании компьютера было сделано много вещей, и MS либо не хотела воссоздавать этот процесс, либо не могла включить все необходимые биты.Я думаю, что Джеффри Сновер сказал, что вместо этого просто используйте netdom.exe, так как это лучшая практика для переименования компьютера в командной строке.Не тот ответ, который вы искали, но он должен указывать вам правильное направление

0 голосов
/ 03 июня 2011

Пока никто не отвечает, я что-то пробую:

Мне кажется, я понимаю, почему Attent One не работает. Это потому, что присоединение компьютера к домену так или иначе переименовывает компьютер (часть имени домена, введите имя машины).

Итак, вы пытаетесь сделать это полностью WMI, у вас есть метод в Win32_ComputerSystem классе с именем JoinDomainOrWorkgroup. Выполнение этого на том же уровне, возможно, даст вам больше шансов заставить его работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...