3

对于 SQL Server 实例,要检查 Windows 用户是否存在并且是否具有任何访问权限,可以尝试此处详述的各种方法。

我正在为 SQL Server Analysis Services (SSAS) 服务器寻找类似的东西。

我从右键单击上下文菜单进入 SSAS 服务器的属性,在安全选项卡上我可以看到已经配置了几个 Windows 用户:

在此处输入图像描述

有什么方法可以通过某种测试连接从客户端应用程序(用 C# 编写)进行检查,或者 SSAS 是否还维护自己的一些元数据数据库,master例如可以查询的 SQL Server 实例(数据库引擎)中的数据库。我检查了DatabasesSSAS 服务器中的节点,但在那里看不到任何默认数据库:

在此处输入图像描述

在我正在处理的客户端应用程序中,我输入了 Windows 用户名和密码。在我的客户端应用程序中有一个带有两个文本框的简单 winform,用于获取需要连接到 SSAS 服务器的 AD 用户名和密码。我的直觉是密码在这里无关紧要,因为 SSAS 仅支持Windows集成身份验证模式。我的客户端应用程序将在一个已经可以访问我尝试连接的 SSAS 服务器的帐户下运行。

更新:从@Vaishali 获得帮助后,我发现可以使用ADOMD.Net与 SSAS 服务器建立测试连接。

现在,这里的问题是连接字符串隐式使用我运行客户端应用程序的用户的 AD 帐户连接到 SSAS 服务器。我认为在使用 Windows 集成身份验证时,不可能在 ADOMD.Net连接字符串中明确提及 Windows AD 帐户用户名和密码。甚至 SQL Server 的连接字符串也不允许在此处提到的连接字符串中显式提及 windows 用户名和密码。

更新 2:我从我的一位朋友那里得到线索,可以在 SSAS 上触发一些 MDX 查询以获取用户访问详细信息。

更新 3: SSAS 服务器仅支持 Windows 集成安全模式的身份验证,这与 SQL Server 数据库引擎不同,后者还支持基于用户名密码的 SQL 身份验证。因此,需要某种形式的模拟来代表其他用户触发 MDX 查询,我试图仅通过 Windows 集成安全性检查 SSAS 服务器上的访问权限。

4

2 回答 2

1

嗯……真正能够通过 ADOMD.Net 完成它是一段相当长的旅程。

核心方法:核心理念是与 SSAS 服务器的连接仅支持基于 Windows 集成安全的身份验证。saSSAS 不支持我们在 SQL Server 中为用户执行的 SQL 身份验证。

因此,基本想法是尝试使用基于 Windows 集成安全的身份验证连接到 SSAS 服务器,并在我们尝试检查的用户的上下文中触发 MDX 查询。如果查询成功执行,则用户有权访问。如果查询执行返回错误/异常,则用户无权访问。

请注意,由于此处描述的原因,仅仅能够打开到 SSAS 服务器的连接并不是用户访问的指标。您必须触发查询以检查访问权限。

对于 ADOMD.Net,直到 v12.x:

现在,我们知道基于 Windows 集成安全性的身份验证总是从应用程序/进程正在运行的用户上下文中获取用户详细信息。您不能在 ADOMD.Net 连接的连接字符串中传递用户凭据。这是我为完成它而编写的代码。您需要Microsoft.AnalysisServices.AdomdClient.dll在您的 C# 项目中引用。

using Microsoft.AnalysisServices.AdomdClient;
public static int IsSsasAccessibleToUser(string ssasServerName)
{
    var hasAccess = 0;
    try
    {
        using (var adomdConnection = new AdomdConnection($"provider=olap;datasource={ssasServerName};Catalog=myDatabaseName"))
        using (var adomdCommand = new AdomdCommand())
        {
            adomdCommand.CommandText = "SELECT [CATALOG_NAME] AS [DATABASE],CUBE_CAPTION AS [CUBE/PERSPECTIVE],BASE_CUBE_NAME FROM $system.MDSchema_Cubes WHERE CUBE_SOURCE = 1";
            adomdCommand.Connection = adomdConnection;
            adomdConnection.Open();
            adomdCommand.ExecuteNonQuery();
            Log("ExecuteNonQuery call succeeded so the user has access");
            hasAccess = 1;
        }
    }
    catch (Exception ex)
    {
        Log("There was an error firing query on the database in SSAS server. so user doesn't have access");
    }
    return hasAccess;
}

现在,为了利用基于 Windows 集成安全的身份验证,我们可以通过两种方式运行此代码:

  1. Out-Proc Impersonation:将此代码放入控制台应用程序中。当我们右键单击 exe 时,使用上下文菜单中的“以不同用户身份运行”选项。放置用户 Y(比方说)的凭据,以便应用程序在用户 Y 的上下文中启动,我们需要验证 SSAS 服务器上的访问权限。ADOMD.Net 将在使用 Windows Integrated Security for SSAS 服务器连接时使用用户 Y 的身份。如果代码成功,则用户可以访问。
  2. In-Proc Impersonation:另一种情况可能是您以用户 X 的身份运行应用程序,但您想测试用户 Y 的访问权限。在这里,您实际上需要在运行上述代码时进行就地模拟。为了实现它,我使用了一个著名的 NuGet 包“Simple Impersonation”,它使用默认的 .Net 库类WindowsImpersonationContextWindowsIdentity. 这个 NuGet 包的创建者首先在这里发布了一个很好的答案。

SQL Server Profiler 中的观察:模拟 user 后,如果您捕获会话Y,您将清楚地看到 MDX 查询在 user 的上下文中被触发,Y如下所示:

在此处输入图像描述

警告和担忧

  1. 我在使用这种进程内模拟时遇到的一个问题是,如果 SSAS 服务器位于运行应用程序代码的同一台机器上,它就不起作用。这是由于LogonUser在 NuGete 包的模拟调用期间调用的本机 API(使用 LOGON32_LOGON_NEW_CREDENTIALS LogonType)的固有行为。您可以尝试此处详述的其他登录类型,您需要哪些套件。
  2. 您需要用户的密码以及域名和用户名来进行模拟。

对于 ADOMD.Net v13.x 及更高版本

然后,我在这里ChangeEffectiveUser的 MSDN 上看到了这个 API 文档。但是,智能感知没有显示这个 API。然后我发现这个 API 是在 SQL Server 2016 版本中添加到 ADOMD.Net 中的。有多种方法可以获取最新版本:

  1. C:\Program Files\Microsoft.NET\ADOMD.NET\130\Microsoft.AnalysisServices.AdomdClient.dll 我不确定是谁在这个位置转储了这个文件。它是 Microsoft.Net 扩展或 SQL Server 安装的一部分。
  2. 在 Microsoft SQL Server 的安装文件夹中。我在路径上得到它 -C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\Update Cache\KB3182545\ServicePack\x64\Microsoft.AnalysisServices.AdomdClient.dll
  3. NuGet 包在这里。由于某些奇怪的原因,MS 最熟悉的 ADOMD.Net v13.x 的 NuGet 包被命名为Unofficial.Microsoft.AnalysisServices.AdomdClient. 不知道为什么他们引入了一个单独的带有前缀的 NuGet 包,而这应该只是此处Unofficial现有 NuGet 包的下一个Microsoft.AnalysisServices.AdomdClient版本。

ChangeEffectiveUser因此,clas上最新版本中的新 APIAdomdConnection可以很容易地模拟任何用户,如下所示:

adomdConnection.Open();
//impersonate the user after opening the connection
adomdConnection.ChangeEffectiveUser("domainName\UserNameBeingImpersonated");
//now the query gets fired in the context of the impersonated user
adomdCommand.ExecuteNonQuery();

观察 SQL Server Profiler 中的模拟:尽管我在 SQL Server Profiler 中观察到的一个特殊现象是,被触发的查询日志仍然显示运行应用程序进程的原始用户的名称。

在此处输入图像描述

因此,为了检查是否发生了模拟,我domainName\UserNameBeingImpersonated从 SSAS 服务器中删除了用户的访问权限。之后,当我再次运行上述代码时,它导致异常,其消息清楚地指出 - the user domainName\UserNameBeingImpersonated doesn't have permission on the SSAS server or the database doesn't exist。此错误消息清楚地表明模拟正在起作用。

这种方法的优点和向后兼容性

  1. 虽然 API 是最近才出现的,因为它是在 SQL Server 2016 中提出的,但我也能够成功地将它与 SSAS 服务器 2014 一起使用。所以它看起来相当向后兼容。
  2. 无论您的 SSAS 服务器是本地还是远程,此 API 都有效。
  3. 您只需要域名和用户名即可进行模拟。无需密码。

如果我们只是想检查 SSAS 服务器上的访问而不涉及 SSAS 服务器上存在的任何数据库,该怎么办?

  1. 将连接字符串更改为不涉及任何数据库。删除Catalog以下连接字符串的键 - “provider=olap;datasource={ssasServerName};”
  2. 改为触发以下查询以检查访问权限 -SELECT * FROM $System.discover_locks在帖子最初显示的代码片段中。
于 2017-07-08T02:07:36.293 回答
0

如果您想检查用户是否可以访问 SSAS 服务器,您可以尝试使用 C# 的一个选项是:尝试使用给定的用户凭据连接 SSAS,如果成功,则可以访问。

如果您正在寻找映射到单个多维数据集数据库的角色和安全性,以下链接将很有用。

http://www.lucasnotes.com/2012/09/list-ssas-user-roles-using-powershell.html#comment-form

C# 代码行:

导入库 Microsoft.AnalysisServices.AdomdClient;和代码行将是:

      DataSet ds = new DataSet();
          AdomdConnection myconnect = new AdomdConnection(@"provider=olap;datasource=.\SQL20f12");
          AdomdDataAdapter mycommand = new AdomdDataAdapter();
          mycommand.SelectCommand = new AdomdCommand();
          mycommand.SelectCommand.Connection = myconnect;

          try
          {
              myconnect.Open(); 
          }
          catch 
          { 
              MessageBox.Show("error in connection");
          }                    

希望这对你有用。

于 2017-06-30T09:54:32.073 回答