• home > OS > Linux > DevOps >

    微软azure定时任务获取微软AD的User Groups所有成员信息

    Date:

    how to sync and retrieve user account records from AD API? 我们分别可以使用LDAP来获取或者microsoft-graph-client来获取。个人更加建议使用相关API直接获取

    基于LDAP同步

    要从Active Directory (AD) 同步用户组信息,这通常涉及到LDAP(轻量目录访问协议),因为AD是基于LDAP构建的。

    LDAP详情,可以阅读《LDAP概念和原理学习笔记

    基于这个方案,有2个库可以选择,分别

    • active-directory

    • ldapjs

    active-directory

    文档参考:https://github.com/jsumners/node-activedirectory

    // server.js  
    const express = require('express');  
    const ActiveDirectory = require('active-directory2');  
    const app = express();  
    const port = 3000;  
      
    // 配置AD连接  
    const ad = new ActiveDirectory({  
      url: 'ldap://your-ad-server', // 替换为你的AD服务器URL  
      baseDN: 'dc=yourdomain,dc=com', // 替换为你的域名  
      username: 'your-admin-username', // 替换为有权访问AD的用户名  
      password: 'your-admin-password' // 替换为有权访问AD的密码  
    });  
      
    // 路由:获取用户组  
    app.get('/user-groups', (req, res) => {  
      const groupName = req.query.groupName || ''; // 可选:根据组名过滤  
      
      ad.findUsers({ group: groupName }, (err, users) => {  
        if (err) {  
          return res.status(500).json({ error: err.message });  
        }  
        res.json(users);  
      });  
    });  
      
    app.listen(port, () => {  
      console.log(`Server running at http://localhost:${port}`);  
    });

    文档已经非常细了,首推这个

    ldapjs

    要从Active Directory (AD) 同步用户组信息到Node.js应用程序,你需要使用一些库来帮助你与AD通信。这通常涉及到LDAP(轻量目录访问协议),因为AD是基于LDAP构建的。

    曾经,https://github.com/ldapjs/node-ldapjs ,但是他已经被解散了

    var ldap = require('ldapjs');
    var client = ldap.createClient({
        url: 'ldap://your-ad-server.com'
    });
    
    // 连接到AD服务器
    client.bind('username', 'password', function(err) {
        if (err) throw err;
        console.log('Connected to AD server');
    });
    client.search('ou=Groups,dc=example,dc=com', {
        filter: '(objectClass=group)',
        scope: 'sub',
        attributes: ['cn', 'member']
    }, function(err, res) {
        if (err) throw err;
    
        res.on('searchEntry', function(entry) {
            console.log('Group found:', entry.object);
        });
    
        res.on('end', function() {
            console.log('Search completed');
        });
    });


    微软原生库

    当然,个人建议还是直接通过微软的API去获取,但是的我项目中已经使用了microsoft-graph其他内容,所以干脆用这个库来做这个

    import { ClientCredentialClient } from '@azure/msal-node'
    import { Client } from '@microsoft/microsoft-graph-client'
    import dotenv from 'dotenv'
    
    dotenv.config()
    
    const data = {
      agent: {
        clientId: process.env.AGENT_CLIENT_ID,
        tenantId: process.env.AGENT_TENANT_ID,
        clientSecret: process.env.AGENT_TENANT_ID
      },
      staff: {
        clientId: process.env.STAFF_CLIENT_ID,
        tenantId: process.env.STAFF_TENANT_ID,
        clientSecret: process.env.STAFF_CLIENT_SECRET
      }
    }
    
    // 配置MSAL应用参数
    const config = {
      auth: {
        clientId: data.agent.clientId,
        authority: `https://login.microsoftonline.com/${data.agent.tenantId}`,
        clientSecret: data.agent.clientSecret
      }
    }
    
    // 创建ClientCredentialClient实例
    const cca = new ClientCredentialClient(config)
    
    // 获取访问令牌的函数
    async function getToken() {
      const tokenRequest = {
        scopes: ['https://graph.microsoft.com/.default']
      }
    
      try {
        const response = await cca.acquireToken(tokenRequest)
        return response.accessToken
      } catch (error) {
        console.error('Error acquiring access token:', error.message)
        if (error.response) {
          console.error('Response body:', error.response.body)
        }
        throw error
      }
    }
    
    // 初始化Graph客户端
    async function initializeGraphClient(accessToken) {
      const graphClient = Client.initWithMiddleware({
        authProvider: (request) => {
          request.headers.Authorization = `Bearer ${accessToken}`
        }
      })
    
      return graphClient
    }
    
    // 获取用户组的函数
    async function getUserGroups() {
      try {
        const accessToken = await getToken()
        const graphClient = await initializeGraphClient(accessToken)
    
        const groups = await graphClient.api('/groups').get()
        console.log(groups)
      } catch (error) {
        console.error('Error fetching groups:', error)
      }
    }
    
    // 调用函数
    getUserGroups()






    转载本站文章《微软azure定时任务获取微软AD的User Groups所有成员信息》,
    请注明出处:https://www.zhoulujun.cn/html/OS/Linux/DevOps/9316.html