跳转至

访问控制

谁可以与 Teams 机器人对话、它会在哪些团队和频道中响应,以及这些规则所使用的 ID 从何而来。

配置写入

默认情况下,Microsoft Teams 可以写入由 /config set|unset 触发的配置更新(需要 commands.config: true)。

禁用方式:

{
  channels: { msteams: { configWrites: false } },
}

访问控制(私信 + 群组)

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。父频道帖子和其他人的线程保留其 常规提及规则。群聊引用不是频道线程,并且发件人以及 团队/频道允许列表仍然适用。

{
  channels: {
    msteams: {
      requireMention: true,
      requireMentionInBotThreads: false,
    },
  },
}

所有权使用当前机器人记录的已接受顶级频道帖子, 包括主动消息。在现有线程中的回复不会建立 所有权。跟踪最长持续 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 历史记录 是 是(需要权限)

如果私有频道无法正常工作,可使用以下变通方法:

  1. 使用标准频道进行机器人交互。
  2. 使用 DM;用户始终可以直接向机器人发送消息。
  3. 使用 Graph API 进行历史访问(需要 ChannelMessage.Read.All)。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw