我找到了一篇关于“重命名来宾操作系统以匹配 Hyper-V 上的虚拟机名称”的文章,以重命名计算机名称以匹配虚拟机的名称。问题是这个脚本必须附加在虚拟机上,如果我想更改它会很困难。 是否可以从主机重命名虚拟机计算机的名称?
Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_ComputerSystem | Where-Object {$_.ElementName -ne $env:COMPUTERNAME} | ForEach-Object {
$newName = $_.ElementName
$_.GetRelated('Msvm_KvpExchangeComponent').GuestIntrinsicExchangeItems | ForEach-Object {
if($_ -as [xml])
{
$GuestExchangeItemXml = ([XML]$_).SelectSingleNode("/INSTANCE/PROPERTY[@NAME='Name']/VALUE[child::text()='FullyQualifiedDomainName']")
if ($GuestExchangeItemXml -ne $null)
{
$vmName = $GuestExchangeItemXml.SelectSingleNode("/INSTANCE/PROPERTY[@NAME='Data']/VALUE/child::text()").Value -replace '\W','_'
$vmName = $vmName.Substring(0,[System.Math]::Min(15,$vmName.Length))
#(Get-WmiObject Win32_Computersystem -ComputerName $vmName).Rename($newName); shutdown -r -t 0
#Rename-Computer -ComputerName $vmName -NewName $newName -Restart -Force -WhatIf
Write-Host "Renaming $vmName to $newName"
}
}
}
}
$oldname = 'foo'
$newname = 'bar'
(Get-WMIObject Win32_ComputerSystem -Computer $oldname).Rename($newname)
Restart-Computer $oldname
(gwmi win32_computersystem).Rename("NewName");关闭-r -t 0
Invoke-Command -VMName“此处为虚拟机名称”-ScriptBlock { 重命名-计算机-NewName“此处为新名称” }
如:
带有 Invoke-Command 的 PowerShell Direct 非常适合您需要在虚拟机上运行一个命令或一个脚本但不需要在该点之后继续与虚拟机交互的情况。
首先,在主机上,使用目标虚拟机上管理员用户的凭据创建凭据对象,或者提示输入详细信息
$credential = Get-Credential
或手动填充对象:
$username = "Administrator" # administrator user on target VM
$password = "Secr3tPa$$w0rd" # of administrator user on target VM
$passwordSecureString = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object { $passwordSecureString.AppendChar($_) }
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $passwordSecureString
最后,在主机上,运行命令重命名虚拟机:
$vmName = 'vm-mywin'
$vmNewComputerName = 'worker1'
Invoke-Command -VMName $vmName -Credential $credential -ScriptBlock { `
Rename-Computer -NewName $vmNewComputerName; `
Restart-Computer -Force;
}