如何编写脚本批量移除GitHub Enterprise中的非活跃用户?
批量移除GitHub Enterprise休眠/非活跃用户的方案
GitHub Enterprise支持通过API批量移除休眠用户,结合脚本可以高效完成从企业及下属所有组织中清理用户的操作,具体步骤如下:
前置准备
- 生成企业管理员权限的个人访问令牌(PAT),需勾选权限:
admin:enterprise、admin:org - 导出休眠用户CSV报告,提取其中的用户
login(用户名)字段
核心API说明
- 从企业移除用户:调用
DELETE /enterprises/{enterprise}/users/{username}接口,成功返回状态码204,用户不存在则返回404 - 从组织移除用户:调用
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
相关产品推荐
相关产品推荐

