如何用Python调用SSRS API获取其他用户发布的报表订阅
获取SSRS所有报表订阅的解决方案
1. 权限要求
要获取服务器上所有用户的报表订阅,你使用的认证账号必须拥有SSRS的系统管理员或内容管理员角色权限。默认情况下,/Subscriptions端点仅返回当前用户有权限查看的订阅内容,只有当账号具备上述高权限时,API才会返回全量订阅数据。
2. 优化后的代码实现
以下代码会先遍历服务器上所有报表,再逐个获取每个报表的订阅信息,同时关联报表的名称和路径,最后导出为CSV:
from requests_negotiate_sspi import HttpNegotiateAuth import requests import csv def fetch_all_subscriptions(server_base_url): # 初始化会话和认证 session = requests.Session() session.auth = HttpNegotiateAuth() all_subscriptions = [] # 获取所有目录项(筛选出报表) catalog_endpoint = f"{server_base_url}/reports/api/v2.0/CatalogItems" catalog_resp = session.get(catalog_endpoint) catalog_resp.raise_for_status() catalog_items = catalog_resp.json() # 遍历每个报表,获取对应的订阅 for item in catalog_items: # Type=2 对应SSRS中的报表类型,排除文件夹、数据源等其他类型 if item["Type"] == 2: sub_endpoint = f"{server_base_url}/reports/api/v2.0/CatalogItems/{item['Id']}/Subscriptions" sub_resp = session.get(sub_endpoint) if sub_resp.status_code == 200: subs = sub_resp.json() # 把报表的名称和路径关联到订阅数据中 for sub in subs: sub["报表名称"] = item["Name"] sub["报表路径"] = item["Path"] all_subscriptions.append(sub) session.close() return all_subscriptions # 替换为你的SSRS服务器地址 server_url = "http://<my_server_url>" full_subscription_list = fetch_all_subscriptions(server_url) # 导出到CSV文件 with open("全量报表订阅.csv", "w", newline="", encoding="utf-8") as csv_file: if full_subscription_list: # 自动获取所有字段名 field_names = full_subscription_list[0].keys() writer = csv.DictWriter(csv_file, fieldnames=field_names) writer.writeheader() writer.writerows(full_subscription_list)
3. 注意事项
- 权限校验:如果运行后仍只能获取自己的订阅,联系SSRS管理员确认你的账号已被分配系统管理员或内容管理员角色。
- 分页处理:若报表或订阅数量过大,API会返回分页数据,需解析响应中的
@odata.nextLink字段来循环获取后续页内容。 - 类型筛选:代码中
Type=2用于筛选报表,你可以根据需求调整类型值(如Type=1为文件夹,Type=5为数据源)。
内容的提问来源于stack exchange,提问作者sushi
相关产品推荐
相关产品推荐

