C# 如何检查windows用户是否可以通过模拟访问SQL Server Analysis Services(SSAS)服务器(windows集成安全身份验证)
对于SQL Server实例,要检查windows用户是否存在并且是否具有任何访问权限,可以尝试各种详细方法 我正在为SQLServerAnalysisServices(SSAS)服务器寻找类似的东西 我从右键单击上下文菜单进入了SSAS服务器的属性,在“安全”选项卡上,我可以看到已经配置了几个windows用户: 有没有办法通过某种类型的测试连接从客户端应用程序(用C#编写)进行检查,或者SSAS是否也在SQL Server实例(DB engine)中维护一些自己的元数据数据库,如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
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集成的基于安全性的身份验证,我们可以通过两种方式运行此代码:
WindowsImpersonationContext
和WindowsIdentity
。这个NuGet包的创建者首先发布了一个很好的答案Y
后,如果捕获会话,您将清楚地看到在用户Y
的上下文中触发MDX查询,如下所示:
注意事项和担忧:
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();