乐于分享
好东西不私藏

�� OpenClaw 之M365 虚拟管理员(二)

�� OpenClaw 之M365 虚拟管理员(二)

M365资源核心监控

Graph API + Openclaw Cron 巡检,把重复运维工作全部交给”虚拟管理员”

📋 目录

    中国区M365 Graph API实测

    许可证管理自动化

    用户状态监控

    邮件系统健康检查

    SharePoint / OneDrive 存储分析

    本章小结

    在 M365 租户管理中,许可证浪费、风险账户潜伏、存储容量告急——这些问题几乎每个管理员都会遇到。 本文基于世纪互联版 Microsoft Graph API,展示如何用 Graph API + OpenClaw Cron 构建一个全天候运转的”虚拟管理员”, 将传统人工运维效率提升 30~500 倍,错误率从 8-12% 降至接近 0%。所有代码开箱即用。

    世纪互联版M365 Graph API 实测

    ⚠️ 关键发现:中国区 M365 必须使用特定的端点和认证方式,和全球版完全不同!认证地址:https://login.partner.microsoftonline.cn/{tenant}/oauth2/v2.0/token

    Graph 端点:https://graph.chinacloudapi.cn/beta特别注意:v1.0 版本有分页限制,强烈建议使用beta 版本。

    🚫 为什么不推荐 Portal API?Portal API(portal.partner.microsoftonline.cn)看似支持 180 天数据,实测有以下根本性限制:1. 需要完整用户会话— Bearer Token(app-only)返回 200 但返回 HTML “There was a problem processing your request”,说明需要 Delegated User Session,应用程序权限无法访问。2. Cookie 认证返回 440 Login Timeout— 即使持有所有 ESTS cookies 和 Portal session cookies,也需要真正在浏览器登录的账号才能通过认证。结论:优先使用 Graph API Beta——已验证支持 D180、实现简单、权限清晰。相关内容见:第一章 许可证管理自动化及以后各章节。

    经过实测,以下是由世纪互联运营的租户可用的核心Graph API:

    API 端点
    说明
    实测
    /beta/subscribedSkus
    许可证订阅详情
    ✅ 可用
    /beta/users
    用户账户状态
    ✅ 可用
    /beta/auditLogs/signIns
    登录日志(含失败溯源)
    ✅ 可用
    /beta/devices
    设备列表
    ✅ 可用
    /beta/reports/getMailboxUsageStorage
    邮箱存储趋势
    ✅ 可用
    /beta/reports/getEmailAppUsageUserDetail
    邮件客户端(含 POP3/SMTP/IMAP4)
    ✅ 可用
    /beta/reports/getSharePointSiteUsageDetail
    SharePoint 站点存储详情
    ✅ 可用
    /beta/reports/getTeamsUserActivityUserDetail
    Teams 用户活动明细
    ✅ 可用
    /beta/reports/getOffice365GroupsActivityDetail
    O365 Groups 活动明细
    ✅ 可用
    /beta/reports/getOffice365ActivationsUserDetail
    Office 应用激活明细
    ✅ 可用
    /beta/reports/getM365AppUserDetail
    M365 各应用使用明细
    ✅ 可用
    /beta/auditLogs/directoryAudits
    目录审计日志
    ✅ 可用
    /beta/identityProtection/*
    风险用户(需额外权限)
    ✅ 可用
    1️⃣ 许可证管理自动化
    📡 技术核心

    Graph API 的/subscribedSkus端点返回租户所有许可证订阅详情,是成本控制和容量规划的核心数据源。

    # 获取 Token(client_credentials 应用程序权限)import requests  GRAPH_ENDPOINT = "https://graph.chinacloudapi.cn/beta"TENANT_ID = "YOUR_TENANT_ID"CLIENT_ID = "THE APP YOU REGISTER"CLIENT_SECRET = "SECRET YOU GRNERATED FROM ENTRA AD"# Step 1: 获取访问令牌(世纪互联运营版)token_url = f"https://login.partner.microsoftonline.cn/{TENANT_ID}/oauth2/v2.0/token"data = {"grant_type""client_credentials",                "client_id": CLIENT_ID,                "client_secret": CLIENT_SECRET,                "scope""https://microsoftgraph.chinacloudapi.cn/.default"resp = requests.post(token_url, data=data) token = resp.json()["access_token"headers = {"Authorization": f"Bearer {token}"}# Step 2: 查询所有许可证 SKU(beta 版本)resp = requests.get(f"{GRAPH_ENDPOINT}/subscribedSkus", headers=headers) skus = resp.json()["value"]for sku in skus:         total = sku["prepaidUnits"]["enabled"]    consumed = sku.get("consumedUnits", 0)         available = total - consumed         pct = available / total * 100 if total > 0 else 0    print(f"{sku['skuPartNumber']}: {available}/{total} 可用 ({pct:.1f}%)")
    字段
    含义
    监控价值
    skuPartNumber
    SKU 名称(如 ENTERPRISEPACK)
    识别许可证类型
    prepaidUnits.enabled
    已购买总量
    容量上限
    consumedUnits
    已分配数量
    使用率计算
    prepaidUnits.suspended
    被暂停数量
    异常检测
    🤖 效率对比
    👤 人工操作

    • 登录 Azure 门户 → AAD → 许可证

    • 手动记录每个 SKU 数量

    • 凭感觉判断是否需要采购

    • 每月检查 1 次(太费时)
    🤖 OpenClaw 虚拟管理员

    • API 自动拉取实时数据

    • 按阈值自动判断告警

    • 生成可视化 HTML 报告

    • 每小时检查一次(可配置)
    30-60x
    效率提升
    0%
    机器错误率
    8-12%
    人工错误率
    🚨 告警阈值设计
    级别
    条件
    通知方式
    P0
    可用许可证 = 0
    立即邮件 + 即时通讯
    P1
    可用 < 10%
    邮件(24h 内)
    P2
    可用 < 20%
    日报汇总
    
    
    # OpenClaw Cron 配置示例{    "name""M365 许可证健康度巡检",    "schedule": {"kind""cron""expr""0 */4 * * *""tz""Asia/Shanghai"},    "payload": {"kind""agentTurn",    "message""执行许可证检查,发现 P0/P1 立即告警,日报发 bc_sop@outlook.com"}
    2️⃣ 用户状态监控
    📡 技术核心

    通过/users端点结合accountEnabledassignedLicenses等字段,构建全面的账户健康度视图,自动发现浪费许可证的”幽灵账户”。

    
    
    def find_risky_accounts(token):         headers = {"Authorization": f"Bearer {token}"}         params = {"$top"999,                            "$select""id,displayName,userPrincipalName,assignedLicenses,accountEnabled"}         resp = requests.get(f"{GRAPH_ENDPOINT}/users", headers=headers, params=params)         users = resp.json().get("value", [])        disabled_with_licenses, active_without_license = [], []        for u in users:        has_license = bool(u.get("assignedLicenses"))          is_active = u.get("accountEnabled")                if not is_active and has_license:            disabled_with_licenses.append(u)  # 白占许可证        elif is_active and not has_license:            active_without_license.append(u)  # 无证可用的活跃账户    return {"wasted": disabled_with_licenses, "unlicensed": active_without_license}
    👤 人工操作

    • 随机抽查或出事才检查

    • 依赖用户报障才能发现

    • 千人规模巡检需 3-5 人日

    • 人主观判断,标准不一
    🤖 OpenClaw 虚拟管理员

    • 每日全量自动扫描

    • 异常账户自动标记告警

    • 千人规模巡检约 2 分钟

    • 标准化判断,无主观差异
    ~500x
    效率提升
    100%
    机器发现率
    ~30%
    人工发现率
    💡关键洞察:已禁用但未释放许可证的问题,在人工管理下平均存在2-4 周才会被发现。   虚拟管理员可将这个时间缩短至4 小时,直接节省每一张被遗忘的许可证费用。
    3️⃣ 邮件系统健康检查
    📡 技术核心

    通过 Graph API 查询邮件服务的运行状态,包括邮箱使用趋势和邮件客户端分布(POP3/SMTP/IMAP4)。

    def check_mail_health (token, period="D7"):         headers = {"Authorization"f"Bearer {token}"}        # 邮箱使用统计(每日邮箱总数/活跃邮箱)    resp = requests.get( f"{GRAPH_ENDPOINT}/reports/getMailboxUsageMailboxCounts(period='{period}')?$format=application/json", headers=headers)    # 邮件客户端使用明细(含 POP3/SMTP/IMAP4)    resp2 = requests.get( f"{GRAPH_ENDPOINT}/reports/getEmailAppUsageUserDetail(period='{period}')?$format=application/json", headers=headers)        return {                "mailbox_counts": resp.json(),                "email_app_detail": resp2.json()         }
    🤖 效率对比
    👤 人工操作

    • 登录 Exchange 管理后台逐项查看

    • 手动汇总各维度数据

    • 无法发现隐蔽的安全威胁
    🤖 OpenClaw 虚拟管理员

    • 自动聚合多维度健康数据

    • 异常模式自动识别

    • 安全威胁及时告警
    4️⃣ SharePoint / OneDrive 存储分析
    📡 技术核心

    通过 Graph API 查询 SharePoint 和 OneDrive 的存储使用情况,帮助合理规划存储资源。

    
    
    def get_storage_usage(token, period="D7"):         headers = {"Authorization": f"Bearer {token}"}        # SharePoint 站点使用明细(beta 版本)    resp = requests.get( f"{GRAPH_ENDPOINT}/reports/getSharePointSiteUsageDetail(period='{period}')?$format=application/json",   headers=headers)         sites = resp.json().get("value", [])         report = []        for site in sites:                 quota = site.get("storageUsedInBytes"0)                used = site.get("storageUsedInBytes"0)                # 注:站点明细返回的是 storageUsedInBytes,需结合配额计算        if quota > 0:                         usage_pct = used / quota * 100            report.append({ "site": site.get("siteUrl""N/A"),                                      "used_gb": used / (1024**3),                                            "usage_pct": usage_pct,                                            "status""P0" if usage_pct > 90                                       else "P1" if usage_pct > 70                                       else "正常"            })        return report
    🚨 存储告警阈值建议
    存储使用率
    级别
    建议行动
    > 90%
    P0
    立即清理或扩容
    70-90%
    P1
    计划扩容
    50-70%
    P2
    关注趋势
    🤖 效率对比
    👤 人工操作

    • 手动登录 SharePoint 管理中心

    • 逐个网站查看存储使用

    • 易遗漏,使用率不透明
    🤖 OpenClaw 虚拟管理员

    • API 统一拉取,一目了然

    • 自动识别高使用率网站

    • 生成存储优化建议报告
    📌 本章小结
    ✅ 许可证管理自动化 — Graph API + 阈值告警 + Cron 巡检
    • ✅ 用户状态监控 — 风险账户自动检测,发现率从 30% 提升至 100%
    • 邮件系统健康检查 — 多维度安全数据聚合
    • ✅ SharePoint/OneDrive 存储分析 — 容量规划与预警

    基于 Microsoft Graph API Beta(世纪互联版) · OpenClaw 驱动原创内容 · 欢迎转发