目標: 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
}
}
}
結果: Rename-Computerからの出力は、名前が変更されたことを示しますが、再起動後、名前did not change、but computer was join to domain
結果: Rename-Computerからの戻り値は1326です(ログオン失敗:不明なユーザー名または不正なパスワード)。これは、ドメインに参加した後の名前変更にドメイン資格情報が必要だからだと思います。 Rename-ComputerのGet-WmiObject呼び出しで資格情報を使用しようとしましたが、ローカルシステムで別の資格情報を使用できないというエラーがスローされました。
結果:すべてが期待どおりに動作しますが、追加の再起動が必要です。動作しますが、手順2での再起動を排除したいです。
Add-Computerを使用するだけで、「-NewName」のパラメーターがあります
例:Add-Computer -DomainName MYLAB.Local -ComputerName TARGETCOMPUTER -newname NewTARGETCOMPUTER
パラメーター「-OPTIONS」も確認することをお勧めします。
このソリューションは機能しています:
コード内:
# 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)
実際には、コンピューターの名前を変更した後、またはドメインに参加するときに再起動する必要があるいくつかの理由があります(これは基本的に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"'
問題があれば教えてください。
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
私は今日同じことを探していて、最終的にそれを行う方法を得ました。コンピューターをドメインに参加させた後にコンピューター名を変更するかどうかを尋ねる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回の再起動で両方のタスクを実行でき、次の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)
管理者の資格情報を含むワンステップで:
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など)
ドメインに参加し、コンピューターの名前を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
誰も答えないように、私は何かを試してみてください:
Attent 1が機能しない理由は理解できたと思います。これは、コンピューターをドメインに参加させると、何らかの方法でコンピューターの名前が変更されるためです(ドメイン名の部分、コンピューターの名前を入力します)。
だからあなたは完全なWMIの方法でそれをやろうとしていますか、あなたはWin32_ComputerSystem
JoinDomainOrWorkgroup
というクラス。同じレベルでそれを行うと、おそらくそれを機能させる機会が増えます。
最初にDC=でマシンアカウントを作成した場合、名前を変更し、1回の再起動でドメインに参加できます。
システムプロパティの「コンピューター名/ドメインの変更」ウィンドウを使用する別の方法を次に示します。
つまり、システムのプロパティ| [コンピューター名]タブを表示し、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}”)
また、ローカルアカウントを追加+プロンプトでコンピューターの名前を変更+ 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
Rename-ComputerはCTP3から削除されました。コンピューターの名前を変更するときに多くのことが行われ、MSはそのプロセスを再作成したくないか、必要なビットをすべて含めることができなかったためです。 Jefferey Snoverが代わりにnetdom.exeを使用するように言ったのは、コマンドラインでコンピューターの名前を変更するためのベストプラクティスだからだと思います。あなたが探していた答えではありませんが、正しい方向に向けるべきです
$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
私のために働く^^
これにより、コンピューター名の入力が求められ、ドメインに参加して再起動します。
$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
自動化された能力で機能する次のものを提供したいと思います。手順の順序と、最初に名前を設定してからドメインに参加するまでの関係を示しています。これをスクリプトで、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つの注意点は、資格情報に注意し、ここに示すようにハードコードするのではなくキーストアから取得することですが、それは別のトピックです。
回答ありがとうございます。