Переименуйте компьютер и присоединитесь к домену за один шаг с помощью 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 ]

32 голосов
/ 03 июня 2013

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

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

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

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

6 голосов
/ 21 ноября 2012

Это решение работает:

  • Введите компьютер в домене 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)
5 голосов
/ 10 июня 2011

На самом деле есть несколько причин, по которым вам нужно перезагрузить компьютер после переименования компьютера или при присоединении к домену (что по сути является той же самой операцией с проверкой 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 голосов
/ 14 ноября 2013

Параметры 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
1 голос
/ 08 декабря 2016

В одном шаге с учетными данными администратора:

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

-DomainName = Имя вашего домена (например, corp.local)

-ComputerName = Имя вашего локального компьютера (например, Theкомпьютер, на котором вы находитесь. Используйте «Hostname» в PS, чтобы узнать имя).

-NewName = Что вы хотите переименовать компьютер (например, CORP-ANNE-TX)

-Credentials =Ваши учетные данные администратора, которые дают вам разрешение на выполнение этого действия (например, Domain \ Admin = пример Corp \ JSmith. Появится диалоговое окно для ввода вашего пароля)

В два этапа:

Шаг 1

Rename-Computer -NewName xxxx -Restart

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

Шаг 2

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

xxxx \ xxxx = Ваш домен и имя администратора (например, Corp \ Jsmith)

1 голос
/ 22 марта 2012

Я искал то же самое сегодня и наконец нашел способ сделать это.Мне подсказали, что это стало возможным благодаря использованию 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
1 голос
/ 24 февраля 2012

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

У меня работает ^^

0 голосов
/ 08 февраля 2017

Вот еще один способ сделать Windows «Изменение имени компьютера / домена» системных свойств.

Другими словами, вызвать Свойства системы |Вкладка «Имя компьютера» , затем нажмите Изменить с помощью powershell.Это другой подход, он полезен в моей ситуации и может быть полезен для кого-то еще.

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

SystemPropertiesComputerName start-sleep - секунды 1

[Microsoft.VisualBasic.Interaction] :: AppActivate («Свойства системы»)

[System.Windows.Forms.SendKeys] :: SendWait(«{TAB}») start-sleep - секунды 1

[System.Windows.Forms.SendKeys] :: SendWait («{ENTER}»)

0 голосов
/ 15 июля 2016

У меня есть проверенный код для присоединения к домену и переименования компьютера в метку обслуживания.

код:

$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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...