我正在开发一个 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;
使用表格,您可以在服务器级别拥有管理员。在数据库级别,您只有 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。
下面的 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