VMware PowerCLI – Export / Import SSO Roles & Permissions vCenter

Voici un petit post pour présenter deux scripts que j’ai trouvé sur le forum VMware provenant des maitres du scripting PowerCLI Virtu-al & LucD, qui permet de ressortir la configuration du SSO, rien que ça…

Le XML intègre les Roles ainsi que leurs Privilèges, mais aussi les Permissions associées au différentes Entités. On a ainsi un bundle de tout notre SSO et il y a même un script d’import, amazing !

Attention toutefois, il vous faut importer auparavant les différents folders ainsi que les utilisateurs et groupes du SSO VMware !

PS : J’ai corrigé et testé le code, si jamais vous avez une erreur vérifiez bien les guillemets …

# Parameters
$OutputDir = "C:\vCenter_SSO.xml"

# Root of the XML file
$global:vInventory = [xml]"<Inventory></Inventory>"

# Functions
function New-XmlNode{
	param($node, $nodeName)

	$tmp = $global:vInventory.CreateElement($nodeName)
	$node.AppendChild($tmp)
}

function Set-XmlAttribute{
	param($node, $name, $value)

	$node.SetAttribute($name, $value)
}
function Get-XmlNode{
	param ($path)
	$global:vInventory.SelectNodes($path)
}

function Get-Roles{
  begin{
    $authMgr = Get-View AuthorizationManager
    $report = @()
  }
  process{
    foreach($role in $authMgr.roleList){
      $ret = New-Object PSObject
      $ret | Add-Member -Type noteproperty -Name "Name" -Value $role.name
      $ret | Add-Member -Type noteproperty -Name "Label" -Value $role.info.label
      $ret | Add-Member -Type noteproperty -Name "Summary" -Value $role.info.summary
      $ret | Add-Member -Type noteproperty -Name "RoleId" -Value $role.roleId
      $ret | Add-Member -Type noteproperty -Name "System" -Value $role.system
      $ret | Add-Member -Type noteproperty -Name "Privilege" -Value $role.privilege
      $report += $ret
    }
  }
  end{
    return $report
  }
}
function Get-Permissions
{
  begin{
    $report = @()
    $authMgr = Get-View AuthorizationManager
    $roleHash = @{}
    $authMgr.RoleList | %{
      $roleHash[$_.RoleId] = $_.Name
    }
  }
  process{
    $perms = $authMgr.RetrieveAllPermissions()
    foreach($perm in $perms){
      $ret = New-Object PSObject
      $entity = Get-View $perm.Entity
      $ret | Add-Member -Type noteproperty -Name "Entity" -Value $entity.Name
      $ret | Add-Member -Type noteproperty -Name "EntityType" -Value $entity.gettype().Name
      $ret | Add-Member -Type noteproperty -Name "Group" -Value $perm.Group
      $ret | Add-Member -Type noteproperty -Name "Principal" -Value $perm.Principal
      $ret | Add-Member -Type noteproperty -Name "Propagate" -Value $perm.Propagate
      $ret | Add-Member -Type noteproperty -Name "Role" -Value $roleHash[$perm.RoleId]
      $report += $ret
    }
  }
  end{
    return $report
  }
}
$global:vInventory = [xml]"<Inventory><Roles/><Permissions/></Inventory>"

# Main
# Roles
  $XMLRoles = Get-XmlNode "Inventory/Roles"
Get-Roles | where {-not $_.System} | % {
  $XMLRole = New-XmlNode $XMLRoles "Role"
  Set-XmlAttribute $XMLRole "Name" $_.Name
  Set-XmlAttribute $XMLRole "Label" $_.Label
  Set-XmlAttribute $XMLRole "Summary" $_.Summary
  $_.Privilege | % {
    $XMLPrivilege = New-XmlNode $XMLRole "Privilege"
    Set-XmlAttribute $XMLPrivilege "Name" $_
  }
}

# Permissions
$XMLPermissions = Get-XmlNode "Inventory/Permissions"
Get-Permissions | % {
  $XMLPerm = New-XmlNode $XMLPermissions "Permission"
  Set-XmlAttribute $XMLPerm "Entity" $_.Entity
  Set-XmlAttribute $XMLPerm "EntityType" $_.EntityType
  Set-XmlAttribute $XMLPerm "Group" $_.Group
  Set-XmlAttribute $XMLPerm "Principal" $_.Principal
  Set-XmlAttribute $XMLPerm "Propagate" $_.Propagate
  Set-XmlAttribute $XMLPerm "Role" $_.Role
}

# Create XML file
$global:vInventory.Save($OutputDir)
Export vCenter SSO
# Variable
$XMLfile = "C:\vCenter_SSO.xml"

# Functions
function New-Role
{
    param($name, $privIds)
    Begin{}
    Process{

        $roleId = $authMgr.AddAuthorizationRole($name,$privIds)
    }
    End{
        return $roleId
    }
}

function Set-Permission
{
param(
[VMware.Vim.ManagedEntity]$object,
[VMware.Vim.Permission]$permission
)
Begin{}
Process{
    $perms = $authMgr.SetEntityPermissions($object.MoRef,@($permission))
}
End{
    return
}
}

# Main
# Create hash table with the current roles
$authMgr = Get-View AuthorizationManager
$roleHash = @{}
$authMgr.RoleList | % {
    $roleHash[$_.Name] = $_.RoleId
}

# Read XML file
$vInventory = [xml]"<dummy/>"
$vInventory.Load($XMLfile)

# Define Xpaths for the roles and the permissions
$XpathRoles = "Inventory/Roles/Role"
$XpathPermissions = "Inventory/Permissions/Permission"

# Create custom roles
$vInventory.SelectNodes($XpathRoles) | % {
    if(-not $roleHash.ContainsKey($_.Name)){
        $privArray = @()
        $_.Privilege | % {
            $privArray += $_.Name
        }
        $roleHash[$_.Name] = (New-Role $_.Name $privArray)
    }
}

# Set permissions
$vInventory.SelectNodes($XpathPermissions) | % {
    $perm = New-Object VMware.Vim.Permission
    $perm.group = &{if ($_.Group -eq "true") {$true} else {$false}}
    $perm.principal = $_.Principal
    $perm.propagate = &{if($_.Propagate -eq "true") {$true} else {$false}}
    $perm.roleId = $roleHash[$_.Role]

    $EntityName = $_.Entity.Replace("(","\(").Replace(")","\)")
    $EntityName = $EntityName.Replace("[","\[").Replace("]","\]")
    $EntityName = $EntityName.Replace("{","\{").Replace("}","\}")

    $entity = Get-View -ViewType $_.EntityType -Filter @{"Name"=("^" + $EntityName + "$")}
    Set-Permission $entity $perm
}
Import vCenter SSO


...BofBienTrès BienTop ! (Soit le premier à voter)
Loading...

Mathieu

Je suis actuellement Ingénieur Système spécialisé dans le design d'environnements cloud virtualisés. Adepte des technologies de VMware, Nutanix, Citrix ou Microsoft je propose à travers ce blog diverses astuces de troubleshooting.

5 thoughts to “VMware PowerCLI – Export / Import SSO Roles & Permissions vCenter”

  1. Bonjour Mathieu, tout d’abord merci pour tes super script très bon taf ! J’ai réussi à exécuté celui de l’export import des dossiers + vm sans soucis mais celui du SSO bloque… Les rôles ce sont bien créer il à aussi placé les groupes sur les entités mais il n’a pas set les permissions… voilà l’erreur si jamais tu as une idée :
    (VCSA 6.5 U1g)
    Exception lors de l’appel de « SetEntityPermissions » avec « 2 » argument(s) : « 
    Required parameter entity is missing
    while parsing call information for method SetEntityPermissions
    at line 1, column 171
    while parsing SOAP body
    at line 1, column 64
    while parsing SOAP envelope
    at line 1, column 0
    while parsing HTTP request for method setEntityPermissions
    on object of type vim.AuthorizationManager
    at line 1, column 0 »
    Au caractère C:\export vcenter\import_sso.ps1:26 : 5
    + $perms = $authMgr.SetEntityPermissions($object.MoRef,@($permissio …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : VimException

    Un idée?

    Merci.

    1. Hello,
      Tu as réussi à solutionner le problème depuis ?
      Pour l’ajout des permissions il utilise une fonction qui demande deux variables (Set-Permission $entity $perm), apparemment il lui manque « $entity » d’où le problème d’import.

      S’il y a bien les variables d’entités dans ton XML, il faut que tu te concentre sur la partie qui ressort cette variable :

      $EntityName = $_.Entity.Replace(« (« , »\(« ).Replace(« ) », »\) »)
      $EntityName = $EntityName.Replace(« [« , »\[« ).Replace(« ] », »\] »)
      $EntityName = $EntityName.Replace(« {« , »\{« ).Replace(« } », »\} »)

      $entity = Get-View -ViewType $_.EntityType -Filter @{« Name »=(« ^ » + $EntityName + « $ »)}

  2. salut, tu sais s’il est possible de faire fonctionner le script avec des objets différents mais portant le même nom. J’ai des dizaines de ressource Pool qui portent le même nom et je dois migrer un vcenter 5.5 vers 6.5 en conservant les permissions…

    1. Salut,
      J’avoue que je n’ai jamais eu ce cas car je ne met jamais le même nom, c’est donc à essayer en labo mais je ne suis pas sur qu’il va aimer.
      Je vais essayer de me trouver un peu de temps pour essayer ceci, dis moi si tu as un retour la dessus.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *