web-dev-qa-db-ja.com

PowerShellを使用して1つの手順でコンピューターの名前を変更し、ドメインに参加する

目標: Windows Server 2008 R2を実行しているコンピューターでは、PowerShell 2.0を使用して以下を実行します。

  1. コンピューターの名前を変更する
  2. コンピューターをドメインに参加させる

条件:ステップ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

  1. 呼び出しコンピューターの名前変更
  2. 呼び出しJoin-ComputerToDomain
  3. 再起動

結果: Rename-Computerからの出力は、名前が変更されたことを示しますが、再起動後、名前did not change、but computer was join to domain

試行2

  1. 呼び出しJoin-ComputerToDomain
  2. 呼び出しコンピューターの名前変更
  3. 再起動

結果: Rename-Computerからの戻り値は1326です(ログオン失敗:不明なユーザー名または不正なパスワード)。これは、ドメインに参加した後の名前変更にドメイン資格情報が必要だからだと思います。 Rename-ComputerのGet-WmiObject呼び出しで資格情報を使用しようとしましたが、ローカルシステムで別の資格情報を使用できないというエラーがスローされました。

試行3

  1. 呼び出しコンピューターの名前変更
  2. 再起動
  3. 呼び出しJoin-ComputerToDomain
  4. 再起動

結果:すべてが期待どおりに動作しますが、追加の再起動が必要です。動作しますが、手順2での再起動を排除したいです。

27
brett rogers

Add-Computerを使用するだけで、「-NewName」のパラメーターがあります

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

パラメーター「-OPTIONS」も確認することをお勧めします。

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

33

このソリューションは機能しています:

  • 認証付きで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)
6
Laurent Kling

実際には、コンピューターの名前を変更した後、またはドメインに参加するときに再起動する必要があるいくつかの理由があります(これは基本的にADによる検証と同じ操作です)。 1つは、NTベースのコンピューター(これはWindows 2000で開始されたと思われます)で、アプリケーションとネットワークサービスが起動時にコンピューター名を読み取ることです。これはonlyがコンピューター名を読み取る時間なので、再起動せずにコンピューターの名前を変更すると、ネットワークおよびアプリケーションサービスは新しいコンピューター名に応答しません。これは、ネットワークスタックが正しいコンピューター名に応答しないとケルベロスハンドシェイクを完了できないため、最初にコンピューターの名前を変更してからドメインに参加しようとするときに特に重要になります。

別の理由は、いくつかのレジストリキーがコンピューター名を使用し、それらのキーがメモリに読み込まれている間は変更できないことです(これは、一部のプログラムがインストールまたはアンインストールを完了するために再起動を必要とする理由でもあります)。

RunOnceレジストリキー(msdn.Microsoft.com/en-us/library/aa376977%28v=vs.85%29.aspx)を使用して、再起動時にドメイン参加スクリプトを自動的に実行できますが、それでも引き続き実行できます両方の操作で再起動します。

本当にトリッキーにしたい場合は、再起動時にRunOnceレジストリキーを設定してドメイン参加スクリプトを起動するコードを名前変更スクリプトに追加できます。ただし、これを行う場合は、HKLM Hiveに書き込むスクリプトを管理者として実行する必要があることに注意してください(UACを有効にしている場合は特に重要です)。

それを行うには、Rename-Computer関数の最後に次のようなものを使用します。

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

これにより、「C:\ scripts\joinDomain.ps1」という値を持つ「joinDomain」という名前のRunOnceレジストリキーにサブキーが作成されます(Vista/7/2008を実行している場合)。

それでもうまくいかない場合は、2行目を次のように変更してください。

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

問題があれば教えてください。

5
JoeG

add-ComputerのオプションJoinWithNewNameがこの作業を実行できます。

-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
3
titoFlying

私は今日同じことを探していて、最終的にそれを行う方法を得ました。コンピューターをドメインに参加させた後にコンピューター名を変更するかどうかを尋ねる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
Chriz-tian

次の方法を使用して、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)
1
OGWANKENOBI

管理者の資格情報を含むワンステップで:

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。パスワードを入力するダイアログボックスが表示されます)

2段階で:

ステップ1

Rename-Computer -NewName xxxx -Restart

ここでは、ローカルコンピューターにいることを前提としているため、-ComputerNameを入力する必要はありません。これをリモートで行う場合;別の話。

ステップ2

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

xxxx\xxxx =ドメインと管理者ユーザー名(Corp\Jsmithなど)

1
Alan Inman

ドメインに参加し、コンピューターの名前を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
0
Krudus

誰も答えないように、私は何かを試してみてください:

Attent 1が機能しない理由は理解できたと思います。これは、コンピューターをドメインに参加させると、何らかの方法でコンピューターの名前が変更されるためです(ドメイン名の部分、コンピューターの名前を入力します)。

だからあなたは完全なWMIの方法でそれをやろうとしていますか、あなたはWin32_ComputerSystemJoinDomainOrWorkgroupというクラス。同じレベルでそれを行うと、おそらくそれを機能させる機会が増えます。

0
JPBlanc

最初にDC=でマシンアカウントを作成した場合、名前を変更し、1回の再起動でドメインに参加できます。

0
boclark

システムプロパティの「コンピューター名/ドメインの変更」ウィンドウを使用する別の方法を次に示します。

つまり、システムのプロパティ| [コンピューター名]タブを表示し、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
Feedback

また、ローカルアカウントを追加+プロンプトでコンピューターの名前を変更+ 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
0
DisplayName

Rename-ComputerはCTP3から削除されました。コンピューターの名前を変更するときに多くのことが行われ、MSはそのプロセスを再作成したくないか、必要なビットをすべて含めることができなかったためです。 Jefferey Snoverが代わりにnetdom.exeを使用するように言ったのは、コマンドラインでコンピューターの名前を変更するためのベストプラクティスだからだと思います。あなたが探していた答えではありませんが、正しい方向に向けるべきです

0
Arposh
$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

これにより、コンピューター名の入力が求められ、ドメインに参加して再起動します。

$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
DisplayName

自動化された能力で機能する次のものを提供したいと思います。手順の順序と、最初に名前を設定してからドメインに参加するまでの関係を示しています。これをスクリプトで、EC2およびOpenstackクラウドインスタンス用のScalr CMPを介したWin2008r2およびwin2012r2のオーケストレーションポイントとして使用します。

$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

1つの注意点は、資格情報に注意し、ここに示すようにハードコードするのではなくキーストアから取得することですが、それは別のトピックです。

回答ありがとうございます。

0
havoc1