Configuration de la sécurité d'un cube SSAS avec PowerShell et AMO

Mon cube est destiné à être accédé par un grand nombre d'utilisateurs (à travers Sharepoint et Performance Point Services) avec des permissions configurées selon l'appartenance à une entité organisationnelle de l'entreprise (agence).

Le problème est de créer et configurer un grand nombre de rôles dans la base de données SSAS : très fastidieux de configurer des dizaines ou centaines de rôles avec l'interface graphique !

Solution : un script powershell va créer les rôles automatiquement à partir d'une liste d'agences (fichier texte), en faire membre le groupe Active Directory qui correspond, et configurer les permissions nécessaires sur les mesures et les dimensions du cube.

N'oubliez pas qu'il faut activer l'exécution de scripts powershell non signés avec la commande Set-ExecutionPolicy Unrestricted;

En s'aidant de quelques exemples et de la documentation d'AMO, voilà ce que donne le script CreateRole.PS1 :

# Charger les assembly nécessaires
[System.reflection.Assembly]::LoadWithPartialName(“Microsoft.AnalysisServices”)
[System.reflection.Assembly]::LoadWithPartialName(“System.IO”)
# Connexion à la base SSAS
$svr = new-Object Microsoft.AnalysisServices.Server
$svr.Connect(“MyServer”)
$dbname = “MyDatamart”
$db = $svr.Databases.item($dbname)
# Print nom de la base
“Ajouter les rôles à la base: ” + $db.Name
# lecture du fichier
$roleLines = Get-Content “E:\agences.txt”

# pour chaque ligne du fichier
foreach ($roleName in $roleLines)
{
“Traitement du rôle pour agence: ” + $roleName
$agencerolename = "Agence_"+$roleName
$groupname = “DOMAIN_NAME\GG_AG_” + $roleName

#Suppression si existence
$roleToDelete = $db.Roles.FindByName($agencerolename)
if ($roleToDelete)
{
“Rôle trouvé, suppression!”
$roleToDelete.Drop(“AlterOrDeleteDependents”)

$error.clear()
if ($error[0])
{
$sw.WriteLine($agencerolename + “: Erreur de suppression : ” + $error[0])
}
}
else
{
#Création du rôle et ajouter groupe AD
[Microsoft.AnalysisServices.Role] $roleToCreate = new-Object([Microsoft.AnalysisServices.Role])($agencerolename)
$roleToCreate.Members.Add($groupname)
“… ‘” + $roleToCreate.Name + “‘ ajout à la base”
$db.Roles.Add($roleToCreate)
$error.clear()
$roleToCreate.Update()
if ($error[0])
{
$sw.WriteLine($agencerolename + “: Error Adding to DB: ” + $error[0])
}
else
{
#Création des permissions de db
“… ‘” + $roleToCreate.Name + “‘ mise à jour des permissions de base”
$dbperm = $db.DatabasePermissions.Add($roleToCreate.ID)
$dbperm.Read = [Microsoft.AnalysisServices.ReadAccess]::Allowed
$error.clear()
$dbperm.Update()
if ($error[0])
{
$sw.WriteLine($agencerolename + “: Erreur mise à jour DB Perms: ” + $error[0])
}
else
{
# Permissions pour le cube
$cubename = "MyCube"
$cube=$svr.Databases.Item($dbname).Cubes.FindByName($cubename)
#Permission de lecture sur le cube
“… ‘” + $roleToCreate.Name + “‘ ajout permissions dans : ‘” + $cube.Name + “‘ cube”
$cubeperm = $cube.CubePermissions.Add($roleToCreate.ID)
$cubePerm.Read = [Microsoft.AnalysisServices.ReadAccess]::Allowed
$error.clear()
$cubeperm.Update()
if ($error[0])
{
$sw.WriteLine($agencerolename + “: Error mise à jour Cube Perms: ” + $error[0])
}
# Ajouter les interdictions sur les mesures
“… ‘” + $roleToCreate.Name + “‘ Ajouter interdiction sur les mesures”
$cube.CubePermissions.FindByRole($roletocreate.ID).DimensionPermissions.Add("Measures").AttributePermissions.Add("Measures").DeniedSet="{[Measures].[Salaire], [Measures].[Charges Patronales]}"
$error.clear()
$cube.CubePermissions.FindByRole($roletocreate.ID).Update()
if ($error[0])
{
$sw.WriteLine($agencerolename + “: Erreur interdiction mesures: ” + $error[0])
}
# Ajouter les permissions sur les dimensions de cube
“… ‘” + $roleToCreate.Name + “‘ Ajouter autorisation sur le référentiel”
$cube.CubePermissions.FindByRole($roletocreate.ID).DimensionPermissions.Add("Dim Referentiel").AttributePermissions.Add("Agence").AllowedSet="{[Référentiel Organisationnel].[Agence].["+$roleName+"]}"
$cube.CubePermissions.FindByRole($roletocreate.ID).DimensionPermissions.Find("Dim Referentiel").AttributePermissions.Find("Agence").VisualTotals=1
$error.clear()
$cube.CubePermissions.FindByRole($roletocreate.ID).Update()
if ($error[0])
{
$sw.WriteLine($agencerolename + “: Erreur permissions référentiel: ” + $error[0])
}
# Ajouter le visualtotal sur les dimensions de cube
“… ‘” + $roleToCreate.Name + “‘ Ajouter autorisation sur le référentiel”
$cube.CubePermissions.FindByRole($roletocreate.ID).DimensionPermissions.Find("Dim Referentiel").AttributePermissions.Find("Agence").VisualTotals=1
$error.clear()
$cube.CubePermissions.FindByRole($roletocreate.ID).Update()
if ($error[0])
{
$sw.WriteLine($agencerolename + “: Erreur visualtotal référentiel: ” + $error[0])
}
}
}
}
}
#cleanup
$sw.close()
$svr.Disconnect()