openldap怎么向windowsAD2012中添加带有userAccountControl和userPassword的用户(C++)

木无言 2021-11-24 18:03:45

linux系统是CentOS  7.5.1804

openldap是2.44

windowsAD 是2012R2

 

目前使用ldap命令可以添加密码全为小写字母的密码和userAccountControl:66048可以添加进去,AD中用户也正常

但是使用代码添加就会报Server is unwilling to perform错误。

struct keyVal{

string key;

string val;

};

string account = "test";
        string dname = "CN=" + account + ",CN=Users,DC=example,DC=com";
        string pname = account + "@clouddesk.com";
 

vector<keyVal>      keyValueList;

       obj.key =       "objectClass";
        obj.value =     "user";
        keyValueList.push_back(obj);

        obj.key =       "cn";
        obj.value =     account;
        keyValueList.push_back(obj);

        obj.key =       "distinguishedName";
        obj.value =     dname;
        keyValueList.push_back(obj);

        obj.key =       "displayName";
        obj.value =     account;
        keyValueList.push_back(obj);

        obj.key =       "name";
        obj.value =     account;
        keyValueList.push_back(obj);

        obj.key =       "userPrincipalName";
        obj.value =     pname;
        keyValueList.push_back(obj);

        obj.key =       "objectCategory";
        obj.value =     "CN=Person,CN=Schema,CN=Configuration,DC=clouddesk,DC=com";
        keyValueList.push_back(obj);

       bj.key =       "unicodePwd";
        obj.value =     "IgBwAGEAcwBzAHcAbwByAGQAIgA=";
        keyValueList.push_back(obj);

        obj.key =       "userAccountControl";
        obj.value =     "66048";
        keyValueList.push_back(obj);

        obj.key =       "sAMAccountName";
        obj.value =     account;
        keyValueList.push_back(obj);

        //申请空间
        LDAPMod **modifications;
        modifications = (LDAPMod **)malloc( sizeof(LDAPMod *)*keyValueList.size() + 1 );
        for(int i = 0; i < keyValueList.size(); i++ ) {
                modifications[i] = (LDAPMod *)malloc( sizeof(LDAPMod) );
                modifications[i]->mod_op = LDAP_MOD_ADD;
        }
        for(int i = 0; i < keyValueList.size(); i++ ) {
                modifications[i]->mod_type = (char *)keyValueList[i].key.c_str();
                modifications[i]->mod_values = (char **)malloc( sizeof(char *)*2 );
                modifications[i]->mod_values[0] = (char *)keyValueList[i].value.c_str();
                modifications[i]->mod_values[1] = NULL;
                cout << "key=" << modifications[i]->mod_type << ", value=" << modifications[i]->mod_values[0] << endl;
        }

        modifications[keyValueList.size()] = NULL;

        //int rc;
        rc = ldap_add_s(ld, dname.c_str() ,modifications);
        if(rc != LDAP_SUCCESS){
                std::cout << "add error, rc = " << rc << ", msg=" << ldap_err2string(rc) <<  std::endl;
                return rc;
        }
 

代码如上

请各位大佬帮帮忙。感谢!

...全文
217 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-编程语言 发布问题, 以便更快地解决您的疑问

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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