在 Microsoft Entra 中将外部用户转换为内部用户


Microsoft Entra 支持目录中的外部用户与内部用户的对话,同时保持相同的对象 ID、权限和组成员身份。这样就不再需要删除外部用户、将其重新创建为内部用户以及重新配置权限和成员资格。

在本博客中,我将向您展示如何使用 Web 门户和 Microsoft Graph PowerShell 将外部用户转换为内部用户。

为什么将外部用户转换为内部用户?

将目录中的外部用户转换为内部用户的一些常见场景包括:

  • 支持收购新业务,其中可能已经预先建立了 B2B 关系。
  • 支持现有外部顾问的内部聘用。
  • 支持因收购或遗留租户拆分场景而合并两个组织。

从根本上讲,您不应该故意在目录中创建外部用户来支持这些场景。转换为内部用户功能减少了转换现有外部用户的管理和技术工作,从而减少了对最终用户的影响。

如何将外部用户转换为内部用户

请按照以下步骤使用 Microsoft Entra Web 门户将外部用户(或来宾)转换为目录中的内部用户。

1. 登录entra.microsoft.com

2. 展开身份,然后选择所有用户 > 所有用户 > 您的外部用户

4. 在概述选项卡上,选择转换为内部用户

5. 屏幕右侧将出现一个新窗口。系统将要求您输入用户主体名称并生成密码

6. 准备好后,单击转换。然后,您的用户属性将更改为成员,表明该用户现在是内部用户。

使用 PowerShell 将外部用户转换为内部用户

使用 Microsoft Graph PowerShell 以编程方式也可以实现相同的结果。使用以下 PowerShell 示例将外部 Entra ID 用户转换为内部用户。

$body = @{
        userPrincipalName = "NEW UPN HERE"
        passwordProfile =  @{
          password = "PASSWORD HERE"
          forceChangePasswordNextSignIn = "false"
        }
}

Invoke-MgGraphRequest -Method POST `
-Uri "Beta/users/ID OF EXTERNAL USER HERE/convertExternalToInternalMemberUser" `
-Body $body `
-ContentType "application/json"

我还对此进行了一些扩展,并创建了一个有用的函数,可以轻松地将外部用户转换为内部用户。

function Convert-MgExternalUser {

<#
  .AUTHOR
    Daniel Bradley
    ourcloudnetwork.co.uk

  .DESCRIPTION
    Convert external users in Microsoft Entra ID to internal users

  .EXAMPLE
    Convert-MgExternalUser -ExternalUser "externaluser#EXT#@contoso.com" -AccountName "New external user account name" -password "new password" -DefaultDomain
#>


  [CmdletBinding()]
    param(
        [Parameter(mandatory=$true)]
        [string]$ExternalUser,
        [string[]]$AccountName,
        [string[]]$password,
        [string[]]$domain,
        [switch]$DefaultDomain
    )

    #Grab default domain
    If ($DefaultDomain.IsPresent){
        $Domain = ((Invoke-MgGraphRequest -Method GET -Uri "beta/domains" -OutputType PSObject | Select -Expand Value) | Where {$_.isDefault -eq "True"}).id
    }

    #Check the external user and grab ID
    $ExternalUser -match '^.*(?=(\#EXT#))' | Out-Null
    $Normalised = $Matches[0]
    $UserCheck = Invoke-MgGraphRequest -Method GET -Uri "/beta/Users?`$filter=startsWith(UserPrincipalName, '$Normalised') and userType eq 'Guest'" -OutputType PSObject | Select -Expand Value -ErrorAction Stop
    IF ($UserCheck -eq $null){
        Write-Output "Unable to find external user, please try again."
        Return
    }

    #Create request body
    $body = @{
        userPrincipalName = "$AccountName@$Domain"
        passwordProfile =  @{
          password = "$password"
          forceChangePasswordNextSignIn = "false"
        }
    }

    #Convert external user to internal
    Invoke-MgGraphRequest -Method POST -Uri "Beta/users/$($UserCheck.id)/convertExternalToInternalMemberUser" -Body $body -ContentType "application/json"

}

了解转换用户的影响

从最初的观察来看,对象的 ID 保持不变,因此任何组成员资格和权限也将保留。

如果外部用户登录到 Teams 桌面应用程序并查看他们作为外部用户受邀加入的组织,他们将看到以下错误。要解决此问题,他们必须退出 Teams、退出 Teams、清除缓存,然后使用新用户凭据重新登录

这种体验对您来说可能会有所不同,因为转换为内部用户功能处于预览状态。

您可能只想单击登录来尝试再次登录。当我确实发现这一点时,它使用为内部用户转换创建的用户名预先填写了用户名框,但登录仍然失败。

为了使其正常工作,我必须退出 Teams,清除本地 Teams 缓存并重新登录。重新登录后,我的组成员身份保持不变,并且我在 Teams 中创建的讨论已删除 (来宾) 文本加在我的名字前面。

Microsoft 365 MyGroups 门户中列出的所有组成员身份与 SharePoint 中的任何共享文档和直接权限分配保持相同。

寻找什么

不幸的是,虽然过程很简单,但并不总是一帆风顺。以下是我在此过程中发现的一些注意事项:

  • 考虑对动态组的影响,在动态组中,许可证、应用程序或数据访问权限可能会无意中授予最近转换的用户。
  • 考虑许可对将外部业务用户转换为内部用户的影响(例如,当前用于 ID 治理的 MAU 模型)。
  • 对于仅使用云的转换用户,请考虑需要软匹配回 Active Directory 以访问本地资源。
  • 概括

    总的来说,这是一个将外部用户加入目录中作为内部用户的简单且省时的过程。然而,这些是在更大、更复杂的环境中需要考虑的一些重要注意事项,这就是将内部成员添加到您的组织(曾经是权限范围有限的外部用户)的影响。