如何通过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数据,步骤如下:
- 给SQL MI启用系统分配托管身份,并为该身份分配Entra ID的
Directory.Read.All权限(通过Entra ID门户配置)。 - 在SQL MI中启用OLE Automation Procedures(需sysadmin权限):
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'OLE Automation Procedures', 1; RECONFIGURE; - 创建存储过程调用API并解析结果:
注意:需确保SQL MI的出站网络允许访问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; ENDgraph.microsoft.com和Azure实例元数据服务(169.254.169.254)。
方案2:使用Azure AD Domain Services(AAD DS)
若已部署AAD DS(它会同步Entra ID的用户/组并支持LDAP),可直接通过LDAP查询AAD DS,语法与本地AD一致:
- 确保SQL MI与AAD DS在同一VNet或对等VNet中,且网络连通(允许LDAP端口)。
- 创建存储过程执行LDAP查询:
注意:SQL MI需配置为使用AAD DS的域身份验证,或通过可信连接访问AAD DS。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
方案3:自定义CLR存储过程
编写.NET CLR存储过程,通过Microsoft Graph SDK调用Entra ID数据:
- 编写.NET代码引用Microsoft Graph SDK,实现数据查询逻辑(使用托管身份认证)。
- 编译为DLL,在SQL MI中注册CLR程序集(需启用CLR集成):
sp_configure 'clr enabled', 1; RECONFIGURE; CREATE ASSEMBLY EntraIDGraphAssembly FROM '<DLL路径>' WITH PERMISSION_SET = EXTERNAL_ACCESS; - 创建CLR存储过程供SSMS调用。
关于SSMS插件/内置功能
目前没有可直接安装在SQL Database Engine或SSMS中的插件,能实现通过LDAP查询原生Entra ID的功能。所有可行方案均需通过上述API调用、AAD DS或CLR方式实现。
内容的提问来源于stack exchange,提问作者Nils
相关产品推荐
相关产品推荐

