访问控制
谁可以与 Teams 机器人对话、它会在哪些团队和频道中响应,以及这些规则所使用的 ID 从何而来。
配置写入¶
默认情况下,Microsoft Teams 可以写入由 /config set|unset 触发的配置更新(需要 commands.config: true)。
禁用方式:
访问控制(私信 + 群组)¶
Microsoft Teams 每个频道配置对应一个账户。策略应直接设置在 channels.msteams 下;不支持 accounts 映射。
私信访问
- 默认:
channels.msteams.dmPolicy = "pairing"。未知发件人在批准前会被忽略。 channels.msteams.allowFrom应使用稳定的 AAD 对象 ID,或静态发件人访问组,例如accessGroup:core-team。- 不要依赖 UPN/显示名称匹配来实现允许列表;这些值可能会变化。OpenClaw 默认禁用直接名称匹配;如需启用,请设置
channels.msteams.dangerouslyAllowNameMatching: true。 - 当凭据允许时,向导可以通过 Microsoft Graph 将名称解析为 ID。
群组访问
- 默认:
channels.msteams.groupPolicy = "allowlist"(除非添加groupAllowFrom,否则会被阻止)。请显式设置channels.msteams.groupPolicy以选择其他策略;根 schema 默认值优先于channels.defaults.groupPolicy。 channels.msteams.groupAllowFrom控制哪些发件人、静态发件人访问组或群组/频道会话 ID 可以在群聊/频道中触发(回退到channels.msteams.allowFrom)。会话 ID 可以使用19:...@thread.tacv2、19:...@thread.v2或19:...@thread.skype;请保留 ID 的原始大小写。OpenClaw 会忽略;messageid=...后缀。会话 ID 永远不会授予个人私信访问权限。- 设置
groupPolicy: "open"以允许任何成员(默认仍受提及限制)。 - 若要阻止所有频道,请设置
channels.msteams.groupPolicy: "disabled"。
示例:
{
channels: {
msteams: {
groupPolicy: "allowlist",
groupAllowFrom: ["00000000-0000-0000-0000-000000000000", "accessGroup:core-team"],
},
},
}
团队 + 频道允许列表
- 通过在
channels.msteams.teams下列出团队和频道,来限定群组/频道回复的范围。 - 请使用来自 Teams 链接的稳定 Teams 会话 ID 作为键,而不是可变的显示名称(参见 团队和频道 ID)。
- 当
groupPolicy="allowlist"且存在团队允许列表时,仅接受列出的团队/频道(受提及限制)。 groupAllowFrom授权的是群组发件人,而不是对其他频道的委托 Graph 读取。如果现有配置仅设置了groupAllowFrom,请保留默认groupPolicy: "allowlist",并在channels.msteams.teams.<team>.channels下配置目标。- 或者,有意设置
groupPolicy: "open"以获得更广泛的委托读取。这也会允许任何群组发件人(默认仍受提及限制),因此比限定团队/频道路径的限制更少。 - 直接操作者读取以及当前会话中的读取不需要额外的团队/频道路径。
- 配置向导接受
Team/Channel条目并为你保存它们。 - 启动时,OpenClaw 会将团队/频道和用户允许列表中的名称解析为 ID(在 Graph 权限允许时),并记录映射。未解析的名称会按输入保留,但在路由中被忽略,除非设置了
channels.msteams.dangerouslyAllowNameMatching: true。
在兼容的核心和 Teams 版本下,经过验证的官方 npm 和 ClawHub 安装
可以在这些访问规则下使用现有的 read、search、reactions、list-pins、member-info、
channel-info 和 channel-list 操作。来自已安装插件的代理读取
需要受信任的当前 Teams 会话和账户上下文。
列出团队的频道需要访问整个团队;访问一个频道
不会授予该权限。成员查找
保留其标准频道和当前请求者限制。当源调用或插件失去权限时,
后续的 Graph 请求和结果会被拒绝。
示例:
{
channels: {
msteams: {
groupPolicy: "allowlist",
groupAllowFrom: ["00000000-0000-0000-0000-000000000000"],
teams: {
"19:team-id@thread.tacv2": {
channels: {
"19:channel-id@thread.tacv2": { requireMention: true },
},
},
},
},
},
}
机器人创建的线程中的提及¶
设置 requireMentionInBotThreads: false 可在频道线程中无需 @提及 即可回复,
前提是这些线程的根消息由本机器人发送。将其设置为 true 可要求在这些线程中
必须提及,包括那些原本可被视为隐式提及的回复。省略该设置可保留现有的提及行为。
该设置从频道到团队再到 channels.msteams 解析,独立于
requireMention。父频道帖子和其他人的线程保留其
常规提及规则。群聊引用不是频道线程,并且发件人以及
团队/频道允许列表仍然适用。
所有权使用当前机器人记录的已接受顶级频道帖子,
包括主动消息。在现有线程中的回复不会建立
所有权。跟踪最长持续 24 小时,并且有上限;最新的 1,000 个发送
标记在重启后保留。较旧的或未跟踪的根消息保留普通提及
规则。Teams 必须在应用清单中授予 ChannelMessage.Read.Group,才能投递
不带 @提及 的消息;参见 RSC 权限。
团队和频道 ID(常见陷阱)¶
Teams URL 中的 groupId 查询参数不是配置中使用的团队 ID。请改为从 URL 路径中提取 ID:
团队 URL:
https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?groupId=...
└────────────────────────────┘
Team conversation ID (URL-decode this)
频道 URL:
https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?groupId=...
└─────────────────────────┘
Channel ID (URL-decode this)
用于配置:
- 团队密钥 =
/team/之后的路径段(URL 解码,例如19:Bk4j...@thread.tacv2;旧租户可能显示@thread.skype,这也有效)。 - 频道密钥 =
/channel/之后的路径段(URL 解码)。 - 对于 OpenClaw 路由,忽略
groupId查询参数。它是 Microsoft Entra 组 ID,而不是传入 Teams 活动所使用的 Bot Framework 会话 ID。
私有频道¶
机器人对私有频道支持有限:
| 功能 | 标准频道 | 私有频道 |
|---|---|---|
| 机器人安装 | 是 | 有限 |
| 实时消息(webhook) | 是 | 可能无法工作 |
| RSC 权限 | 是 | 行为可能不同 |
| @提及 | 是 | 如果机器人可访问 |
| Graph API 历史记录 | 是 | 是(需要权限) |
如果私有频道无法正常工作,可使用以下变通方法:
- 使用标准频道进行机器人交互。
- 使用 DM;用户始终可以直接向机器人发送消息。
- 使用 Graph API 进行历史访问(需要
ChannelMessage.Read.All)。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw