Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查windows用户是否可以通过模拟访问SQL Server Analysis Services(SSAS)服务器(windows集成安全身份验证)_C#_Sql Server_Ssas_Impersonation_Adomd.net - Fatal编程技术网

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

C# 如何检查windows用户是否可以通过模拟访问SQL Server Analysis Services(SSAS)服务器(windows集成安全身份验证),c#,sql-server,ssas,impersonation,adomd.net,C#,Sql Server,Ssas,Impersonation,Adomd.net,对于SQL Server实例,要检查windows用户是否存在并且是否具有任何访问权限,可以尝试各种详细方法 我正在为SQLServerAnalysisServices(SSAS)服务器寻找类似的东西 我从右键单击上下文菜单进入了SSAS服务器的属性,在“安全”选项卡上,我可以看到已经配置了几个windows用户: 有没有办法通过某种类型的测试连接从客户端应用程序(用C#编写)进行检查,或者SSAS是否也在SQL Server实例(DB engine)中维护一些自己的元数据数据库,如maste

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

我正在为SQLServerAnalysisServices(SSAS)服务器寻找类似的东西

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

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

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

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

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

更新2:我的一个朋友告诉我,可以在SSA上启动一些MDX查询以获取用户访问详细信息


更新3:SSAS server仅支持Windows集成安全模式的身份验证,而SQL server DB engine也支持基于用户ID密码的SQL身份验证。因此,代表其他用户启动MDX查询需要某种形式的模拟,我正试图仅通过Windows Integrated Security检查对SSAS服务器的访问。

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

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

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

希望这对你有用。

嗯……通过ADOMD.Net真正做到这一点真是一段相当长的旅程

核心方法学:核心理念是,连接到SSAS服务器只支持基于Windows集成安全性的身份验证。SSAS不支持SQL Server中针对
sa
用户的SQL身份验证

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

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

在v12.x之前适用于ADOMD.Net:

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

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

  • Out Proc模拟:将此代码放入控制台应用程序中。右键单击exe时,使用上下文菜单中的“以不同用户身份运行”选项。放置用户Y的凭据(比方说),以便应用程序在用户Y的上下文中启动,我们需要在SSAS服务器上验证对该用户Y的访问。ADOMD.Net将在使用Windows Integrated Security for SSAS服务器连接时使用用户Y的身份。如果代码成功,则用户具有访问权限
  • 在过程模拟中:另一种情况可能是,您正在以用户X的身份运行应用程序,但您希望测试用户Y的访问权限。在这里,在运行上述代码时,您实际上需要就地模拟。为了实现它,我使用了一个著名的NuGet包,它使用默认的.Net库类
    WindowsImpersonationContext
    WindowsIdentity
    。这个NuGet包的创建者首先发布了一个很好的答案
  • SQL Server Profiler中的观察:模拟用户
    Y
    后,如果捕获会话,您将清楚地看到在用户
    Y
    的上下文中触发MDX查询,如下所示:

    注意事项和担忧

  • 我在过程模拟中使用此功能时遇到的一个问题是,如果SSAS服务器位于运行应用程序代码的同一台计算机上,则该功能不起作用。这是由于本机
    LogonUser的固有行为造成的<
    
    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;
    }
    
    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();