====== PowerShell ======
Ich bin zwar noch nicht all zu lange ein Anhänger der PowerShell (Im Gegensatz zu Java, Perl, Bash, ...), jedoch nutze ich es inzwischen für fast alle Sachen, die sich damit machen lassen.
Besonders im Zusammenhang mit PowerCLI kann man VMware Umgebungen wunderbar verbiegen ;-)
===== Links =====
https://blog.uprightvinyl.co.uk/2018/03/07/installing-vmware-powercli-10-on-a-raspberry-pi/
https://blogs.vmware.com/PowerCLI/2018/02/powercli-10.html
https://github.com/eschek87/scripts/tree/master/vmware
===== Mysterium 'ExecutionPolicy' =====
Powershell Nutzer setzen als erstes die //ExecutionPolicy//, die steuert, welche Scripte (Sicherheit) gestartet werden dürfen. Ich arbeite meist mit ''RemoteSigned''.
Die meisten wissen jedoch nicht, dass es mehrere //Scopes// gibt. Bei der normalen ''Set-ExecutionPolicy'' Methode wird nur der Scope ''LocalMachine'' gesetzt. Gerade beim Aufruf aus anderen Progammen mittels process() o.ä. wird die PS jedoch im Scope ''CurrentUser'' ausgeführt, der für gewöhnlich unknown ist -> ''AllSigned''.
Prüfen kann man dies mit
Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Bypass
Die Policy ''Bypass'' ist übrigens sehr unsicher und sollte mit bedach gewählt werden. Besser ist da schon ''RemoteSigned''.
Gesetzt wird dies für die verschiedenen Scopes mittels des //Scope// Parameters
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force
Eine kurzer Überblick über powershell.exe Parameter und deren Auswirkung ist auch unter
[[https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/|https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/]]
zu finden.
===== PowerCLI =====
PowerCLI ist die CMDlet Erweiterung der Powershell von VMware um eine VMware ESX/VI3/vSphere/wieauchimmer Umgebung effizient zu managen. Es gibt für fast alles fertige CMDlets und wenn die nicht reichen, kann man ja immer noch direkt auf die API gehen.
===== Alle VMs eines Datastores im Inventory registrieren =====
$VMFolder = "test"
$vmhost = "esxhost"
$DatastoreName = get-vmhost $vmhost | Get-Datastore | where {$_.Name -like "snap*"}
ForEach($regDS in $DatastoreName){
$ds = Get-Datastore -Name $regDS | %{Get-View $_.Id}
$SearchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec
$SearchSpec.matchpattern = "*.vmx"
$dsBrowser = Get-View $ds.browser
$DatastorePath = "[" + $ds.Summary.Name + "]"
#Find all .VMX file paths in datastore, filtering out ones with .snapshot (useful for NetApp NFS)
$SearchResult = $dsBrowser.SearchDatastoreSubFolders($DatastorePath, $SearchSpec) | where {$_.FolderPath -notmatch".snapshot"} | %{$_.FolderPath + ($_.File | select Path).Path}
#Register all .vmx files as VMs on the datastore
foreach($VMXFile in $SearchResult) { New-VM -VMFilePath $VMXFile -ResourcePool $vmhost -Location $VMFolder -RunAsync }}
==== Was sind primary HA Nodes? ====
Im VMware HA Umfeld vor vSphere5 gibt es zwei Arten von Knoten. Primary und Secundary. Natürlich kann ich über PowerShell heraus bekommen, welche Primary Knoten sind.
$cluster = Get-View (Get-Cluster ).id
$infos = $cluster.RetrieveDasAdvancedRuntimeInfo()
$prim_hosts = $infos.DasHostInfo.PrimaryHosts
==== Protokollfehlermeldung bei Connect-VIServer ====
Falls man beim PowerShell CMDlet Connect-VIServer einen Fehler bzgl. falsches Protokoll
bekommt, sind meist "schräge" Proxy Einstellungen schult.
Die Proxy Nutzung kann durch
Set-PowerCLIConfiguration -ProxyPolicy NoProxy
abgeschaltet werden.
==== Datastore evakuieren ====
http://practical-admin.com/blog/powercli-evacuate-a-datastore/
===== PowerShell allgemein =====
==== Windows SID zu Nutzer auflösen ====
Ab und zu habe ich das Problem, eine Windows SID zum Real-Name aufzulösen.
Nach einiger Suche habe ich eine Lösung bei Eric Sarakaitis gefunden.
Hier der Codeschipsel:
$objSID = New-Object System.Security.Principal.SecurityIdentifier `
("s-1-5-21-1220945662-573735546-1417001333-500")
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
$objUser.Value