比较 AAD 和 ADS 之间的用户

Comparing users between AAD and ADS

我正试图从我们的学区广告中清除我们设定的一些内务管理目标的用户。现在我有一个非常好的脚本可以找到所有停用的学生帐户,并在停用 30 天后删除它们。我们发现,即使我们从 ADS 中删除了这些用户,它们也会在 AAD 中的已删除用户文件夹中再保留 30 天。我正在尝试构建一个脚本来查找 AAD 中已删除用户文件夹中的所有用户,然后将其与我们在 ADS 中拥有的用户进行匹配,同时还避免设置为不将学生数据与 AAD 同步的 2 个 OU .我的脚本的前半部分很简单,因为我只需要 AAD 中已删除用户文件夹中的名称。

Get-MsolUser -ReturnDeletedUsers | Select DisplayName, ObjectId | Export-Csv -LiteralPath C:\Results\DeletedUsers.csv -NoTypeInformation

这给了我一个可以从中提取的 csv,但这是个大问题。我无法做出在 AAD 和 ADS 之间共享的一对一选择。到目前为止我发现的最好的事情是在我的后续脚本中指定使用来自 AAD (studentid#@domain.org) 的 DisplayName 来对抗 ADS 中的 UserPrincipalName。

$Users = Get-Content C:\Results\DeletedUsers.csv

ForEach ($User in $Users){
        Get-ADUser -Filter * -Properties UserPrincipalName | Where { ($_.UserPrincipalName -Like $User) }
    }

这里的问题是,这最后一半已经 运行 waaaaay 太久了,我需要一些更可靠和更快速的东西。

你的代码的主要问题是在 foreach 循环逻辑中,你 每次循环迭代查询域中的所有用户 而不是 filtering for a specific user。另一方面,不清楚你的AD On Premises是否与Azure AD同步,为什么不删除AD On Prem中的对象,让它们与Azure AD同步呢?另一个问题是,您只从 Get-MsolUser 查询中选择了 DisplayNameObjectId 属性,这样一来,您就切断了对搜索有用的重要属性AD On Prem 中的 AD 对象,例如 onPremisesDistinguishedNameonPremisesSamAccountNameonPremisesUserPrincipalName.

您的代码的直接修复是这样,但是您应该考虑上面提到的内容。

$Users = (Import-Csv C:\Results\DeletedUsers.csv).DisplayName
$OUsToSkip = ('OU=something,DC=something', 'OU=somethingelse,DC=something') -join '|'
foreach($User in $Users) {
    # mail attribute is equal to `$user` OR UPN is equal to `$user`
    $filter = "(|(mail=$user)(userprincipalname=$user))"
    $usr = Get-ADUser -LDAPFilter $filter
    if($usr.DistinguishedName -notmatch $OUsToSkip -and $usr) {
        $usr
    }
}