如何检查 windows 用户是否可以通过模拟访问(Windows 集成安全身份验证)SQL 服务器分析服务 (SSAS) 服务器

How to check if a windows user has access (Windows Integrated Security authentication) to SQL Server Analysis Services (SSAS) Server via impersonation

对于 SQL 服务器实例,要检查 windows 用户是否存在并具有任何访问权限,可以尝试各种方法,详见 here

我正在为 SQL 服务器分析服务 (SSAS) 服务器寻找类似的东西。

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

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

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

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

现在,这里的问题是连接字符串隐式使用了我 运行 客户端应用程序连接到 SSAS 服务器的用户的 AD 帐户。我认为不可能在 ADOMD.Net connection strings while using Windows Integrated authentication. Even connection strings of SQL Server don't allow mentioning the windows username and password explicitly in the connection string as mentioned here.

中明确提及 windows AD 帐户用户名和密码

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

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

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

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

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");
          }                    

希望这对你有用。

Hmphh...真正能够通过 ADOMD.Net.

核心方法:核心理念是与 SSAS 服务器的连接仅支持 Windows 基于集成安全的身份验证。 SSAS 不支持 SQL 身份验证,就像我们为 SQL 服务器中的 sa 用户所做的那样。

因此,基本想法是尝试使用基于 Windows 集成安全性的身份验证连接到 SSAS 服务器,并在我们尝试检查的用户的上下文中触发 MDX 查询。如果查询成功执行,则用户可以访问。如果查询执行 returns 和 error/exception 那么用户没有访问权限。

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

对于 ADOMD.Net 直到 v12.x:

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

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 时,使用上下文菜单中的 "Run as different user" 选项。放置用户 Y(比方说)的凭据,以便应用程序在用户 Y 的上下文中启动,我们需要为此验证 SSAS 服务器上的访问权限。 ADOMD.Net 将在使用 Windows SSAS 服务器的集成安全性连接时使用用户 Y 的身份。如果代码成功,则用户可以访问。
  2. In-Proc Impersonation:另一种情况可能是您运行以用户 X 的身份运行应用程序,但您想测试用户 Y 的访问权限。在 运行 上面的代码中,您实际上需要就地模拟。为了实现它,我使用了著名的 NuGet 包 "Simple Impersonation" which uses the default .Net library classes WindowsImpersonationContext and WindowsIdentity . Creator of this NuGet package had first posted a great answer here.

在 SQL Server Profiler 中的观察:模拟用户 Y 后,您会清楚地看到 MDX 查询在用户 Y 如果您捕获会话,如下所示:

注意事项和疑虑

  1. 我在使用过程中模拟时遇到的一个问题是,如果 SSAS 服务器位于应用程序代码为 运行ning 的同一台机器上,它就无法工作。这是由于原生 LogonUser API(使用 LOGON32_LOGON_NEW_CREDENTIALS LogonType)的固有行为,它在 NuGete 包的模拟调用期间被调用。您可以尝试其他登录类型,详细说明 here 您需要哪些套件。
  2. 您需要用户密码以及域名和用户名才能进行模拟。

ADOMD.Netv13.x以后

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

  1. C:\Program Files\Microsoft.NET\ADOMD.NET0\Microsoft.AnalysisServices.AdomdClient.dll 我不确定是谁将此文件转储到此位置。它是 Microsoft.Net 扩展或 SQL 服务器安装的一部分。
  2. 在 Microsoft SQL 服务器的安装文件夹中。我在路径 - C:\Program Files\Microsoft SQL Server0\Setup Bootstrap\Update Cache\KB3182545\ServicePack\x64\Microsoft.AnalysisServices.AdomdClient.dll
  3. NuGet 包 here. For some weird reason best known to MS the NuGet package of v13.x of ADOMD.Net has been named Unofficial.Microsoft.AnalysisServices.AdomdClient. Not sure why they introduced a separate NuGet package with Unofficial prefix when this should have been simply the next version of the already existing NuGet package Microsoft.AnalysisServices.AdomdClient present here.

因此 AdomdConnection 类的最新版本中出现的新 API ChangeEffectiveUser 可以很容易地用来模拟任何用户,如下所示:

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 中有一个奇怪的观察结果是查询的日志仍然被触发显示与你的申请流程为运行ning.

的原用户名

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

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

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

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

  1. 更改连接字符串以不涉及任何数据库。删除 Catalog 键,如下连接字符串 - "provider=olap;datasource={ssasServerName};"
  2. 触发以下查询来检查访问权限 - SELECT * FROM $System.discover_locks 在最初显示在 post.
  3. 的代码片段中