使用TSC获取Tableau Server指定AD组用户返回0结果,求解决方案
问题:用TableauServerClient获取指定AD组成员失败,求解决办法
我需要用TableauServerClient(TSC)包获取Tableau Server站点里3个AD组的所有用户列表。目前写了两段Python代码:第一段能正常获取站点全部用户并导出到Excel;第二段尝试过滤这3个AD组,但返回0个用户。
我们站点用AD组配置权限,接下来要验证这3个组的成员是否有权限访问仪表板用到的数据源,计划把从Tableau Server拿到的用户列表和数据源权限用户列表合并,标记出_merge为left_only的情况,麻烦帮忙解决代码问题。
获取全部用户的可用代码
import tableauserverclient as TSC import pandas as pd tableau_auth = TSC.PersonalAccessTokenAuth('My_Dashboard_Update','access-token-xyz',site_id = 'site-name') server = TSC.Server('https://tableau-site/',use_server_version=True) with server.auth.sign_in(tableau_auth): request_options = TSC.RequestOptions(pagesize=1000) all_users, pagination_item = server.users.get(request_options) print("\n站点共有 {} 个用户: ".format(pagination_item.total_available)) all_users_on_site = pd.DataFrame({'Users': [user.name for user in all_users]}) all_users_on_site.to_excel(r"C:\\Users\TABLEAU_User_ME\Documents\Projects\Tableau_Users.xlsx", index = False)
尝试过滤AD组但返回0用户的代码
import tableauserverclient as TSC import pandas as pd tableau_auth = TSC.PersonalAccessTokenAuth('My_Dashboard_Update','access-token-xyz',site_id = 'site-name') server = TSC.Server('https://tableau-server-site/',use_server_version=True) with server.auth.sign_in(tableau_auth): request_options = TSC.RequestOptions(pagesize=1000) request_options.filter.add(TSC.Filter(TSC.RequestOptions.Field.Name, TSC.RequestOptions.Operator.In, ["AD-Group1","AD-Group2", "AD-Group3"],) ) matching_groups, pagination_item = server.users.get(request_options) print("\n站点共有 {} 个用户: ".format(pagination_item.total_available)) all_users_on_site = pd.DataFrame({'Users': [user.name for user in matching_groups]}) all_users_on_site.to_excel(r"C:\\Users\TABLEAU_User_ME\Documents\Projects\Tableau_Users.xlsx", index = False)
问题原因及修正方案
错误原因
第二段代码的核心问题是:用server.users.get()去过滤组名,但server.users.get()是获取用户对象,过滤的是用户的属性(比如用户名),不是组的属性。要找AD组里的成员,得先找到对应的组,再获取组内的用户。
修正后的代码
import tableauserverclient as TSC import pandas as pd # 配置认证信息 tableau_auth = TSC.PersonalAccessTokenAuth('My_Dashboard_Update','access-token-xyz',site_id = 'site-name') server = TSC.Server('https://tableau-server-site/',use_server_version=True) target_groups = ["AD-Group1","AD-Group2", "AD-Group3"] group_users = set() # 用集合去重,避免用户在多个组重复出现 with server.auth.sign_in(tableau_auth): # 第一步:获取指定的AD组 request_options = TSC.RequestOptions(pagesize=1000) request_options.filter.add(TSC.Filter(TSC.RequestOptions.Field.Name, TSC.RequestOptions.Operator.In, target_groups)) matching_groups, _ = server.groups.get(request_options) # 第二步:遍历每个组,获取组内用户 for group in matching_groups: # 获取组的所有成员 users_in_group, _ = server.groups.get_users(group.id) # 把用户名加入集合 for user in users_in_group: group_users.add(user.name) # 第三步:转换为DataFrame并导出到Excel df_group_users = pd.DataFrame({'Users': list(group_users)}) print(f"\n指定AD组共有 {len(group_users)} 个用户") df_group_users.to_excel(r"C:\\Users\TABLEAU_User_ME\Documents\Projects\AD_Group_Users.xlsx", index=False) # 第四步:与数据源权限用户列表合并(假设数据源权限列表已读入为df_data_source_users,列名为'Users') # 示例:读取数据源权限列表 # df_data_source_users = pd.read_excel("数据源权限用户列表.xlsx") # 合并并标记差异 # merged_df = pd.merge(df_group_users, df_data_source_users, on='Users', how='left', indicator=True) # 筛选出left_only的用户(即AD组有但数据源无权限的) # no_access_users = merged_df[merged_df['_merge'] == 'left_only'] # no_access_users.to_excel("无数据源权限的AD组用户.xlsx", index=False)
代码说明
- 获取指定组:用
server.groups.get()配合过滤条件,拿到目标AD组的对象 - 遍历组获取成员:调用
server.groups.get_users(group.id)获取每个组的所有用户 - 去重处理:用集合存储用户名,避免同一用户在多个组里被重复统计
- 合并数据源权限列表:注释部分给出了合并逻辑,读取数据源权限列表后,用
pd.merge的left连接,筛选_merge为left_only的行就是AD组有但数据源无权限的用户
内容的提问来源于stack exchange,提问作者MintyLemonade
相关产品推荐
相关产品推荐

