请求优化AD禁用用户E3许可证清理PowerShell脚本
优化后的PowerShell脚本
# 1. 获取AD中禁用的用户并导出到CSV(确保路径存在) $outputPath = "C:\Temp\disabledADUser.csv" # 检查临时目录是否存在,不存在则创建 if (-not (Test-Path "C:\Temp")) { New-Item -Path "C:\Temp" -ItemType Directory | Out-Null } Get-ADUser -Filter { Enabled -eq $false } | Select-Object UserPrincipalName | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8 # 2. 导入AD禁用用户列表,筛选出拥有E3许可证的用户 $disabledADUsers = Import-Csv -Path $outputPath $targetUsers = @() foreach ($user in $disabledADUsers) { $upn = $user.UserPrincipalName # 跳过空UPN的情况 if ([string]::IsNullOrWhiteSpace($upn)) { continue } try { # 获取O365用户,捕获"用户未找到"的异常 $o365User = Get-MsolUser -UserPrincipalName $upn -ErrorAction Stop # 检查是否持有SPE_E3许可证 if ($o365User.Licenses.AccountSkuId -match "SPE_E3") { $targetUsers += [PSCustomObject]@{ UserPrincipalName = $upn Status = "AD禁用且拥有E3许可证" } Write-Host "找到目标用户: $upn" -ForegroundColor Red } else { Write-Host "$upn 无E3许可证" -ForegroundColor Green } } catch [Microsoft.Online.Administration.Automation.MicrosoftOnlineException] { # 处理"用户未找到"的错误 if ($_.Exception.Message -match "用户未找到") { Write-Host "$upn 不存在于Office 365中" -ForegroundColor Yellow } else { # 其他异常输出错误信息 Write-Host "$upn 处理出错: $($_.Exception.Message)" -ForegroundColor DarkRed } } catch { # 捕获其他类型的异常 Write-Host "$upn 发生未知错误: $($_.Exception.Message)" -ForegroundColor DarkRed } } # 3. 将筛选结果导出到CSV if ($targetUsers.Count -gt 0) { $resultPath = "C:\Temp\DisabledADUsersWithE3.csv" $targetUsers | Export-Csv -Path $resultPath -NoTypeInformation -Encoding UTF8 Write-Host "`n结果已导出至: $resultPath" -ForegroundColor Cyan } else { Write-Host "`n未找到AD禁用且拥有E3许可证的用户" -ForegroundColor Green }
关键优化点说明
- 解决"用户未找到"错误:使用
try/catch捕获Get-MsolUser抛出的专属异常,针对"用户未找到"场景单独处理,避免错误信息干扰正常输出。 - 核心筛选逻辑实现:先提取AD禁用用户列表,再逐个校验O365许可证状态,将符合"AD禁用+E3许可证"条件的用户统一收集后导出到结果CSV。
- 鲁棒性提升:
- 自动检查并创建输出目录,避免路径不存在导致的失败。
- 跳过空用户主体名称(UPN),防止无效查询。
- 区分不同异常类型,输出更精准的状态提示。
- 修正原脚本错误:
- 修复导入CSV时的文件名缺失
.csv后缀问题。 - 修正
Select-Object中的属性名拼写错误(userprincipalnameione改为UserPrincipalName)。 - 导出CSV时添加
-NoTypeInformation参数,移除多余的类型信息行。
- 修复导入CSV时的文件名缺失
内容的提问来源于stack exchange,提问作者6Razzer9
相关产品推荐
相关产品推荐

