本文有助于解决无法编辑或删除 Active Directory (AD) 对象并收到错误“属性由安全帐户管理器(SAM)拥有”或“指定的帐户不存在”。
你有用户、托管服务帐户(MSA)、组托管服务帐户(gMSA)、计算机或正在使用的组对象。 尝试从 AD 中删除安全主体时,会收到以下轻型目录访问协议 (LDAP) 错误:
操作失败。 错误代码:0x525 指定的帐户不存在。 00000525: NameErr: DSID-031A120B, 问题 2001 (NO_OBJECT), 数据 0, 最佳匹配
使用以下 cmdlet 检索计算机对象的属性时:
get-adcomputer -identity oldcomputer -properties *
你会收到以下输出:
CanonicalName : contoso.com/Workstations/Disabled/oldcomputer
CN : oldcomputer
Created : <DateTime>
createTimeStamp : <DateTime>
Deleted :
Description :
DisplayName :
DistinguishedName : CN=oldcomputer,OU=Disabled,OU=Workstations,DC=contoso,DC=com
dNSHostName : oldcomputer.contoso.com
dSCorePropagationData : {<DateTime>, <DateTime>, <DateTime>, <DateTime>...}
instanceType : 4
isDeleted :
LastKnownParent :
Modified : <DateTime>
modifyTimeStamp : <DateTime>
Name : oldcomputer
nTSecurityDescriptor : System.DirectoryServices.ActiveDirectorySecurity
objectCategory :
ObjectClass : computer
在输出中,你会注意到属性摘录和一些关键详细信息:
- 不会删除该对象。
- 该
objectCategory属性显示为空。 - 未列出该
sAMAccountType属性。
尝试编辑对象时,大多数更改都会出现此错误:
不允许0x209a访问该属性,因为该属性由安全帐户管理器(SAM)拥有。
使用以下命令检查从前面的输出(属性列表摘录)获取的可分辨名称(DN)的元数据时,将收到意外的结果:
repadmin -showobjmeta DC01 "CN=oldcomputer,OU=Disabled,OU=Workstations,DC=contoso,DC=com"
312781 DC12\0ADEL:AF9F2C0D-6B9F-4e32-A94D-A3E235A31BF7 98364396 YYYY-09-16 13:01:55 2 isDeleted
...
312781 83ddc6a9-65e8-4ace-8c84-8d1dd2778e47 104437043 YYYY-09-16 13:01:43 2 sAMAccountType
...
312781 83ddc6a9-65e8-4ace-8c84-8d1dd2778e47 104437043 YYYY-09-16 13:01:43 2 objectCategory
...
312781 DC12\0ADEL:AF9F2C0D-6B9F-4e32-A94D-A3E235A31BF7 98364396 YYYY-09-16 13:01:55 2 isRecycled
下面是元数据的解释:
sAMAccountType和objectCategory属性- 它们通常设置一次。
- 版本是
2,目前未设置这些参数。 因此,它们在对象删除时被移除了,在取消删除时没有被重新填充。
- 属性
isDeleted- 版本还显示
2。 这意味着对象已被删除,之后由于清除属性而被取消删除。 - 如果使用权威还原恢复对象,则所有属性的版本号将更高(默认版本增加为 100000)。
- 版本还显示
- 属性
isRecycled- 它显示,至少在取消删除时,未启用 Active Directory (AD) 回收站。
- 使用 AD 回收站时,该属性只会在回收的对象上设置。
- 预期行为
- 如果取消删除按预期工作,那么
sAMAccountType和objectCategory的版本将是一个奇数值(例如,3)。 - 这些属性的时间戳将匹配或略高于
IsDeleted的时间戳。
- 如果取消删除按预期工作,那么
在取消删除过程中,sAMAccountType 和 objectCategory 属性不会添加到对象
对象已被删除并恢复。 已删除的对象没有 sAMAccountType 属性 objectCategory 。 在正常情况下取消删除后,它们将添加到对象中。 在问题情况下,进程会失败,使对象保持活动状态,且没有这些关键属性。 对象的此状态是无法重现的已知问题,并且尚未确定此零星问题的根本原因。
将 fixupObjectState 属性与 LDIFDE 配合使用来修复对象
注释
此方法包括对象在没有这些属性的情况下保持活动状态且无法修复或删除的方案。
如果最近进行了取消删除,您可以通过权威性还原使用备份文件来还原对象。 这还会还原这些属性。
若要解决此问题,请使用 Windows Server 2022 和 Windows Server 2025 中包含的新设施修复 [MS-ADTS]: fixupObjectState 中指定的损坏对象。
注释
还有修复 LastLogonTimeStamp 特性的功能。 有关详细信息,请参阅 用户或计算机帐户将 lastLogonTimestamp 值设置为将来的时间。
步骤 1:标识对象名称和全局唯一标识符(GUID)
例如:
- DN:
cn=brokenuser,ou=bad-users,dc=contoso,dc=com - GUID:
cf2b4aca-0e67-47d9-98aa-30a5fe30dc36
步骤 2:使用基于 DN 字符串或 GUID 的语法准备 LDIFDE 导入文件
-
使用 DN 字符串:
DN: Changetype:modify add: fixupObjectState fixupObjectState: cn=brokenuser,ou=bad-users,dc=contoso,dc=com: SamAccountType,Objectcategory -注释
对于格式完好的 LDIFDE 导入文件,需要包含仅有连字符(
-)的行和空行。 此示例请求修复这两个 SAM 相关的属性。 -
使用基于 GUID 的语法:
如果对象名称包含特殊字符,请对 LDIFDE 导入文件使用 Unicode,或使用基于 GUID 的语法。
对象名称可以在基于 GUID 的语法中表示为
<guid=cf2b4aca-0e67-47d9-98aa-30a5fe30dc36>。所以,
fixupObjectState: cn=brokenuser,ou=bad-users,dc=contoso,dc=com:Objectcategory, SamAccountType表达式变成fixupObjectState: <guid=cf2b4aca-0e67-47d9-98aa-30a5fe30dc36>:Objectcategory, SamAccountType。要将此语法与 LDIFDE 导入文件一起使用,需要对第一个冒号后的文本进行 Base64 编码,这主要是因为它包含大于(>)和小于(<)符号。
fixupObjectState:: PGd1aWQ9Y2YyYjRhY2EtMGU2Ny00N2Q5LTk4YWEtMzBhNWZlMzBkYzM2PjpPYmplY3RjYXRlZ29yeSxTYW1BY2NvdW50VHlwZQ==注释
双冒号告知 LDIFDE 属性值采用 Base64 格式。 可以使用 Base64 编码器 直接在 Web 上对字符串进行编码。
使用 Base64 格式后,导入文件会单独更新属性:
-
对于
sAMAccountType属性:DN: Changetype:modify add: fixupObjectState fixupObjectState:: PGd1aWQ9Y2YyYjRhY2EtMGU2Ny00N2Q5LTk4YWEtMzBhNWZlMzBkYzM2PjpTYW1BY2NvdW50VHlwZQ== - -
关于
objectCategory属性:DN: Changetype:modify add: fixupObjectState fixupObjectState:: PGd1aWQ9Y2YyYjRhY2EtMGU2Ny00N2Q5LTk4YWEtMzBhNWZlMzBkYzM2PjpPYmplY3RjYXRlZ29yeQ== -
-
步骤 3:使用 LDIFDE 修复对象
以企业管理员身份登录,并通过指定导入文件名(例如 ** ,repair-user.txt**):使用以下命令导入 LDIFDE 导入文件:
ldifde /i /f repair-user.txt
Connecting to "<DC>"
Logging in as current user using SSPI
Importing directory from file " repair-user.txt"
Loading entries...
2 entries modified successfully.
然后,重新填充对象的 objectCategory 和 sAMAccountType 属性。
步骤 4:再次删除对象
再次删除对象,因为算法并不总是确保 sAMAccountType 属性正确。 SAM 允许删除处于新状态的对象,但对对象执行的其他作可能会失败。 此外,对象可能缺少其他关键属性,使它正常工作。