You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SSMS存储过程将EntraID数据导入SQL MI表?

问题解答

直接通过LDAP查询原生Entra ID(Azure AD)不可行——Entra ID原生不支持LDAP协议(仅Azure AD Domain Services,即AAD DS,例外,它是同步Entra ID数据并模拟本地AD的服务)。以下是几种可在SQL MI的存储过程中实现读取Entra ID数据的方案:

方案1:调用Microsoft Graph API(推荐)

SQL MI可通过存储过程调用Microsoft Graph API获取Entra ID数据,步骤如下:

  1. 给SQL MI启用系统分配托管身份,并为该身份分配Entra ID的Directory.Read.All权限(通过Entra ID门户配置)。
  2. 在SQL MI中启用OLE Automation Procedures(需sysadmin权限):
    sp_configure 'show advanced options', 1;
    RECONFIGURE;
    sp_configure 'OLE Automation Procedures', 1;
    RECONFIGURE;
    
  3. 创建存储过程调用API并解析结果:
    CREATE PROCEDURE GetEntraIDUsers
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @xmlHttpObj INT, @response NVARCHAR(MAX), @accessToken NVARCHAR(MAX);
    
        -- 获取托管身份的访问令牌
        EXEC sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @xmlHttpObj OUT;
        EXEC sp_OAMethod @xmlHttpObj, 'open', NULL, 'GET', 
            'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://graph.microsoft.com', 
            'false';
        EXEC sp_OAMethod @xmlHttpObj, 'setRequestHeader', NULL, 'Metadata', 'true';
        EXEC sp_OAMethod @xmlHttpObj, 'send';
        EXEC sp_OAGetProperty @xmlHttpObj, 'responseText', @response OUT;
        EXEC sp_OADestroy @xmlHttpObj;
    
        -- 解析令牌
        SET @accessToken = JSON_VALUE(@response, '$.access_token');
    
        -- 调用Microsoft Graph API查询用户
        EXEC sp_OACreate 'MSXML2.ServerXMLHTTP.6.0', @xmlHttpObj OUT;
        EXEC sp_OAMethod @xmlHttpObj, 'open', NULL, 'GET', 'https://graph.microsoft.com/v1.0/users', 'false';
        EXEC sp_OAMethod @xmlHttpObj, 'setRequestHeader', NULL, 'Authorization', 'Bearer ' + @accessToken;
        EXEC sp_OAMethod @xmlHttpObj, 'send';
        EXEC sp_OAGetProperty @xmlHttpObj, 'responseText', @response OUT;
        EXEC sp_OADestroy @xmlHttpObj;
    
        -- 将JSON响应转换为表格返回
        SELECT 
            JSON_VALUE(userData.value, '$.id') AS Id,
            JSON_VALUE(userData.value, '$.displayName') AS DisplayName,
            JSON_VALUE(userData.value, '$.userPrincipalName') AS UserPrincipalName
        FROM OPENJSON(@response, '$.value') AS userData;
    END
    
    注意:需确保SQL MI的出站网络允许访问graph.microsoft.com和Azure实例元数据服务(169.254.169.254)。

方案2:使用Azure AD Domain Services(AAD DS)

若已部署AAD DS(它会同步Entra ID的用户/组并支持LDAP),可直接通过LDAP查询AAD DS,语法与本地AD一致:

  1. 确保SQL MI与AAD DS在同一VNet或对等VNet中,且网络连通(允许LDAP端口)。
  2. 创建存储过程执行LDAP查询:
    CREATE PROCEDURE GetAADDSUsers
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @ldapQuery NVARCHAR(MAX) = 'SELECT * FROM ''LDAP://<你的AADDS域名>/DC=<DC段>,DC=<DC段>''';
        SELECT * FROM OPENROWSET('ADSDSOObject', '', @ldapQuery);
    END
    
    注意:SQL MI需配置为使用AAD DS的域身份验证,或通过可信连接访问AAD DS。

方案3:自定义CLR存储过程

编写.NET CLR存储过程,通过Microsoft Graph SDK调用Entra ID数据:

  1. 编写.NET代码引用Microsoft Graph SDK,实现数据查询逻辑(使用托管身份认证)。
  2. 编译为DLL,在SQL MI中注册CLR程序集(需启用CLR集成):
    sp_configure 'clr enabled', 1;
    RECONFIGURE;
    CREATE ASSEMBLY EntraIDGraphAssembly FROM '<DLL路径>' WITH PERMISSION_SET = EXTERNAL_ACCESS;
    
  3. 创建CLR存储过程供SSMS调用。

关于SSMS插件/内置功能

目前没有可直接安装在SQL Database Engine或SSMS中的插件,能实现通过LDAP查询原生Entra ID的功能。所有可行方案均需通过上述API调用、AAD DS或CLR方式实现。

内容的提问来源于stack exchange,提问作者Nils

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:27:37