| Works
PowerCLIでvCenter Serverの権限をエクスポート/インポート
昨日の続きで、ロールをインポートした後にユーザーを作成してロールと権限の対象(仮想マシンとかホスト等)を割り当てる。
昨日のもそうだけど、とりあえず作業への間に合わせでザックリ作っただけのやつ。
今回の作業ではユーザー数が多くなかったので手動で作成したけど、権限の割り当てが多数の仮想マシンに個別設定してあったからCSVファイルのインポートで一括設定するようにしたかった。
ユーザー作成を別にしたのは、実際の作業がvCenter Server for WindowsからvCenter Server Applianceへの移行だったので、そもそも元の環境のOSユーザーはそのまま移行できないというのもあった。
Param (
[Parameter(Mandatory = $True, HelpMessage="Target CSV file")][alias("file","f")][ValidateNotNullOrEmpty()][string]$FilePath,
[alias("-export","e")][switch]$ExportFlag,
[alias("-import","i")][switch]$ImportFlag
)
if ($ExportFlag -and $ImportFlag) {
Write-Output "`"export`" and `"import`" are exclusive parameters."
exit 255
}
$VcSv = "192.168.1.251"
$VcUser = "administrator@vsphere.local"
$VcPass = "password"
Import-Module VMware.PowerCLI
#Add-PSSnapin VMware.VimAutomation.Core
Connect-VIServer -Server $VcSv -User $VcUser -Password $VcPass
if ($ExportFlag) {
$Perms = Get-VIPermission
$PermArray = @()
foreach($Perm in $Perms) {
if ($Perm.Principal -notmatch "VSPHERE\.LOCAL\\(vpxd-.*|vsphere-webclient-.*|Administrator$|Administrators$)") {
$PermParams = New-Object PSObject -Property @{
Entity = $Perm.Entity
Type = $Perm.EntityId.Split("-")[0]
Principal = $Perm.Principal
Role = $Perm.Role
Propagate = $Perm.Propagate
}
$PermArray += $PermParams
}
}
$PermArray | Select-Object -Property Entity,Type,Principal,Role,Propagate | Export-Csv -Path $FilePath -Encoding Default -NoType
}
if ($ImportFlag) {
Import-Csv -Path $FilePath -Encoding Default | Foreach-Object {
if ($_.Type -eq "Datacenter") {
$ViObj = Get-Datacenter -Name $_.Entity
} elseif ($_.Type -eq "ClusterComputeResource") {
$ViObj = Get-Cluster -Name $_.Entity
} elseif ($_.type -eq "HostSystem") {
$ViObj = Get-VMHost -Name $_.Entity
} elseif ($_.Type -eq "VirtualMachine") {
$ViObj = Get-VM -Name $_.Entity
} elseif ($_.Type -eq "Datastore") {
$ViObj = Get-Datastore -Name $_.Entity
} elseif ($_.Type -eq "DistributedVirtualPortgroup") {
$ViObj = Get-VDPortgroup -Name $_.Entity
} elseif ($_.Type -eq "Folder") {
$ViObj = Get-Folder -Name $_.Entity
}
if ($_.Propagate -eq "TRUE") {
$Prop = $True
} else {
$Prop = $False
}
New-VIPermission -Entity $ViObj -Principal $_.Principal -Role $_.Role -Propagate:$Prop
}
}
Disconnect-VIServer -Confirm:$False
exit
実行時には"-export"か"-import"とCSVファイルを指定する。
PS C:\Scripts> .\VcPermExp.ps1 -f .\permission.csv -import
CSVファイルの内容はこんな感じ。
Entity,Type,Principal,Role,Propagate
Datacenters,Folder,VSPHERE.LOCAL\AdminUser,Admin,TRUE
vm01,VirtualMachine,VSPHERE.LOCAL\VmUser,VmOwner,FALSE
- Entity … 権限割り当て対象の名前
- Type … "Entity"の種類 (Datacenter、VirtualMachine、Folder等々)
- Principal … ユーザーまたはグループ名
- Role … ロール名
- Propagate … 伝達の有効無効 (TRUE or FALSE)
"Type"は自分の作業に合わせて判別するようにしているので、網羅はしていない。
システムデフォルトの"Entity"はバージョン等で表記が異なる場合があるかも("Datacenters"が"データセンター"とマルチバイト表記だったり)。
実際に使ったときは、エクスポートしたCSVから不要な権限を削除して、ユーザー名を新しい環境のユーザーに置き換えてインポートした。
もう少しスマートにできればよかったけどね。