基于openldap查询AD用户的组信息,上代码

2023-05-16

当用户找不到时,这里的ldap_result会卡住,设置tm.sec 为1也不行。需要继续定位。同样系统上官方的ldapsearch程序没有这个问题。

// gcc ldap_search.c -L /usr/local/lib/ -lldap -llber -I /usr/local/include   -DLDAP_DEPRECATED=1
// ldapsearch  -h 10.211.55.11 -p 389 -D "administrator@test.com" -w "Admin@123456" -b "dc=test,dc=com" "cn=u2"

#include <stdio.h>
#include <stdint.h>
#include <ldap.h>
#include <sys/time.h>

#define LDAP_SERVER_NUM 10
#define LDAP_SERVER_NAME_LEN 64
#define LDAP_USER_DN_LEN 256
#define LDAP_USER_PSWD_LEN 64

#define LDAP_SEARCH_DN_NUM 10
#define LDAP_SEARCH_DN_LEN 256
#define LDAP_SEARCH_FILTER_LEN 64

typedef struct ldap_server_t {
    char server[LDAP_SERVER_NAME_LEN];
    uint16_t port;
    char user_dn[LDAP_USER_DN_LEN];
    char user_pswd[LDAP_USER_PSWD_LEN];
} ldap_server_t;

typedef struct ldap_search_dn_t {
    char dn[LDAP_SEARCH_DN_LEN];
    int server_index;
} ldap_search_dn_t;

int ldap_server_num = 0;
ldap_server_t g_ldap_server[LDAP_SERVER_NUM] = {0};

int ldap_search_dn_num = 0;
ldap_search_dn_t g_ldap_search_dn[LDAP_SEARCH_DN_NUM] = {0};

int ldap_register_server(char *hostname, int16_t port, char *dn, char *pswd) {
    if (ldap_server_num >= LDAP_SERVER_NUM) {
        return -1;
    }

    for (int index = 0; index < LDAP_SERVER_NUM; index++) {
        if (strlen(g_ldap_server[ldap_server_num].server) > 0) {
            continue;
        }

        strcpy(g_ldap_server[index].server, hostname);
        g_ldap_server[index].port = port;
        strcpy(g_ldap_server[index].user_dn, dn);
        strcpy(g_ldap_server[index].user_pswd, pswd);
        ldap_server_num++;
        return 0;
    }

    return -1;
}

void ldap_unregister_server(char *servername) {
    for (int i = 0; i < LDAP_SERVER_NUM; i++) {
        if (strcmp(g_ldap_server[i].server, servername) != 0) {
            continue;
        }

        memset(g_ldap_server[i].server, 0, LDAP_USER_DN_LEN);
        memset(g_ldap_server[i].user_dn, 0, LDAP_USER_DN_LEN);
        memset(g_ldap_server[i].user_pswd, 0, LDAP_USER_PSWD_LEN);
        return;
    }
}

ldap_server_t * ldap_get_server(int index) {
    if (index >= LDAP_SERVER_NUM) {
        return NULL;
    }

    if (strlen(g_ldap_server[index].server) == 0) {
        return NULL;
    }

    return &g_ldap_server[index];
}

int ldap_register_search_dn(char *hostname, char *dn) {
    if (ldap_search_dn_num >= LDAP_SEARCH_DN_NUM) {
        return -1;
    }

    int index = 0;

    for (int i = 0; i < LDAP_SERVER_NUM; i++) {
        if (strcmp(g_ldap_server[i].server, hostname) != 0) {
            continue;
        }

        index = i;
    }

    for (int i = 0; i < LDAP_SEARCH_DN_NUM; i++) {
        if (strlen(g_ldap_search_dn[i].dn) > 0) {
            continue;
        }

        g_ldap_search_dn[i].server_index = i;
        strcpy(g_ldap_search_dn[i].dn, dn);
        ldap_search_dn_num++;
        return 0;
    }

    return -1;
}

void ldap_unregister_search_dn(char *servername, char *dn) {
    int index = 0;

    for (int i = 0; i < LDAP_SERVER_NUM; i++) {
        if (strcmp(g_ldap_server[i].server, servername) != 0) {
            continue;
        }

        index = i;
    }

    for (int i = 0; i < LDAP_SEARCH_DN_NUM; i++) {
        if (g_ldap_search_dn[i].server_index == index 
            && strcmp(g_ldap_search_dn[i].dn, dn) == 0) {
                memset(&g_ldap_search_dn[i], 0, sizeof(ldap_search_dn_t));
                return;
            }
    }
}

ldap_search_dn_t * ldap_get_search_dn(int index) {
    if (index >= LDAP_SEARCH_DN_NUM) {
        return NULL;
    }

    if (strlen(g_ldap_search_dn[index].dn) == 0) {
        return NULL;
    }

    return &g_ldap_search_dn[index];
}

LDAP *ldap_init_ld(ldap_server_t *server) {
    LDAP *ld = ldap_init(server->server, server->port);
    if (ld == NULL) {  
        perror("ldap_init error");
        return NULL;
    }

    int rc = ldap_simple_bind_s(ld, server->user_dn, server->user_pswd);
    if (rc != LDAP_SUCCESS) {
        printf("ldap_simple_bind_s: rc: %d, %s\n", rc, ldap_err2string(rc));
        return NULL;
    }

    return ld;
}

void ldap_parse_sec_group(char *sec_group, char *str) {
    char *c1 = strstr(str, "=");
    char *c2 = strstr(str, ",");

    if (c1 == NULL || c2 == NULL || c2 - c1 <= 0) {
        return;
    }

    strncpy(sec_group, c1 + 1, c2 - c1 - 1);
}

void ldap_parse_user_group(char *user_group, char *str) {
    char *c1 = strstr(str, ",");
    if (c1 == NULL) {
        return;
    }

    strcpy(user_group, c1 + 1);
}

int ldap_search_user_group(ldap_search_dn_t *search_dn, char *username, char *user_group, char sec_group[][128], int *sec_group_num) {
    ldap_server_t *server = ldap_get_server(search_dn->server_index);
    if (server == NULL) {
        return -1;
    }

    LDAP *ld = ldap_init_ld(server);
    if (ld == NULL) {
        return -1;
    }

    char filter[LDAP_SEARCH_FILTER_LEN] = {0};
    sprintf(filter, "cn=%s", username);

    int msg = 0;
    int rc = ldap_search_ext(ld, search_dn->dn, LDAP_SCOPE_SUBTREE, filter, NULL, 0, NULL, NULL, NULL, 0, &msg);
    printf("1:%d\n", rc);
    if (rc != LDAP_SUCCESS) {
        printf("2\n");
        printf("ldap_search_ext_s: rc: %d, %s\n", rc, ldap_err2string(rc));
        ldap_unbind_ext(ld, NULL, NULL);
        return -1;
    }
    printf("3:%d\n", msg);

    LDAPMessage *result = NULL;
    struct timeval tm2 = {0};
    tm2.tv_sec = -1;
    tm2.tv_usec = 0;
    int r = ldap_result(ld, msg, LDAP_MSG_ONE, &tm2, &result);
    if (r <= 0) {
        printf("4\n");
        ldap_unbind_ext(ld, NULL, NULL);
        return -1;
    }

    printf("5\n");

    for (LDAPMessage *e = ldap_first_message(ld, result); e != NULL; e = ldap_next_message(ld, result)) {
        BerElement *ber;
        for (char *a = ldap_first_attribute(ld, e, &ber); a != NULL; a = ldap_next_attribute(ld, e, ber)) {
            char **vals;
            if ((vals = ldap_get_values(ld, e, a)) == NULL ) {
                continue;
            }

            for (int i = 0; vals[i] != NULL; i++) {
                if (strcmp("memberOf", a) == 0) { // find sec_group
                    ldap_parse_sec_group(sec_group[*sec_group_num], vals[i]);
                    //printf("sec_group:%s\n", sec_group[*sec_group_num]);
                    (*sec_group_num)++;
                } else if (strcmp("distinguishedName", a) == 0) {
                    printf("dn:%s\n", vals[i]);
                    ldap_parse_user_group(user_group, vals[i]);
                } else {
                    //printf("other:%s\n", vals[i]);
                }
            }
        }
    }

    ldap_unbind_ext(ld, NULL, NULL);
    return 0;
}


int ldap_get_user_group(char *username, char *user_group, char sec_group[][128], int *sec_group_num) {
    for (int i = 0; i < LDAP_SEARCH_DN_NUM; i++) {
        ldap_search_dn_t *search_dn = ldap_get_search_dn(i);
        if (search_dn == NULL) {
            continue;
        }

        int ret = ldap_search_user_group(search_dn, username, user_group, sec_group, sec_group_num);
        if (ret == -1) {
            continue;
        }
    }

    return 0;
}

void test_search_user(char *username) {
    char user_group[128] = {0};
    char sec_group[40][128] = {0};
    int sec_group_num = 0;

    printf("search user:%s\n", username);

    int ret = ldap_get_user_group(username, user_group, sec_group, &sec_group_num);
    if (ret != 0) {
        printf("search user:%s failed.\n", username);
        return;
    }

    for (int i = 0; i < sec_group_num; i++) {
        printf("sec_group:%s\n", sec_group[i]);
    }
    printf("user_group:%s\n\n", user_group);
}

int main()
{
    #define HOSTNAME "10.211.55.11"
    #define PORT_NUMBER 389
    #define FIND_DN "dc=test,dc=com"

#if 1
    int i_version = 3;
    //struct timeval tm = {0};
    //tm.tv_sec = 1;
    ldap_set_option(NULL, LDAP_OPT_PROTOCOL_VERSION, &i_version);
    ldap_set_option(NULL, LDAP_OPT_REFERRALS, LDAP_OPT_ON);
    //ldap_set_option(NULL, LDAP_OPT_TIMELIMIT, &tm);
#endif

    int ret;
    ret = ldap_register_server(HOSTNAME, PORT_NUMBER, "cn=administrator,cn=Users,dc=test,dc=com", "Admin@123456");
    if (ret != 0) {
        printf("ldap_register_server error\n");
        return -1;
    }

    ret = ldap_register_search_dn(HOSTNAME, "dc=test,dc=com");
    if (ret != 0) {
        printf("ldap_register_search_dn error\n");
        return -1;
    }

    //ret = ldap_register_search_dn(HOSTNAME, "dc=test2,dc=com");
    //if (ret != 0) {
    //    printf("ldap_register_search_dn error\n");
    //    return -1;
    //}

    test_search_user("u1");
    test_search_user("u12");
    test_search_user("u2");
    test_search_user("uz1");
    test_search_user("uz2");


    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于openldap查询AD用户的组信息,上代码 的相关文章

  • 网络基础3——TCP协议及三次握手四次挥手

    本文讲的是传输层的TCP协议 xff0c 在传输层还有UDP协议 xff0c 其传输过程及报头格式都较简单 xff0c 所以不做过多总结 什么是TCP协议 xff1f 简单来说 xff0c TCP协议就是面向连接的 可靠的 基于字节流的传输
  • Debian lxde 自动登录设置

    个人电脑一直使用debian xff0c 但是每次开机都要输入用户名和密码 xff0c 显得有些繁琐 另外 xff0c 电脑只有我一个人用 xff0c 也不用靠密码来保护什么个人隐私 所以干脆就设置上自动登录 方法 xff1a 修改 etc
  • Java使用Collections查找List中最大值、最小值

    在开发当中 xff0c 有时候我们需要查找List中的最大值 xff0c 最小值 虽然可以自己写代码遍历 xff0c 但是有轮子可用的情况下 xff0c 直接用轮子方便的多 在Java中使用Collections查找List中最大值 最小值
  • linux下启动nginx报错libpcre.so.0 => not found

    在启动nginx时会报错 xff1a xff0c 显示未加载到包组件libpcre so 0 xff0c 但在一开始的安装nginx环境时 xff0c 已经通过命令 yum install y pcre pcre devel 进行安装 xf
  • 微软新Bing全面开放BingChat,无需排队,直接用

    我是卢松松 xff0c 点点上面的头像 xff0c 欢迎关注我哦 xff01 好消息 xff0c 所有人都能上手微软Bing了 微软表示 xff0c 为了感谢大量用户的使用与反馈 xff0c 从今天起新 Bing 不再有候补名单 xff0c
  • redis集群部署及踩过的坑

    本文目标 要在单台机器上搭建Redis集群 xff0c 方式是通过不同的TCP端口启动多个实例 xff0c 然后组成集群 xff0c 同时记录在搭建过程中踩过的坑 安装准备 centos版本 xff1a 6 7 redis版本 xff1a
  • sudo apt install提示缺少安装包时可以进行以下命令

    sudo apt fix broken install xff08 提示有未能满足的依赖关系执行下面命令 xff09
  • 单点登录——CAS服务端连接mysql自定义密码加密

    目录 1 自定义密码加密分析 xff1a 2 单纯密码加密 xff1a xff08 1 xff09 引入依赖 xff1a xff08 2 xff09 配置cas的jdbc连接信息 xff1a xff08 3 xff09 去掉配置的用户名和密
  • 如何安装 JDK?怎么安装 Java?Windows 篇

    区分 Java JDK JRE Java 官方定义是 通用编程语言 xff0c 但我们有时候说的是指 Java 语言 xff0c 有时候是指 JDK xff0c 我不负责人的明确下 xff0c Java 特指 Java 编程语言 xff0c
  • 从一台linux上远程登录另外一台

    可以用ssh命令行方式登录 对方需要开启ssh服务 ssh l login name p port user 64 hostname 例如 xff0c 使用root用户登录 192 168 0 1 ssh l root 192 168 0
  • Windows下Mariadb中文乱码问题

    win10 在命令行使用Mariadb出现无法插入中文 并且之前正确插入的中文也无法正常显示了 ERROR 1366 22007 Incorrect string value xB1 xB1 xBE xA9 for column web u
  • Ubuntu 20.04LTS 文件夹图标丢失

    Ubuntu 20 04LTS 文件夹图标丢失 我寻思着我也没做啥 xff0c 文件夹图标就丢失了 xff0c 一直用命令行进行文件操作挺麻烦的 运行命令 xff1a sudo apt install gnome shell extensi
  • Git 当前项目设置 用户名、邮箱

    Git全局配置和单个仓库的用户名邮箱配置 学习git的时候 大家刚开始使用之前都配置了一个全局的用户名和邮箱 git config global user name github s Name git config global user
  • Android JetPack组件之DataBinding的使用详解

    博主前些天发现了一个巨牛的人工智能学习网站 xff0c 通俗易懂 xff0c 风趣幽默 xff0c 忍不住也分享一下给大家 xff0c x1f449 点击跳转到网站 前言 xff1a DataBinding的介绍 数据绑定库是一种支持库 x
  • 已知一指针p,你可以确定该指针是否指向一个有效的对象吗?如果可以,如何确定?如果不可以,请说明原因。

    这个问题我的思路是 xff1a 首先用 p将其值输出来 xff0c 如果编译器报错 xff0c 证明p指向一个无效的对象 xff0c 要么p 61 0要么p未进行初始化 xff0c 此时可以用if p 61 61 NULL 进行判断即可 x
  • opencv学习_10 (图像和轮廓的匹配(hu矩))

    图像和轮廓的匹配 hu矩 1 hu矩的概念 xff0c 我也总结了但是我不过多的阐述 xff0c 因为我也不是太理解 xff0c 只知道它具有平移 xff0c 旋转 xff0c 尺度不变性 xff0c 详细见别人的这篇 blog xff1a
  • opencv学习_11 (模板匹配(包括单模板和多模板))

    模板匹配 在一幅图像中匹配与模板相似的单个或者多个目标 1 目标匹配函数 xff1a cvMatchTemplate const CvArr image constCvArr templ CvArr result int method Im
  • opencv学习_11 (moravec角点检测及缺点)

    1 首先我们来看三幅图片理解什么是角点 xff1a 我们在图片以某像素点为中心 xff0c 取一窗口 xff0c 当窗口向各个方向移动时 xff0c 其内部灰度值变化不是很明显 xff0c 则该点即处在平坦区域 如左边图 xff1b 当其内
  • 2013学习总结

    时间飞逝 xff0c 很快又要过年了 xff0c 马上就要回家了 xff0c 2013年工作也接近尾声了 下面好好总结下2013 学习与工作 lt 1 gt 863农产品推荐系统 一个字形容 xff1a 水 可能国家项目都是这样的 不管怎样
  • 机器学习实战笔记2(k-近邻算法)

    1 xff1a 算法简单描述 给定训练数据样本和标签 xff0c 对于某测试的一个样本数据 xff0c 选择距离其最近的k个训练样本 xff0c 这k个训练样本中所属类别最多的类即为该测试样本的预测标签 简称kNN 通常k是不大于20的整数

随机推荐

  • 可导一定连续,连续不一定可导

    今天在群里面看到大家发了这句可导一定连续 xff0c 连续不一定可导 大家应该都很熟悉 xff0c 包括我自己 xff0c 但是真正理解有多少呢 xff0c 我当时就没想明白 xff0c 中午吃饭的时候也在想 xff0c 最后还是想明白了
  • 【GEEK】win10下cmd美化

    win10下cmd美化 xff0c 没任何技术含量但是很实用 如果你也讨厌cmd默认的简陋的界面 xff0c 想简单美化一下 xff0c 可以参考本文 1 设置背景色 字体颜色 标题栏 属性 颜色 xff0c 选择 屏幕文字 屏幕背景 xf
  • PCA降维简介

    PCA 全称为 principal component analysis xff0c 即主成成分分析 xff0c 用于降维 对数据进行降维有很多原因 比如 xff1a 1 xff1a 使得数据更易显示 xff0c 更易懂 2 xff1a 降
  • 相似图片搜索原理一(ahash—c++实现)

    ahash xff0c 全称叫做 average hash 应该是 phash perceptual hash 感知哈希 算法的一种 是基于图像内容搜索最简单的一种 search image by image xff0c 因此也有很多的局限
  • BP算法与公式推导

    BP backpropgationalgorithm xff1a 后向传导算法 xff0c 顾名思义就是从神经网络的输出 顶层 到输入 底层 进行求解 那么求解什么呢 xff0c 求解的就是神经网络中的参数的导数 xff0c 即参数梯度方向
  • CNN公式推导

    CNN公式推导 1 前言 在看此blog之前 xff0c 请确保已经看懂我的前两篇blog 深度学习笔记1 卷积神经网络 和 BP算法与公式推导 并且已经看过文献 1 的论文 Notes on Convolutional Neural Ne
  • 简记ReNet

    ResNet 论文给出了Resnet有3中类型 xff0c ResNet50 res3 res4 res6 res3 xff0c ResNet101 res3 res4 res23 res3 和ResNet152 res3 res4 res
  • triplet loss的原理及caffe代码

    1 xff1a triplet loss的原理及梯度推到 http blog csdn net tangwei2014 article details 46788025 2 xff1a triplet loss如何增加到caffe中 xff
  • object detection资料汇总

    转自 xff1a https handong1587 github io deep learning 2015 10 09 object detection html Jump to LeaderboardPapers R CNNMulti
  • 离职小记~~~

    这个月作出的最重要的决定 离职 对于已工作的人来说 xff0c 离职就是跳槽 xff0c 特别是对于我们计算机专业 xff0c 简简单单的一封辞职信 xff0c 等个半月 xff0c 办完手续 xff0c 一切OK xff0c 而且貌似越跳
  • C#控件编程详解之按钮控件

    摘要 xff1a 控件编程系列讲解之按钮控件 xff0c 以自身学习经历详解按钮控件的使用方法 编程语言 xff1a C 编程环境 xff1a Visual Studio 2019 目录 按钮控件属性 xff08 成员 xff09 详解 布
  • synchronized锁(方法锁, 代码块锁)

    synchronized 锁可以解决线程安全问题 xff0c 但是相应的 xff0c 只要是锁 xff0c 就会带来性能开销 xff0c 所以尽可能减小锁的范围尤为重要 synchronized锁无非修饰普通方法 xff0c 修饰静态方法
  • 骁龙855 plus的存在意义有限,高通5G芯片较对手落后

    近日高通突然发布了一款特别的芯片骁龙855 plus xff0c 让人可惜的是这并非是一款5G手机SOC芯片 xff0c 而仅仅是在骁龙855基础上提升性能的芯片 xff0c 在5G已商用之际推出的这款芯片非但没能提升高通的影响力 xff0
  • Spring之环境变量配置

    本地配置实现原理 项目启动时准备环境 public class SpringApplication public ConfigurableApplicationContext run String args long startTime 6
  • shell命令 在命令行中可行,但在sh文件中失效的解决办法

    大概率是因为文件编码格式问题 可以尝试对sh文件的编码格式进行修改 在vim中查看文件编码格式 xff1a set fileencoding 在vim中直接修改文件编码格式 xff1a set fileencoding 61 gbk 或者在
  • 黑苹果10.15.7使用

    咸鱼 由于懒得去折腾硬件 xff0c 所以直接在闲鱼上买了一个现成的 xff0c 已经安装了10 15 7 xff0c i3 8100 xff0c 256G的ssd xff0c 16G内存 两天从汕头到杭州 xff0c 不得不感叹当今快递业
  • 访问控制的几种模式

    一般分类 自主访问控制 xff1a Discretionary Access Control xff0c DAC 由客体的属主对自己的客体进行管理 xff0c 由属主自己决定是否将自己的客体访问权或部分访问权授予其他主体 xff0c 这种控
  • linux进程内存查看方法

    通过proc procid status查看进程内存 piky 64 piky WRT WX9 src test cat proc 3118 status Name a out Umask 0002 State S sleeping Tgi
  • 网络设备单点登录

    1 深信服 深信服的单点登录非常丰富 1 1 AD单点登录 1 1 1 通过域下发登录脚本的单点登录 通过AD服务器的组策略推送客户端的登录核退出程序 xff0c 两个exe程序 xff0c 实现相对容易 xff0c 但非windows客户
  • 基于openldap查询AD用户的组信息,上代码

    当用户找不到时 xff0c 这里的ldap result会卡住 xff0c 设置tm sec 为1也不行 需要继续定位 同样系统上官方的ldapsearch程序没有这个问题 span class token comment gcc ldap