You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写脚本批量移除GitHub Enterprise中的非活跃用户?

批量移除GitHub Enterprise休眠/非活跃用户的方案

GitHub Enterprise支持通过API批量移除休眠用户,结合脚本可以高效完成从企业及下属所有组织中清理用户的操作,具体步骤如下:

前置准备

  • 生成企业管理员权限的个人访问令牌(PAT),需勾选权限:admin:enterprise、admin:org
  • 导出休眠用户CSV报告,提取其中的用户login(用户名)字段

核心API说明

  1. 从企业移除用户:调用DELETE /enterprises/{enterprise}/users/{username}接口,成功返回状态码204,用户不存在则返回404
  2. 从组织移除用户:调用DELETE /orgs/{org}/members/{username}接口,逻辑同上;需先遍历企业下的所有组织,再逐个移除目标用户

示例Python脚本

以下脚本可直接复用,需替换配置中的占位符:

import csv
import requests
import time

# 配置项,请根据实际环境修改
ENTERPRISE_SLUG = "你的企业标识"
GHE_DOMAIN = "你的GitHub Enterprise域名(如ghe.example.com)"
PAT = "你的管理员权限PAT"
CSV_FILE_PATH = "休眠用户列表.csv"
# 避免触发速率限制,添加延迟(单位:秒)
RATE_LIMIT_DELAY = 1

headers = {"Authorization": f"token {PAT}"}

# 从CSV读取休眠用户列表
def load_inactive_users(csv_path):
    users = []
    with open(csv_path, newline="", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        # 假设CSV中用户名字段为"login",请根据实际报告调整
        for row in reader:
            users.append(row["login"].strip())
    return users

# 获取企业下属所有组织
def get_all_enterprise_orgs(enterprise_slug):
    orgs = []
    page = 1
    while True:
        url = f"https://{GHE_DOMAIN}/api/v3/enterprises/{enterprise_slug}/orgs?page={page}&per_page=100"
        resp = requests.get(url, headers=headers)
        resp.raise_for_status()
        current_page_orgs = resp.json()
        if not current_page_orgs:
            break
        orgs.extend([org["login"] for org in current_page_orgs])
        page += 1
        time.sleep(RATE_LIMIT_DELAY)
    return orgs

# 从企业及所有组织移除单个用户
def remove_user(user_login, enterprise_slug, org_list):
    # 先从企业移除
    enterprise_remove_url = f"https://{GHE_DOMAIN}/api/v3/enterprises/{enterprise_slug}/users/{user_login}"
    resp = requests.delete(enterprise_remove_url, headers=headers)
    if resp.status_code == 204:
        print(f"✅ 已从企业移除用户: {user_login}")
    elif resp.status_code == 404:
        print(f"ℹ️ 用户 {user_login} 不在企业中,跳过企业移除步骤")
    else:
        print(f"❌ 移除用户 {user_login} 从企业时出错: {resp.text}")
        return

    # 遍历所有组织移除用户
    for org in org_list:
        org_remove_url = f"https://{GHE_DOMAIN}/api/v3/orgs/{org}/members/{user_login}"
        resp = requests.delete(org_remove_url, headers=headers)
        if resp.status_code == 204:
            print(f"  ✅ 已从组织 {org} 移除用户: {user_login}")
        elif resp.status_code == 404:
            print(f"  ℹ️ 用户 {user_login} 不在组织 {org} 中,跳过")
        else:
            print(f"  ❌ 移除用户 {user_login} 从组织 {org} 时出错: {resp.text}")
        time.sleep(RATE_LIMIT_DELAY)

if __name__ == "__main__":
    print("=== 开始批量移除休眠用户 ===")
    inactive_users = load_inactive_users(CSV_FILE_PATH)
    enterprise_orgs = get_all_enterprise_orgs(ENTERPRISE_SLUG)
    
    for user in inactive_users:
        print(f"\n--- 处理用户: {user} ---")
        try:
            remove_user(user, ENTERPRISE_SLUG, enterprise_orgs)
        except Exception as e:
            print(f"❌ 处理用户 {user} 时发生异常: {str(e)}")
    print("\n=== 批量移除操作完成 ===")

注意事项

  • 测试阶段优先用1-2个用户验证脚本逻辑,避免误删
  • 确保PAT权限足够且妥善保管,不要泄露给无关人员
  • 若用户拥有仓库所有权,需先转移所有权再执行移除操作,否则API会返回错误
  • 可根据GHE的速率限制调整RATE_LIMIT_DELAY参数,避免触发限流

内容的提问来源于stack exchange,提问作者Maxime Lem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:37:40