如何根据Office 365许可证状态为CSV列设置对应值?
解决Office 365许可证状态批量查询并更新CSV的问题
嗨!很高兴帮你搞定这个需求~ 首先得确认你已经准备好Microsoft Graph PowerShell模块(现在微软推荐用这个替代旧的MSOnline模块来管理365服务),下面是一步步的实现方案:
1. 先安装并连接到Microsoft Graph
首先打开PowerShell(建议以管理员身份运行),执行以下命令:
# 安装Microsoft Graph模块(第一次运行需要) Install-Module Microsoft.Graph -Force -AllowClobber # 连接到Graph,需要用户读取和组织权限 Connect-MgGraph -Scopes User.Read.All, Organization.Read.All
连接的时候会弹出登录窗口,用你的Office 365管理员账号登录即可。
2. 完整的CSV处理代码
你可以把下面的代码和你已有的开头结合,记得根据实际的许可证名称修改$license1Name和$license2Name:
# 导入原始CSV文件 $users = Import-Csv .\users.csv # 定义需要检查的许可证名称(替换成你实际要查的许可证) $license1Name = "Microsoft 365 E3" $license2Name = "Microsoft Teams Phone Standard" # 遍历每个用户,查询许可证状态 foreach ($user in $users) { # 获取用户的许可证详情,忽略不存在的用户错误 $userLicenses = Get-MgUserLicenseDetail -UserId $user.Username -ErrorAction SilentlyContinue # 处理License1状态:先把许可证名称转成无空格的SkuPartNumber格式,再匹配 $license1Sku = $license1Name -replace " ", "" $user.License1 = if ($userLicenses.SkuPartNumber -contains $license1Sku) { "已分配" } else { "未分配" } # 处理License2状态 $license2Sku = $license2Name -replace " ", "" $user.License2 = if ($userLicenses.SkuPartNumber -contains $license2Sku) { "已分配" } else { "未分配" } # 可选:如果用户不存在,标记状态 if (-not $userLicenses) { $user.License1 = "用户不存在" $user.License2 = "用户不存在" } } # 将更新后的数据导出到新CSV(避免覆盖原文件) $users | Export-Csv .\updated_users.csv -NoTypeInformation -Encoding UTF8
3. 关键注意事项
- 许可证SkuPartNumber确认:如果不确定你的许可证对应的SkuPartNumber,可以运行
Get-MgSubscribedSku查看所有可用的许可证信息,找到对应名称的SkuPartNumber字段(比如"Microsoft 365 E3"对应O365E3)。 - 权限问题:确保你的账号有足够的权限读取用户和许可证信息,否则会出现访问被拒绝的错误。
- 编码问题:导出CSV时用
-Encoding UTF8可以避免中文乱码的情况。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

