Comment vérifier si un user Windows a access (authentification de security embeddede Windows) au server SQL Server Analysis Services (SSAS) via l'emprunt d'identité

Pour une instance SQL Server, pour vérifier si un user Windows est présent et a un access ou non, vous pouvez essayer différentes manières détaillées ici .

Je suis à la search de quelque chose de similaire pour le server SQL Server Analysis Services (SSAS).

Je suis allé dans les propriétés du server SSAS à partir du menu contextuel du clic droit et sur l'onglet Sécurité, je peux voir qu'il y a plusieurs users Windows déjà configurés:

entrez la description de l'image ici

Est-il possible de vérifier à partir d'une application cliente (écrite en C #) en établissant une sorte de connection de test ou SSAS maintient également une base de métadonnées de sa propre database master dans l'instance SQL Server (moteur DB) qui peut être interrogée. J'ai vérifié le noeud Databases dans le server SSAS mais je ne vois aucune database par défaut:

entrez la description de l'image ici

Dans l'application client sur laquelle je travaille, j'ai le nom d'user et le mot de passe Windows en input. Dans mon application cliente, il y a un winform simple avec deux zones de text pour prendre le nom d'user AD et le mot de passe qui doivent être connectés à un server SSAS. Mon intuition est que le mot de passe est sans importance ici car SSAS ne supporte que le mode d'authentification embedded de Windows . Mon application client s'exécuterait sous un count qui a déjà access au server SSAS que j'essaye de me connecter.

Mise à jour: Après avoir obtenu de l'aide de @Vaishali, je suis capable de comprendre qu'il est possible de faire une connection de test à un server SSAS en utilisant ADOMD.Net .

Maintenant, le problème ici est que la string de connection utilise implicitement le count AD de l'user avec lequel j'exécute l'application cliente pour se connecter au server SSAS. Je ne pense pas qu'il serait possible de mentionner explicitement un nom d'user et un mot de passe de count AD Windows dans les strings de connection ADOMD.Net lors de l'utilisation de l'authentification embeddede de Windows. Même les strings de connection de SQL Server ne permettent pas de mentionner explicitement le nom d'user et le mot de passe Windows dans la string de connection, comme mentionné ici .

Mise à jour 2: L' un de mes amis m'a montré qu'il est possible de triggersr une requête MDX sur SSAS pour get les détails d'access user.

Mise à jour 3: le server SSAS ne prend en charge que le mode d'authentification Windows Integrated Security contrairement au moteur de database SQL Server qui prend également en charge l'authentification SQL basée sur le mot de passe user. Ainsi, une certaine forme d'emprunt d'identité serait nécessaire pour triggersr des requêtes MDX au nom d'un autre user pour lequel j'essaie de vérifier l'access sur le server SSAS via la security embeddede de Windows uniquement.

Si vous souhaitez vérifier si l'user a access au server SSAS, une option que vous pouvez essayer avec C # est: essayez de connecter SSAS avec des informations d'identification d'user données, si vous réussissez, vous avez access.

Si vous searchz des rôles et une security mappés à une database de cubes, le lien suivant sera utile.

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

Lignes de code C #:

bibliothèque d'import Microsoft.AnalysisServices.AdomdClient; et les lignes de code seraient:

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

J'espère que cela fonctionne pour toi.

Hmphh … C'était vraiment un voyage pour vraiment pouvoir le clouer sur ADOMD.Net.

Méthodologie de base : La philosophie de base est le fait que la connection au server SSAS ne prend en charge que l'authentification basée sur la security embeddede de Windows. L'authentification SQL comme nous le faisons pour sa user SQL Server n'est pas prise en charge dans SSAS.

Ainsi, l'idée de base était d'essayer de se connecter au server SSAS en utilisant l'authentification basée sur la security embeddede de Windows et de triggersr une requête MDX dans le context de l'user que nous essayons de vérifier. Si la requête est exécutée avec succès, l'user a access. Si l'exécution de la requête renvoie une erreur / exception, l'user n'a pas access.

S'il vous plaît noter que juste pour être en mesure d'ouvrir une connection au server SSAS n'est pas un indicateur de l'access de l'user pour des raisons décrites ici . Vous devez triggersr une requête pour vérifier l'access.

Pour ADOMD.Net jusqu'à v12.x:

Maintenant, nous soaps que l'authentification basée sur la security embeddede de Windows extrait toujours les détails de l'user du context de l'user sous lequel l'application / le process est exécuté. Vous ne pouvez pas transmettre les informations d'identification de l'user dans la string de connection de la connection ADOMD.Net. Voici le code que j'ai écrit pour l'accomplir. Vous devez vous référer à Microsoft.AnalysisServices.AdomdClient.dll dans votre projet C #.

 using Microsoft.AnalysisServices.AdomdClient; public static int IsSsasAccessibleToUser(ssortingng 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; } 

Maintenant, pour tirer parti de l'authentification basée sur la security embeddede de Windows, nous pouvons exécuter ce code de deux manières:

  1. Emprunt d'identité externe : Placez ce code dans une application de console. Utilisez l'option "Exécuter en tant qu'user différent" dans le menu contextuel lorsque nous faisons un clic droit sur l'exe. Mettez les informations d'identification de l'user Y (disons) pour que l'application démarre dans le context de l'user Y pour lequel nous devons valider l'access sur le server SSAS. ADOMD.Net utilisera l'identité de l'user Y lors de la connection à l'aide de Windows Integrated Security pour le server SSAS. Si le code réussit, l'user a access.
  2. L'emprunt d'identité In-Proc : L'autre cas pourrait être que vous exécutez l'application en tant qu'user X mais que vous voulez tester l'access de l'user Y. Ici, vous avez besoin d'emprunt d'identité sur place lors de l'exécution du code ci-dessus. Pour y parvenir, j'ai utilisé un célèbre package NuGet "Simple Impersonation" qui utilise les classs de bibliothèque .Net par défaut WindowsImpersonationContext et WindowsIdentity . Le créateur de ce package NuGet avait d'abord posté une bonne réponse ici .

Observation dans le profileur SQL Server : après avoir usurpé l'identité de l'user Y , vous verrez clairement la requête MDX se triggersr dans le context de l'user Y si vous capturez la session comme indiqué ci-dessous:

entrez la description de l'image ici

Mises en garde et préoccupations :

  1. Un problème que j'ai rencontré lors de l'utilisation de cet emprunt d'identité dans-proc est que cela ne fonctionne pas si le server SSAS est situé sur la même machine où le code de l'application est en cours d'exécution. Cela est dû au comportement inhérent de l'API LogonUser native (à l'aide de LOGON32_LOGON_NEW_CREDENTIALS LogonType) qui est appelée pendant les appels d'emprunt d'identité par le package NuGete. Vous pouvez essayer d'autres types de connection, tels que détaillés ici, dont vous avez besoin.
  2. Vous avez besoin du mot de passe de l'user ainsi que du nom de domaine et du nom d'user pour faire l'usurpation d'identité.

Pour ADOMD.Net v13.x et suivantes

Ensuite, je suis tombé sur cette documentation de l'API ChangeEffectiveUser sur MSDN ici . Mais, intellisense ne montre pas cette API. Ensuite, j'ai découvert que cette API a été ajoutée dans ADOMD.Net avec la version SQL Server 2016. Il existe plusieurs façons d'get la dernière version:

  1. C:\Program Files\Microsoft.NET\ADOMD.NET\130\Microsoft.AnalysisServices.AdomdClient.dll Je ne suis pas sûr de qui dumps ce file à cet location. Fait-il partie des extensions Microsoft.Net ou de l'installation de SQL Server.
  2. Dans le dossier d'installation de Microsoft SQL Server. Je l'ai obtenu au path d'access – C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\Update Cache\KB3182545\ServicePack\x64\Microsoft.AnalysisServices.AdomdClient.dll
  3. NuGet package ici . Pour une raison bizarre la plus connue de MS, le package NuGet de v13.x de ADOMD.Net a été nommé Unofficial.Microsoft.AnalysisServices.AdomdClient . Vous ne savez pas pourquoi ils ont introduit un package NuGet distinct avec le préfixe Unofficial alors que cela aurait dû être simplement la prochaine version du package NuGet déjà existant Microsoft.AnalysisServices.AdomdClient présent ici .

Ainsi, la nouvelle API ChangeEffectiveUser présente dans la dernière version sur AdomdConnection peut être utilisée facilement pour usurper l'identité d'un user comme ci-dessous:

 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(); 

Observation de l'emprunt d'identité dans SQL Server Profiler : Bien qu'une observation particulière que j'ai eu dans le SQL Server Profiler est que les journaux de la requête en cours d'exécution montre toujours le nom de l'user d'origine avec lequel votre process d'application est en cours d'exécution.

entrez la description de l'image ici

Donc, pour vérifier si l'usurpation d'identité est en cours ou non, j'ai supprimé les droits d'access de l'user domainName\UserNameBeingImpersonated partir du server SSAS. Après cela, lorsque j'ai réexécuté le code ci-dessus, il en résulte une exception dont le message indique clairement que the user domainName\UserNameBeingImpersonated doesn't have permission on the SSAS server or the database doesn't exist . Ce message d'erreur suggère clairement que l'usurpation d'identité fonctionne.

Avantages et rétrocompatibilité de cette approche :

  1. Bien que l'API soit très récente, elle a été utilisée avec SQL Server 2016, mais j'ai aussi pu l'utiliser avec succès avec le server SSAS 2014. Cela semble donc rétrocompatible.
  2. Cette API fonctionne indépendamment du fait que votre server SSAS soit local ou distant.
  3. Vous avez juste besoin du nom de domaine et du nom d'user pour faire l'usurpation d'identité. Aucun mot de passe requirejs.

Que faire si nous voulons simplement vérifier l'access sur le server SSAS sans impliquer aucune database présente sur le server SSAS ?

  1. Changez la string de connection pour n'impliquer aucune database. Supprimez la key de Catalog tant que string de connection suivante – "provider = olap; datasource = {ssasServerName};"
  2. Lancez la requête suivante à la place pour vérifier l'access – SELECT * FROM $System.discover_locks dans l'extrait de code affiché initialement dans le message.