如何在活动目录中添加新 Schema (最好用LDAP方式), 急!!!

ZBM319 2003-02-06 11:25:29
在活动目录中添新 Schema 失败!
返回代码: 0x41
错误常量:LDAP_OBJECT_CLASS_VIOLATION
Windows 2k 系统描述:对象类别侵犯。
LDAP参考描述:操作违背了类定义中定义的语义规则

代码片断如下:

//添加一个新模式类
int new_schmC_2()
{
char szSchemaDN[1024];
char **ppszDomain;

ULONG uErr;
LDAP *psLdap;
LDAPMessage *psMsg = NULL;

//objectClass 属性
char *apszObjectClassVals[] = { "classSchema", NULL };
LDAPMod sAddObjectClass = { LDAP_MOD_ADD, "objectClass", apszObjectClassVals };

//cn 属性
char *apszCNVals[] = { "baz", NULL };
LDAPMod sAddCN = {LDAP_MOD_ADD, "cn", apszCNVals};

//OID 属性
char *apszOIDVals[] = { "1.2.840.113556.1.5.9939.221", NULL };
LDAPMod sAddOID = {LDAP_MOD_ADD, "governsID", apszOIDVals};

//possSuperiors 属性
char *apszPossSVals[] = { "container", NULL };
LDAPMod sAddPossSuperior = {LDAP_MOD_ADD, "possSuperiors", apszPossSVals};

//objectClassCategory 属性
char *apszObjClassCategoryVals[] = { "1", NULL };
int iOCC = 1;
LDAPMod sAddObjCC = {LDAP_MOD_ADD, "objectClassCategory", apszObjClassCategoryVals};

//defaultObjectCategory 属性
char *apszDefObjCategoryVals[] = { NULL, NULL };
apszDefObjCategoryVals[0] = "CN=Schema,CN=Configuration,DC=keycom,DC=com";
LDAPMod sAddDefObjC = {LDAP_MOD_ADD, "defaultObjectCategory", apszDefObjCategoryVals};


//lDAPDisplayName 属性
char *apszLDAPDisplayNameVals[] = { "baz", NULL };
LDAPMod sAddLDAPDisplayName = {LDAP_MOD_ADD, "lDAPDisplayName", apszLDAPDisplayNameVals};

//SubClassOf 属性
char *apszSubClassOfVals[] = { "top", NULL };
LDAPMod sAddSubClassOf = {LDAP_MOD_ADD, "subClassOf", apszSubClassOfVals};

//mayContain 属性
char *apszMayContainVals[] = { "user", NULL };
LDAPMod sAddMayContain = {LDAP_MOD_ADD, "mayContain", apszMayContainVals};

//description 属性
char *apszDscptVals[] = { "用户测试模式", NULL };
LDAPMod sAddDscrpt = { LDAP_MOD_ADD, "description", apszDscptVals };

//添加属性列表
LDAPMod *asAttrsToAdd[] = {
&sAddObjectClass,
&sAddCN,
&sAddOID,
&sAddDefObjC,
//&sAddObjCC,
&sAddLDAPDisplayName,
&sAddPossSuperior,
&sAddSubClassOf,
//&sAddMayContain,
&sAddDscrpt,
NULL };

//初始化
psLdap = ldap_init(NULL, LDAP_PORT);
if(psLdap == NULL)
{
printf("\nldap init failed !\n");
return -1;
}

//连接绑定
uErr = ldap_bind_s(psLdap, NULL, NULL, LDAP_AUTH_NEGOTIATE);
if(uErr != LDAP_SUCCESS)
{
printf("ldap bind failed !\n");
ldap_unbind_s(psLdap);
return uErr;
}


//获取根的 DSE 属性集
uErr = ldap_search_s(
psLdap,
NULL,
LDAP_SCOPE_BASE,
"objectClass=*",
NULL,
false,
&psMsg );
if(uErr != LDAP_SUCCESS)
{
ldap_unbind_s(psLdap);
return uErr;
}

//获取模式命名上下文属性
ppszDomain = ldap_get_values(psLdap,
ldap_first_entry(psLdap, psMsg),
"schemaNamingContext" );
memset(szSchemaDN, 0x00, sizeof(szSchemaDN));
if(ppszDomain != NULL)
{
strcat( szSchemaDN, ppszDomain[0] );
}
else
{
return -100;
}
ldap_value_free(ppszDomain);
//printf("Schema DN : %s\n", szSchemaDN);
ldap_msgfree(psMsg);

//同步加入新对象
uErr = ldap_add_s(psLdap, szSchemaDN, asAttrsToAdd);

ldap_unbind_s(psLdap);

return uErr;
}
////////////////////////////////////////////////////////////////////////
...全文
326 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
boywan 2003-03-13
  • 打赏
  • 举报
回复
会不会是不让扩展schema,下面的说明不知是否对你有用:
为了让系统允许你通过Schema Manager console或ADSI修改Active Directory Schema,你必须通过两层保护。第一,想要修改Active Directory Schema 的用户必须是存在于森林根域的Schema Admins group组中的一员;第二,你必须修改DC的注册表。
  修改Active Directory Schema最快捷,最方便的方法就是使用Schema Manager console。
另外在DC上,运行REGEDT32.EXE或REGEDIT.EXE直接修改注册表也行,但是可能会担一些风险。在注册表中找到以下行:
  HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\Services\NTDSParameters
  增加一个REG_DWORD值叫做Schema-Update-Allowed,并且把值设为1。这就是你所要做的一切。现在你就可以在DC上编辑Schema了。还有一个方法就是把以下几行写到一个文本文件中,并把它存为.reg文件,然后在需要修改Schema的DC上执行它,这样就会自动改变注册表,而不用手工改变它了。代码如下:
  REGEDIT4
  [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesNTDSParameters]
  "Schema Update Allowed"=dword:00000001
  一旦你改变了DC上的注册表值,并且把想要修改Schema的用户加入到Schema Admins group组中,任何对那台DC的Schema所作的改变都会被接收。
youngby 2003-02-06
  • 打赏
  • 举报
回复
顶一下!!

6,849

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧