Office 365 + Adobe User Provisioning

Data & APIs

统一开通/管理 Microsoft 365(世纪互联)与 Adobe Creative Cloud 用户的自包含工具。创建、授权、重置密码、删除、查询、批量、自检,CLI/HTTP API 共用同一套 provider。USE WHEN 给XX开账号, 新建用户, 新增用户, 入职开账号, 开Office, 加Office, 开Adobe, 加Adobe, 全家桶, All Apps, 重置密码, 删除用户, 批量开户, 查用户, office365, adobe, M365, Creative Cloud, 处理开户审批.

Install

openclaw skills install office-adobe-user-provision

Office 365 + Adobe 用户开通工具(自包含 skill)

统一的 Python CLI,管理 Microsoft 365(世纪互联版)Adobe Creative Cloud 用户。 本 skill 自带完整代码 + 凭据,解压即用,无需再 clone 原仓库。

0. 前置(每次执行前确认)

pip install -r requirements.txt   # 首次:requests / python-dotenv / flask(需 Python 3.9+)

两种调用方式(等价)

# 方式 A —— 自带 CLI(推荐手敲):oup 会自动定位 skill 目录、加载 .env,可从任意路径调用
./oup adobe inspect zhangsan@example.com
ln -sf "$PWD/oup" /usr/local/bin/oup   # 可选:软链到 PATH 后全局 `oup adobe ...`

# 方式 B —— 直接调脚本:必须先 cd 到 skill 目录,且用 python3(非交互 shell 里 python 可能是 py2)
cd <本 skill 所在目录> && python3 main.py adobe inspect zhangsan@example.com

下文示例统一用 oup;等价于 python3 main.py别用裸 python——很多机器上它指向 Python 2,会直接 SyntaxError。

  • 凭据在本目录 .env —— 已随包含真实生产配置(CLIENT_SECRET / ADOBE_CLIENT_SECRET / SMTP_PASSWORD / DEFAULT_PASSWORD 等)。
  • ⚠️ 安全红线:.env 已被 .gitignore 排除。把本 skill 放进任何 git 仓库前,务必确认 .env 不会被 git add。绝不能 commit/push 到 GitHub。
  • 凭据要换/轮换时,只改 .env,代码不动(config.py 是唯一读取处)。

1. 验证工具可用(开户前必做)

./oup office365 init    # 检查 .env、拉产品、缓存默认 license
./oup adobe init        # 检查 .env、拉 Adobe 产品/profile

两条 init 都正常返回产品列表 = 工具可用。失败先看 .env 与下方 Red Flags。

2. 触发场景 → 动作

用户说provider命令
"给 XX 开账号 / 新建用户"(未说平台)先问用 AskUserQuestion 问 provider/LDAP/姓名
"新员工 / 入职开账号"bothO365 → Adobe 顺序执行
"给 XX 开 Office / 加 Office"office365见 §3
"给 XX 开 Adobe / 全家桶 / All Apps"adobe见 §4
"批量开户"需要列表(CSV/粘贴),逐条执行后汇总

3. Office 365 开通

./oup office365 create <ldap> --display-name "<中文名>" [--product O365_BUSINESS]
  • 未指定 --product → 用 init 缓存的默认 license
  • CLI 自动:创建用户 → 分配 license → 按 .env SMTP 发通知邮件(含初始密码)
  • 成功返回含 iduserPrincipalNamepassword
  • 租户是世纪互联版(entra.microsoftonline.cn / partner.onmschina.cn),不是国际版

4. Adobe 开通

./oup adobe create <ldap>@<domain> [--product cc|ps|acrobat]
  • 默认 = All Apps(全家桶);--product cc/all=全家桶,ps=Photoshop,acrobat=Acrobat Pro
  • 底层 addAdobeID + add group 一次完成邀请与授权
  • 期望返回 {"completed":1,"result":"success"}
  • adobeID 类型走邀请制:新用户收到 Adobe 邀请邮件,接受后登录 https://creativecloud.adobe.com
  • 注意:CLI 会从邮箱前缀自动拆 firstname/lastname(非中文名);adobeID 显示名影响小,需中文名要去 Adobe Admin Console 改

5. 安全红线(执行时遵守)

  • 不覆盖已有用户:先 inspect,返回 200/存在 → 用 AskUserQuestion 确认是"重置"还是"跳过",绝不静默覆盖。
  • 初始密码不回显到日志:只出现在通知邮件正文,控制台脱敏。
  • LDAP 不自作主张生成:必须用户明确给出。
  • Adobe 座位不足(error.group.license_quota_exceeded)→ 报告用户,不静默降级到其他产品。

6. 结果验证 + 交付

./oup office365 inspect <ldap> --json
./oup adobe inspect <ldap>@<domain> --json

给用户摘要:账号(LDAP+email)、初始密码/邀请说明、已授权产品、登录入口 (O365: https://portal.partner.microsoftonline.cn · Adobe: https://creativecloud.adobe.com)。

7. 其他命令

./oup <provider> products [--refresh]   # 列/刷新产品
./oup <provider> assign <id> --product <p>
./oup <provider> reset <id>             # 重置密码
./oup <provider> delete <id>            # 删除
./oup <provider> alias <name> <product> # 设产品别名
./oup <provider> selftest               # 端到端自检(会建→授→重置→删临时用户)
python3 -m app.api.server                         # 起 HTTP API(路由镜像 CLI)

provider 别名:office365/o365/m365 同义;adobe/ps 同义。

Red Flags

症状原因处理
O365 Insufficient privilegesEntra App 权限未管理员同意Entra → API 权限 → 授予管理员同意
O365 License not availablelicense 池用完购买/回收,不硬删他人
Adobe error.group.license_quota_exceeded座位不够报告用户,不降级
Adobe error.domain.trust.nonexistentfederatedID 但域名未声明改用 adobeID(默认就是)
任一 init 报 missing env.env 缺字段对照 .env.example 补齐

架构(改 provider 行为前先读)

入口(main.py CLI / app/api/server.py Flask) → app/services/user_service.py(统一业务门面) → app/providers/{office365,adobe}/(对接外部 API)。 扩展功能先加到 user_service.py 再让 CLI/API 暴露。详见 README.mddocs/README_ADOBE.mddocs/README_API.md