It is pretty straight forward: it creates a VIRole of the given name in a destination vCenter, based on the name of a VIRole and source vCenter. This does involve the additional step of getting the VIPrivileges (handled in the function via Get-VIPrivilege) from the destination vCenter -- the PrivilegeList itself did not suffice. The function definition:
function Copy-VIRole { <# .Description Copy a role to another role, either in same vCenter or to a different vCenter This assumes that connections to source/destination vCenter(s) are already established. If role of given name already exists in destination vCenter, will stop. Author: vNugglets.com -- Jul 2013 .Example Copy-VIRole -SrcRoleName SysAdm -DestRoleName SysAdm_copyTest -SrcVCName vcenter.com -DestVCName labvcenter.com .Outputs VMware.VimAutomation.ViCore.Impl.V1.PermissionManagement.RoleImpl if role is created/updated, String in Warning stream and nothing in standard out otherwise #> param( ## source role name [parameter(Mandatory=$true)][string]$SrcRoleName_str, ## destination role name [parameter(Mandatory=$true)]$DestRoleName_str, ## source vCenter connection name [parameter(Mandatory=$true)]$SrcVCName_str, ## destination vCenter connection name [parameter(Mandatory=$true)]$DestVCName_str, ## WhatIf switch [switch]$WhatIf_sw ) ## end param ## get the VIRole from the source vCenter $oSrcVIRole = Get-VIRole -Server $SrcVCName_str -Name $SrcRoleName_str -ErrorAction:SilentlyContinue ## if the role does not exist in the source vCenter if ($null -eq $oSrcVIRole) {Write-Warning "VIRole '$DestRoleName_str' does not exist in source vCenter '$SrcVCName_str'. No source VIRole from which to copy. Exiting"; exit} ## see if there is VIRole by the given name in the destination vCenter $oDestVIRole = Get-VIRole -Server $DestVCName_str -Name $DestRoleName_str -ErrorAction:SilentlyContinue ## if the role already exists in the destination vCenter if ($null -ne $oDestVIRole) {Write-Warning "VIRole '$DestRoleName_str' already exists in destination vCenter '$DestVCName_str'. Exiting"; exit} ## else, create the role else { $strNewVIRoleExpr = 'New-VIRole -Server $DestVCName_str -Name $DestRoleName_str -Privilege (Get-VIPrivilege -Server $DestVCName_str -Id $oSrcVIRole.PrivilegeList){0}' -f $(if ($WhatIf_sw) {" -WhatIf"}) Invoke-Expression $strNewVIRoleExpr } ## end else } ## end function
An example of using the function to copy a role from one vCenter to another, with a new role name:
PS vN:\> Copy-VIRole -SrcRoleName MyRole0 -SrcVCName myvcenter.dom.com -DestRoleName MyNewRole -DestVCName vcenter2.dom.com Name IsSystem ---- -------- MyNewRole False PS vN:\> Get-VIRole MyNewRole -server vcenter2* Name IsSystem ---- -------- MyNewRole FalseOne can also use this function to clone a VIRole in the same vCenter -- just use the same vCenter for the Source and Destination vCenter parameters.
Note: this function expects/requires that the PowerCLI session already has a connection to each of the vCenter(s) (one or two) involved in the operation.
For another way of copying a VIRole (between separate vCenters, particularly), see Grzegorz's post at http://psvmware.wordpress.com/2012/07/19/clone-roles-between-two-virtual-center-servers/.
Enjoy.
This one is quite useful.
ReplyDeleteThanks, "Anonymous", glad to hear that it helped. --Matt
Delete