C# amo 完成角色

问题描述 投票:0回答:2

我正在开发一个 SSAS 项目,其中除其他事项外,我需要使用 C# 获取表格多维数据集的完整用户列表。 目前我让它以这样的方式工作,我可以获得角色,但数据不完整。当我调用 Server.Database.Roles(为了便于阅读而简化)属性并枚举它时,我只获得 ID、Name 和 CreatedTimeStamp。我缺少的至关重要的是成员、CellPermissions(DAX 过滤器)以及这些成员的权限。 我当前正在 Server.Database.Cube 中查找权限(读/写/管理员),但 CubePermissions 为空...

在 SSMS 中,当我编写我的测试角色之一时,该角色包含:

<ID>Role</ID>
        <Name>TestRole</Name>
        <Description>role for testing</Description>
        <Members>
            <Member>
                <Name>THORVALDDATA\rj</Name>
                <Sid>OMITTED</Sid>
            </Member>
            <Member>
                <Name>THORVALDDATA\dp</Name>
                <Sid>OMITTED</Sid>
            </Member>
            <Member>
                <Name>THORVALDDATA\jtl</Name>
                <Sid>OMITTED</Sid>
            </Member>
        </Members>

但是正如前面所说,当我在代码中枚举它时,我没有得到成员和描述。

各位聪明人能帮我弄清楚这里出了什么问题吗?

我所有的代码:

        RoleCollection roleCollection = _analysisServer.Databases[dbID].Roles;

        Database database = _analysisServer.Databases[dbID];

        Dictionary<string, CubeRole> roles = new Dictionary<string, CubeRole>();
        foreach (Role role in roleCollection)
        {
            CubeRole cRole = new CubeRole();
            cRole.ID = role.ID;
            cRole.Name = role.Name;

            cRole.Members = role.Members;
            CubeCollection cubeCollection = _analysisServer.Databases[dbID].Cubes;

            foreach (Cube cube in cubeCollection)
            {
                foreach (CubePermission cubePermission in cube.CubePermissions)
                {
                    cRole.Filters = cubePermission.CellPermissions;
                    cRole.Permission.Add(cubePermission);
                }
            }
            roles.Add(cRole.Name, cRole);
        }
        return roles;
c# ssas roles
2个回答
0
投票

使用表格,您可以在服务器级别拥有管理员。在数据库级别,您只有 3 个内置权限:1) 完全控制 2) 处理数据库 & 3) 读取。您在数据库中创建的每个角色都可以选择这些权限。表格中没有多维数据集,因此只有 2 个级别:服务器和数据库。 MSDN 是了解表格中的权限和角色的良好起点 https://msdn.microsoft.com/en-us/library/hh213165.aspx

您可以循环访问数据库的角色,以提取每个角色中的角色成员以及与每个角色关联的权限:

   //loop through database permissions
   foreach (AMO.DatabasePermission dbp in Analysisdb.DatabasePermissions)
          {
           Console.Write(dbp.Role.Name); //role name
           Console.Write(dbp.Read); // Is read role?
           Console.Write(dbp.Process); // Is process role?
           Console.Write(dbp.Administer); // Is Full control role?
          //loop through database permissions role members
          foreach (AMO.RoleMember rolemember in dbp.Role.Members)
              { 
              Console.Write(rolemember.Name); 
               }
          }

可以通过循环遍历每个角色的每个维度来提取每个维度的 DAX 表达式。下面的示例将获取 codeplex AdventureWorks 示例模型中用户角色的货币维度的 DAX 表达式:

     using (AMO.DimensionPermission dimensionPermission = AnalysisDb.Dimensions.GetByName("Currency").DimensionPermissions[0]);
Console.Write(dimensionPermission.AllowedRowsExpression);

有关表格 AMO 的更多信息,请参阅 http://tabularamo2012.codeplex.com/SourceControl/latest#AMO2TabularV2/AMO2Tabular.RlsFunctions.cs


0
投票

下面的 C# 脚本循环遍历表格模型、每个模型中的角色以及每个角色中的成员。它需要安装来自 Microsoft 的 AMO 库,可通过以下链接访问:https://learn.microsoft.com/en-us/analysis-services/client-libraries?view=asallproducts-allversions 安装后,需要添加对已安装库的引用。

using System;
using Microsoft.AnalysisServices.Tabular;
using Microsoft.AnalysisServices;

namespace ListTabularModels
{
    class Program
    {
        static void Main(string[] args)
        {
            // Replace with your server name
            string serverName = "localhost";

            // Connect to the Analysis Services server
            Server server = new Server();
        try
        {
            server.Connect($"Provider=MSOLAP;Data Source={serverName};");

            Console.WriteLine("Listing all deployed tabular models:");

            // Iterate through each database (model) on the server
            foreach (Database database in server.Databases)
            {
                Console.WriteLine($"Database ID: {database.ID}, Name: {database.Name}");

                // Listing tables in each model
                Console.WriteLine("Tables:");
                foreach (Table table in database.Model.Tables)
                {
                    Console.WriteLine($"- Table: {table.Name}");
                }

                // List roles and their members
                Console.WriteLine("Roles and Role Members:");
                foreach (ModelRole role in database.Model.Roles)
                {
                    Console.WriteLine($"Role: {role.Name}");
                    foreach (ModelRoleMember member in role.Members)
                    {
                        Console.WriteLine($"- Member: {member.Name}");
                    }
                }

                Console.WriteLine("---------------------------");
            }
        }
        finally
        {
            if (server.Connected)
            {
                // Disconnect from the server
                server.Disconnect();
            }
            Console.WriteLine("Finished listing all tabular models.");
            Console.ReadLine();
        }
    }
}
}

权限通常不是直接授予用户,而是通过 Active Directory 组授予,可以通过 C# ADSI(Active Directory 服务接口)获取每个组的用户列表 https://www.c-sharpcorner.com/UploadFile/puranindia/working-with-directory-services-in-C-Sharp/ 或通过 PowerShell 命令 let Get-ADGroupMember

© www.soinside.com 2019 - 2024. All rights reserved.