Подтвердить что ты не робот

Переименуйте компьютер и присоединитесь к домену за один шаг с помощью PowerShell

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

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

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

Функции, которые я использую

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

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

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

  • Вызов Переименовать-компьютер
  • Вызов Join-ComputerToDomain
  • Restart

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

Попытка 2

  • Вызов Join-ComputerToDomain
  • Вызов Переименовать-компьютер
  • Restart

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

Попытка 3

  • Вызов Переименовать-компьютер
  • Restart
  • Вызов Join-ComputerToDomain
  • Restart

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

4b9b3361

Ответ 1

Вы можете просто использовать Add-Computer, есть параметр для "-NewName"

Пример: Add-Computer -DomainName MYLAB.Local -ComputerName TARGETCOMPUTER -newname NewTARGETCOMPUTER

Возможно, вы захотите также проверить параметр "-OPTIONS"

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

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

Если вы действительно хотите получить сложную задачу, вы можете добавить код в свой rename script, который установил бы раздел реестра RunOnce для запуска соединения домена script при перезагрузке. Имейте в виду, что если вы сделаете это, то script, который будет записывать в улей 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

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

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

Параметры JoinWithNewName в Add-Computer могут выполнять эту работу.

- JoinWithNewName: переименовывает имя компьютера в новом домене в имя, указанное параметром NewName. Когда вы используете параметр NewName, этот параметр устанавливается автоматически. Эта опция предназначена для использования с командлетом Rename-Computer. Если вы используете командлет Rename-Computer для переименования компьютера, но не перезагружайте компьютер, чтобы сделать изменение эффективным, вы можете использовать этот параметр, чтобы присоединиться к компьютеру в домен с его новым именем.

$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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

$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

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

#Set A local admin account
$computername = $env:computername   # place computername here for remote access
$username = 'localadmin'
$password = '[email protected]'
$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

У меня есть проверенный код, чтобы присоединиться к домену и переименовать компьютер в 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

В одноэтапных учетных данных 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 = Ваш домен и имя пользователя admin (например, Corp\Jsmith)

Ответ 15

Вот еще один способ сделать с 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}" )