PowerShell使用S.DS.P写入LDAP对象报对象类违规错误
报错原因
对象类违规是LDAP服务端对新增请求做schema校验时,发现提交的内容不符合对象类定义触发的,你的代码存在两个直接触发错误的问题:
objectClass属性格式错误:你传入的是带大括号的逗号分隔字符串"{dominoServerMailInDatabase, top}",S.DS.P模块不会将其解析为多值属性,会把整串当成单个objectClass值提交,Domino LDAP服务无法识别该值,直接触发校验失败。- 提交了对象类不允许的属性:你定义并赋值了
cn属性,还将cn作为DN的RDN前缀,但你提供的dominoServerMailInDatabaseschema定义中,必选、可选属性列表均不包含cn属性,属于对象类禁止持有的非法属性。
另外你代码中部分属性名和schema定义的命名不匹配,比如maildomain对应schema中的MailDomain、encryptincomingmail对应EncryptIncomingMail,Domino LDAP对属性名校验严格,大小写/拼写不匹配也可能触发后续报错。
修复方案
- 修正
objectClass赋值:传入字符串数组而非带大括号的字符串,正确写法为$Object.objectClass = @("top", "dominoServerMailInDatabase") - 移除非法的
cn属性,将DN的RDN替换为对象类允许持有的属性,比如使用mail属性作为RDN - 所有属性名严格对齐schema中的命名,避免拼写、大小写不匹配的问题
修复后的可运行参考代码:
$Object = [PSCustomObject]@{ distinguishedName = $null objectClass = $null mail = $null MailDomain = $null MailServer = $null MailFile = $null description = $null MessageStorage = $null EncryptIncomingMail = $null AvailableForDirSync = $null displayName = $null } # 使用schema允许的mail属性作为RDN $Object.distinguishedName = "mail=testmailinfromscript@test.com,ou=GB,o=ORG" # objectClass传标准字符串数组 $Object.objectClass = @("top", "dominoServerMailInDatabase") $Object.mail = "testmailinfromscript@test.com" $Object.MailDomain = "some-domain" $Object.MailServer = "CN=SERVER,OU=GB,O=ORG" $Object.MailFile = "shadow account" $Object.description = "shadow account" $Object.MessageStorage = "1" $Object.EncryptIncomingMail = "0" $Object.AvailableForDirSync = "1" $Object.displayName = "testmailinfromscript/GB/ORG" Add-LdapObject -LdapConnection $ldap -Object $Object -Verbose
如果修复后仍报错,可以抓包看LDAP请求的实际提交内容,确认没有多余的非法属性被模块自动附加。
内容的提问来源于stack exchange,提问作者Matt__68
相关产品推荐
相关产品推荐

