[玩转系统] 使用 PowerShell 和图表报告团队在线会议
作者:精品下载站 日期:2024-12-14 04:14:29 浏览:13 分类:玩电脑
使用 PowerShell 和图表报告团队在线会议
比审计事件更能提取团队在线会议的完整详细信息
令人高兴的是,Microsoft 最终向拥有 Purview Audit(标准)许可证的租户提供了一组附加审核事件。有些人可能会对能够分析来自 MeetingDetail 和 MeetingParticipantDetail 事件的 Teams 在线会议数据的前景感到兴奋,但正如我在其他地方指出的那样,这些中提供的信息事件并不像你想象的那么全面。
尽管审核事件很有帮助,并且在许多情况下可能是正确的解决方案,但如果你想了解有关 Teams 在线会议的所有信息,Microsoft Graph API 是唯一的答案。本文介绍如何使用 Graph API 在用户日历中查找 Teams 在线事件并提取会议的出席信息和其他详细信息。您可以使用功能齐全的 PowerShell 脚本来适应自己的要求。
基本方法是在仅应用程序模式下连接到 Microsoft Graph(使用 Entra ID 应用程序进行身份验证),并使用分配给应用程序的 Graph 权限从用户日历和 Teams 存储中读取数据。最后一步是根据数据生成 HTML 报告。
创建 Entra ID 应用程序以访问在线会议
第一步是创建一个 Entra ID 应用程序来持有检索 Teams 在线会议数据、日历数据和其他信息所需的权限。该应用程序需要 X.509 证书(自行生成或购买)进行身份验证。创建应用程序后,分配以下应用程序权限:
- Calendars.Read:读取日历数据以查找要处理的在线会议。
- Group.Read.All:读取组成员身份以查找要处理的帐户。
- OnlineMeetings.Read.All:读取 Teams 在线会议数据。
- OnlineMeetingArtifact.Read.All:阅读 Teams 在线会议的出席报告。
- CrossTenantInformation.ReadBasic。全部:读取与会者报告中的信息,以解析外部(联合)参与者的租户名称。
- Organization.Read.All:读取有关租户的信息(例如其显示名称)。
图 1 显示了为脚本使用的应用程序分配并同意的应用程序权限集。
记下应用程序属性中的应用程序(客户端)标识符、租户(目录)标识符和证书指纹。将值存储在 PowerShell 变量中以在脚本中使用。这些元素用于在使用 Connect-MgGraph cmdlet 连接到图形时进行身份验证。
创建应用程序访问策略
借助应用程序权限,应用程序可以访问整个租户的数据。嗯,是的,但仅限于组、日历和跨租户信息。用于访问 Teams 在线会议的应用程序权限具有更高级别的保护,称为应用程序访问策略。
应用程序访问策略将一个或多个 Entra ID 应用程序与帐户链接起来,以允许应用程序处理属于这些帐户的在线 Teams 数据。在某些方面,它类似于 Exchange Online 用于限制对邮箱的访问的应用程序 RBAC 机制。
Teams 管理中心不支持应用程序访问策略的管理。这些操作必须使用 PowerShell 执行。首先,我们通过运行 New-CsApplicationAccessPolicy cmdlet 创建应用程序访问策略:
New-CsApplicationAccessPolicy -Identity 'Read Teams Meeting Data' -AppIds "78b6e21f-127d-470d-a61b-295d5c2d058c" -Description "Permission to read Teams Meetings for users"
Identity : Tag:Read Teams Meetings
AppIds : {78b6e21f-127d-470d-a61b-295d5c2d058c}
Description : Permission to read Teams Meetings for users
创建应用程序访问策略后,我们可以将其授予脚本应处理其在线会议数据的帐户。可以向未分配特定策略的所有帐户授予应用程序访问策略,但在本例中,我们对特定帐户运行 Grant-CsApplicationAccessPolicy cmdlet。为每个帐户运行 cmdlet,并将该帐户的标识符作为受让人传递。用户主体名称或 GUID 都有效:
Grant-CsApplicationAccessPolicy -PolicyName 'Read Teams Meeting Data' -Identity 21a3ce8f-6d55-4e57-9210-d85a2f1618ec
您一次只能向特定用户分配一个应用程序访问策略。为用户分配新的应用程序访问策略会覆盖任何现有的应用程序访问策略。此外,只能向具有有效 Teams 许可证的成员帐户授予应用程序访问策略。应用程序访问授权最多可能需要 30 分钟才能允许应用程序访问在线会议数据。
完成分配后,检查应用程序可以处理的帐户:
Get-CsOnlineUser -Filter {ApplicationAccessPolicy -eq "Read Teams Meeting Data"} | Select-Object DisplayName,UserPrincipalName,ApplicationAccessPolicy
DisplayName UserPrincipalName ApplicationAccessPolicy
----------- ----------------- -----------------------
Alex Wilber [email protected] Read Teams Meeting Data
"Popeye" Doyle [email protected] Read Teams Meeting Data
Alain Charnier [email protected] Read Teams Meeting Data
连接到 Microsoft Graph
等待策略分配生效后,使用 Microsoft Graph PowerShell SDK 连接到 Microsoft Graph。我们希望使用分配给有权访问指定帐户的在线数据的应用程序的权限,因此 Connect-MgGraph 在其参数中包含应用程序标识符、租户标识符和证书指纹:
$AppId = "78b6e21f-127d-470d-a61b-295d5c2d058c"
$TenantId = "22e90715-3da6-4a78-9ec6-b3282389492b"
$CertThumbprint = "F79286DB88C21491110109A0222348FACF694CBD"
Connect-MgGraph -AppId $AppId -TenantId $TenantId -CertificateThumbprint $CertThumbprint
要检查所有必需的权限是否可用,请运行Get-MgContext。仅当会话可以使用下面列出的五个权限时,该脚本才会起作用:
(Get-MgContext).scopes
OnlineMeetings.Read.All
OnlineMeetingArtifact.Read.All
Calendars.Read
Group.Read.All
CrossTenantInformation.ReadBasic.All
Organization.Read.All
处理团队在线会议的步骤
该脚本使用以下步骤:
- 找到要提取 Teams 在线会议数据的用户帐户集。为了使帐户集更易于管理,该脚本使用通讯组列表来保存帐户并使用 Get-MgMemberGroup cmdlet 读取成员资格。
- 对于每个帐户,从用户邮箱的日历文件夹中读取事件集并提取在线 Teams 会议集。
- 对于每次会议,提取包括出席报告在内的详细信息。
- 根据数据生成报告。
这一切听起来很简单,但像往常一样,有一些细节会造成阻碍。
获取团队在线会议数据时需要处理的一些问题
首先,对 Teams 在线会议数据的访问似乎会在 60 天左右后停止。日历信息始终可用,但不提供有关在线方面的详细信息。 Teams 似乎会在 60 天后将其会议数据从在线缓存中移出,并且任何后续返回有关会议详细信息的尝试都会失败。如果您尝试在 Teams 客户端中打开旧会议,您可以看到数据。我假设使用其他一些 API 来检索旧数据并将其加载到缓存中。
这是审计事件更好的示例。如果您拥有 Purview Audit(标准)许可证,则数据的可用期限为 180 天。使用 Purview Audit(高级版),数据可 365 天可用。
解码和编码会议标识符
其次,您可能知道为每个 Teams 会议发布的会议 URL。使用获取 onlineMeeting API 检索会议详细信息时,该 API 需要在线会议对象的标识符。该文档在定义会议标识符的格式方面并不是很有帮助,但一些搜索揭示了一种使用以下步骤的方法:
- 获取会议加入 URL。该值类似于:https://teams.microsoft.com/l/meetup-join/19%3ameeting_YzU5NTYwM2QtMmU3YS00YmNlLWEwZWMtNzA0NTk4OTZlNjJi%40thread.v2/0?context=%7b%22Tid%22%3a%22a662313f-14fc -43a2-9a7a-d2e27f4f3478%22%2c%22Oid%22%3a%225b52fba5-349e-4622-88cd-d790883fe4c4%22%7d(根据 MC772556,微软计划采用更短的会议加入 URL 格式2024 年 8 月)。
- 解码 URL。
- 在解码的会议加入 URL 中查找会议标识符(类似于 19:meeting_ZmY4YTJhNmUtY2Y3OS00ZGZlLWI1ODEtYjA2ZTZmZjA0YzQ0@thread.v2 的值)。
- 创建以特定方式格式化的查找值。该值包含组织者的用户标识符和会议标识符,如下所示:1*880e1e61-af63-43c9-a48e-d6b63684c21c*0**19:meeting_ZmY4YTJhNmUtY2Y3OS00ZGZlWI1ODEtYjA2ZTZmZjA0YzQ0@thread.v2。
- 创建会议查找标识符的 BASE64 编码值。
我认为 Microsoft 以这种方式混淆 Teams 会议标识符,以限制某人滥用标识符访问他们不应该访问的会议的可能性。无论如何,这是我使用的 PowerShell 代码:
$MeetingURL = $Item.onlinemeeting.joinUrl.trim()
$DecodedURL = [System.Web.HttpUtility]::UrlDecode($MeetingURL)
$MeetingIdStart = $DecodedURL.IndexOf("19:")
$MeetingIdEnd = $DecodedURL.IndexOf("thread")
$MeetingId = $DecodedURL.Substring($MeetingIdStart, $MeetingIdEnd - $MeetingIdStart +9)
$MeetingIdLookup = ("1*{0}*0**{1}" -f $Organizer.id, $MeetingId)
$Base64MeetingId = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($MeetingIdLookup))
然后,该脚本可以构造一个 URI 以与图形请求一起使用。 URI 看起来像:
https://graph.microsoft.com/v1.0/users/880e1e61-af63-43c9-a48e-d6b63684c21c/onlineMeetings/MSo4ODBlMWU2MS1hZjYzLTQzYzktYTQ4ZS1kNmI2MzY4NGMyMWMqMCoqMTk6bWVldGluZ19abVk 0WVRKaE5tVXRZMlkzT1MwMFpHWmxMV0kxT0RFdFlqQTJaVFptWmpBMFl6UTBAdGhyZWFkLnYy
返回值是 Teams 保存的有关在线会议的详细信息。
之后,唯一需要处理的问题是会议可以多次开始和停止。每个实例都会生成一份出勤报告和其他工件,例如成绩单。
我们有兴趣了解谁参加了会议的任何实例,因此脚本找到所有出席报告并提取每个报告的出席数据。
报告
无论 PowerShell 脚本有多好,如果它不能产生有用的输出,那么代码就毫无用处。在本例中,输出是一个 HTML 报告,列出了用户的在线会议以及会议及其出席情况的详细信息(图 2)。
请注意,当来宾帐户参加会议时,他们通常会在加入之前切换到主机租户(某些组织强制执行的纪律)。这使得该帐户看起来像是来自该租户(确实如此),因此除了联合与会者(使用自己的帐户登录并参加另一个租户中的会议的人)之外,您看不到主租户名称。
该脚本可从 GitHub 获取。我希望 PowerShell 代码是可以理解的。如果不是,请务必为我修复。我可以使用我能得到的所有帮助。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag