如何正确重命名域内计算机?C#调用NetRenameMachineInDomain报错1210
错误原因
错误码1210(ERROR_INVALID_COMPUTERNAME)触发的核心原因有三个:
- 你提前调用
SetComputerNameW修改了本地计算机名,但该修改需要重启系统才会全量生效,未重启时域交互组件识别到的本地名仍是旧值,和你传入的新名称校验不匹配。 NetRenameMachineInDomain接口的最后一个参数不支持NETSETUP_ACCT_CREATE标志,该标志是NetJoinDomain专属参数,传入不支持的标志会触发参数校验失败,误报计算机名无效。- 新计算机名不符合AD域规则:长度超过15字符、包含AD禁用的特殊字符、或是域内已存在同名计算机对象也会返回该错误。
修复方案
- 调整执行逻辑:删除提前调用
SetComputerNameW的代码,NetRenameMachineInDomain会自动同步修改本地计算机名和域内计算机对象,修改完成后统一重启一次即可生效,无需分两次操作。 - 修正接口参数:移除
NetRenameMachineInDomain最后一个参数的NETSETUP_ACCT_CREATE标志,普通重命名场景该参数传0即可,如果需要强制覆盖旧的域账户信息,可以传入值为0x00000400的NETSETUP_DOMAIN_RENAME_IF_JOINED标志。 - 增加前置校验:调用接口前先校验新计算机名长度不超过15字符,不含
!@#$%^&*()[]{}|;:,.?等特殊字符,提前规避格式问题。
修正后的代码示例
... if (!(String.IsNullOrWhiteSpace(adlogin) || String.IsNullOrWhiteSpace(adpass))) { if (NetInDomain) { // 移除NETSETUP_ACCT_CREATE标志,不需要提前调用SetComputerNameW return NetRenameMachineInDomain(null, newName, adlogin, adpass, 0); } else { return NetJoinDomain(null, "myorg.local", null, "myorg\\" + adlogin, adpass, NetJoinDomainOptions.NETSETUP_JOIN_DOMAIN | NetJoinDomainOptions.NETSETUP_ACCT_CREATE | NetJoinDomainOptions.NETSETUP_DOMAIN_JOIN_IF_JOINED | NetJoinDomainOptions.NETSETUP_JOIN_WITH_NEW_NAME); } } // 未传域账号的场景再单独调用SetComputerNameW修改本地名 if (!SetComputerNameW(newName)) return GetLastError(); ...
内容的提问来源于stack exchange,提问作者Seriy_A
相关产品推荐
相关产品推荐

