如何用PowerShell将Azure AD授权用户与共享邮箱导出至同一Excel?
解决方案
修改后的完整代码
# 导入所需模块(需提前安装并具备对应权限) Import-Module MSOnline Import-Module ExchangeOnlineManagement # 连接Azure AD和Exchange Online(根据实际环境选择验证方式) Connect-MsolService Connect-ExchangeOnline # 获取带许可证的用户数据,每个许可证对应一行记录 $licensedUsers = Get-MsolUser -All | Where-Object { $_.IsLicensed -eq $true } $userResults = foreach ($user in $licensedUsers) { foreach ($license in $user.Licenses.AccountSkuId) { [PSCustomObject]@{ 数据类型 = "授权用户" 邮箱名称 = $user.DisplayName 名字 = $user.FirstName 姓氏 = $user.LastName 登录账号 = $user.UserPrincipalName 省份 = $user.State 许可证SKU = $license # 授权用户独有的字段,共享邮箱将显示为空 } } } # 获取共享邮箱数据 $sharedMailboxes = Get-Mailbox -Filter { RecipientTypeDetails -eq "SharedMailbox" } $mailboxResults = foreach ($mailbox in $sharedMailboxes) { [PSCustomObject]@{ 数据类型 = "共享邮箱" 邮箱名称 = $mailbox.Name 邮箱别名 = $mailbox.Alias 主邮箱地址 = $mailbox.PrimarySmtpAddress 所属数据库 = $mailbox.Database.Name # 共享邮箱独有的字段,授权用户将显示为空 } } # 合并两类数据 $combinedData = $userResults + $mailboxResults # 导出至Excel文件 $combinedData | Export-Excel -Path "C:\Temp\CombinedResults.xlsx" -AutoSize -AutoFilter -FreezeTopRow
关键调整说明
许可证循环的合理性
你原代码中foreach ($license in $licenses)的写法完全正确——一个用户可能绑定多个付费许可证,循环输出每行对应一个许可证,能让客户清晰看到每个付费许可的归属对象,完全匹配需求。如果需要将同一用户的多个许可证合并到一行,可替换为$user.Licenses.AccountSkuId -join ", ",但当前分条展示的方式更直观。共享邮箱数据补全
原代码中$mailboxResults是空对象,现在补充了共享邮箱的核心业务字段,同时新增「数据类型」字段,方便快速区分授权用户和共享邮箱。字段差异处理
PowerShell合并两个PSCustomObject数组时,会自动整合所有存在的字段:某类数据没有的字段会填充为空值,Export-Excel会将所有字段作为列输出到表格中,完美实现「同一文件展示不同字段的两类数据」的需求。细节优化
- 将MsolUser的
Alias替换为UserPrincipalName,避免部分用户Alias为空的情况; - 添加
-FreezeTopRow参数,提升Excel表格的可读性; - 统一字段命名风格,降低后续维护成本。
- 将MsolUser的
内容的提问来源于stack exchange,提问作者Wakkerman10
相关产品推荐
相关产品推荐

