适用于: SQL Server 2025 (17.x)
- SQL Server 2022
- SQL Server 2025
Azure SQL 数据库 &Azure SQL 托管实例 - Azure VM 上的 SQL Server
本文提供了有关为Azure Arc启用的SQL Server设置和配置Microsoft Entra ID托管标识的分步说明。
有关 SQL Server 的托管标识的概述,请参阅 由 Azure Arc 启用的 SQL Server 托管标识。
先决条件
在使用 Azure Arc 为 SQL Server 启用托管身份之前,请确保您满足以下先决条件:
- SQL Server 2025 及更高版本支持,在 Windows 上运行。
- 将 SQL Server 连接到 Azure Arc。
- 最新版本的 适用于 SQL Server 的 Azure 扩展。
启用主要托管标识
如果已将用于SQL Server的 Azure 扩展安装到服务器,可以直接从 Azure 门户为 SQL Server 实例启用主托管标识。 还可以通过更新注册表手动启用主托管标识,但应谨慎行事。
若要在 Azure 门户中启用主托管标识,请执行以下步骤:
转到 Azure 门户中由 Azure Arc 启用的 SQL Server 资源。
在 Settings 下,选择 Microsoft Entra ID 和 Purview打开 Microsoft Entra ID 和 Purview 页。
注释
如果未看到 启用 Microsoft Entra ID 身份验证 选项,请确保 SQL Server 实例已连接到 Azure Arc,并且已安装最新的 SQL 扩展。
在 Microsoft Entra ID 和 Purview 页上,选中 使用主托管标识 的框,然后使用 保存 应用配置:
Azure门户中Microsoft Entra选项的截图。
向标识授予应用程序权限
重要
只有特权角色管理员或更高角色才能授予这些权限。
若要为SQL Server实例启用Microsoft Entra身份验证,每个系统分配的托管标识都需要 User.Read.All、GroupMember.Read.All 和 Application.Read.All 权限才能查询Microsoft Graph。 有关这些权限的详细信息,请参阅:
- User.Read.All:允许访问Microsoft Entra用户信息。
- GroupMember.Read.All:允许访问Microsoft Entra组信息。
- Application.Read.All:允许访问Microsoft Entra服务主体(应用程序)信息。
这些权限是应用程序级权限(应用角色),必须直接分配给每个托管标识。 他们不能手动分配到 Microsoft Entra 安全组,也不能通过组成员身份将权限授予成员。 对于具有许多计算机的环境,另一种方法是将 Directory Readers 角色分配给一个可分配的 Microsoft Entra 安全组,并将托管标识作为成员添加进去。 与应用角色权限不同,可以在组级别授予此Microsoft Entra角色,从而大规模简化管理。 但是,Directory Readers对所有目录对象授予广泛的读取访问权限,大大超过了三个目标图形 API权限。 对于需要最低特权访问的生产环境,不建议使用 “目录读取者” 角色。
以下 PowerShell 脚本向托管标识授予所需的权限。 请确保此脚本在 PowerShell 7.5 或更高版本上运行,并且已安装 Microsoft.Graph 模块 2.28 或更高版本。
# Set your Azure tenant and managed identity name
$tenantID = '<Enter-Your-Azure-Tenant-Id>'
$managedIdentityName = '<Enter-Your-Arc-HostMachine-Name>'
# Connect to Microsoft Graph
try {
Connect-MgGraph -TenantId $tenantID -ErrorAction Stop
Write-Output "Connected to Microsoft Graph successfully."
}
catch {
Write-Error "Failed to connect to Microsoft Graph: $_"
return
}
# Get Microsoft Graph service principal
$graphAppId = '00000003-0000-0000-c000-000000000000'
$graphSP = Get-MgServicePrincipal -Filter "appId eq '$graphAppId'"
if (-not $graphSP) {
Write-Error "Microsoft Graph service principal not found."
return
}
# Get the managed identity service principal
$managedIdentity = Get-MgServicePrincipal -Filter "displayName eq '$managedIdentityName'"
if (-not $managedIdentity) {
Write-Error "Managed identity '$managedIdentityName' not found."
return
}
# Define roles to assign
$requiredRoles = @(
"User.Read.All",
"GroupMember.Read.All",
"Application.Read.All"
)
# Assign roles using scoped syntax
foreach ($roleValue in $requiredRoles) {
$appRole = $graphSP.AppRoles | Where-Object {
$_.Value -eq $roleValue -and $_.AllowedMemberTypes -contains "Application"
}
if ($appRole) {
try {
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentity.Id `
-PrincipalId $managedIdentity.Id `
-ResourceId $graphSP.Id `
-AppRoleId $appRole.Id `
-ErrorAction Stop
Write-Output "Successfully assigned role '$roleValue' to '$managedIdentityName'."
}
catch {
Write-Warning "Failed to assign role '$roleValue': $_"
}
}
else {
Write-Warning "Role '$roleValue' not found in Microsoft Graph AppRoles."
}
}
创建登录名和用户
按照 Microsoft Entra 教程中的步骤为托管标识创建登录名和用户。