我继承了这个愚蠢的命名惯例:
公司名称-城市20090724或者公司名称-城市-约翰
它没有告诉我有关位置(楼层、部门)的任何信息。约翰几个月前离开了公司。计算机从一个城市搬到了另一个城市,但名称没有改变。
当您想要创建新的命名约定时,如何重命名 100 多台计算机?
答案1
当然可以。在这种情况下,NETDOM 实用程序就是您的“朋友”。您可以使用启动脚本来重命名计算机。
一些关于 NETDOM 的文档在这里:
我看到了一个非常简单的脚本,像这样:
@echo off
IF "%COMPUTERNAME%"=="COMPANYNAME-CITY-JOHN" SET NEWNAME=NEWNAME-HERE
IF "%COMPUTERNAME%"=="COMPANYNAME-CITY-BOB" SET NEWNAME=NEWNAME-HERE2
... more machines ...
IF NOT "%NEWNAME%"=="" NETDOM renamecomputer member /newname:%NEWNAME% /userd:USER-TO-PERFORM-RENAME-UNDER /password:PASSWORD-FOR-THAT-USER
一旦所有计算机都重命名,您就可以删除启动脚本。在已重命名的计算机上运行该脚本应该不会太“昂贵”。如果您担心这一点,可以使用“陷阱门”技术,即脚本结束时计算机会将自己置于被拒绝执行脚本的组中。
- 在 AD 中创建一个组——说“计算机重命名完成”。
- 修改组的权限以包括“域计算机 - 写入/添加自己为成员”
- 在上面的简单的批处理文件脚本末尾添加以下行:
IF NOT "%NEWNAME%"=="" NET GROUP "用户创建脚本完成" /DOMAIN /ADD %COMPUTERNAME%$
您将看到该组在每台机器上运行后,其成员计算机数量“增长”。要阻止脚本在已运行的计算机上运行,请向 GPO 添加权限,以分配启动脚本“计算机重命名完成 - 拒绝应用组策略”。然后,该脚本将在每台机器上运行一次。
您的目的地名称将会是什么样的?如果您和我一样喜欢戴尔服务标签号,您可以这样做(在 VBScript 中):
Option Explicit
Dim objWMIService, strNewName, objShell, objNetwork
Set objShell = CreateObject("WScript.Shell")
Set objNetwork = CreateObject("WScript.Network")
' Obtain the service tag
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
For Each objSMBIOS in objWMIService.ExecQuery("SELECT * FROM Win32_SystemEnclosure")
strNewName = objSMBIOS.SerialNumber
Next
' Check for empty string
If (strNewName = "") Then WScript.Quit
' Does the computer need to be renamed?
If (UCase(strNewName) <> UCase(objNetwork.ComputerName)) Then
objShell.Run "NETDOM renamecomputer member /newname:" & strNewName & " /userd:USER-TO-PERFORM-RENAME-UNDER /password:PASSWORD-FOR-THAT-USER"
End If
那脚本可以一直运行,并不断重命名未根据服务标签命名的计算机...呵呵。(我不确定我是否会真正这样做,如果我这样做,我会在脚本中加入更多健全性检查。)
答案2
您可以通过 PowerShell 执行此操作。在 Excel 中,创建一个包含两列的文件,一列用于存储旧名称,一列用于存储新名称。添加标题行 oldname 和 newname。将其保存为 CSV(mylist.csv),然后在 powershell 中运行此命令:
function renameAndReboot([string]$computer, [string]$newname)
{
$comp = gwmi win32_computersystem -computer $computer
$os = gwmi win32_operatingsystem -computer $computer
$comp.Rename($newname)
$os.Reboot()
}
Import-Csv mylist.csv
foreach ($entry in $list)
{
renameAndReboot($entry.oldname,$entry.newname)
}
...核心代码来自这里。
答案3
计算机从一个城市移到另一个城市,但名称并没有改变。
这是试图描述位置、所有者、功能等的命名方案的弱点。事情会改变的。因此,您最终要么经常重命名计算机(并且每次都重新启动!),要么拥有一个随着时间的推移而变得破旧的命名方案。
更多内容在我的博客上。
答案4
如果您不熟悉 Netdom 命令行工具,请尝试使用Netdom 重命名计算机 GUI从聚居化。
它将帮助您通过上传 .csv 文件重命名域中的多台计算机,而无需记住或学习任何命令行代码或创建任何脚本。
这个 GUI 为我节省了很多时间。