Tag Archives: Powershell

PowerShell Windows

PowerShell Best Practices: Set-StrictMode

During some research for PowerShell best practices I came across the following blog post on the Hey Scripting Guy Blog from Microsoft:
http://blogs.technet.com/b/heyscriptingguy/archive/2014/12/03/enforce-better-script-practices-by-using-set-strictmode.aspx

By using the Set-StrictMode cmdlet, we can enforce some common “best practice” coding techniques that you can use with your scripts. In yesterday’s post, I used the –Strict parameter with Set-PSDebug. This enforces the variable declaration in a script. But with Set-StrictMode, we get that plus a little more. The scope is limited to the current scope and child scopes. By default, Set-StrictMode is turned off to prevent error messages while you are writing the script.

From now on, all my PowerShell scripts will start with “Set-StrictMode -Version latest” and “Set-PSDebug -Strict”:

Set-PSDebug -Strict
Set-StrictMode -Version latest
Read More
PowerShell Windows XenDesktop

Get running processes including CPU and memory usage

One of my customers needed a PowerShell script to get all running processes with their corresponding CPU load. This was script should be triggered by their monitoring system if the system total CPU usage exceeds a configured threshold.

They’re running a mid-sized Citrix XenDesktop farm with Server-OS (formerly known as XenApp a.k.a. terminal services) and sometimes applications are using a high CPU amount.

This is the small script I wrote for them:

#####################################################################
##
## (C) 2015 Michael Miklis (michaelmiklis.de)
##
##
## Filename:      Get-Tasks.ps1
##
## Version:       1.0
##
## Release:       Final
##
## Requirements:  -none-
##
## Description:   PowerShell Tasklist with CPU usage and memory
##                usage
##
## This script is provided 'AS-IS'.  The author does not provide
## any guarantee or warranty, stated or implied.  Use at your own
## risk. You are free to reproduce, copy & modify the code, but
## please give the author credit.
##
####################################################################

<#
.SYNOPSIS
Lists all running task including cpu and memory usage

.DESCRIPTION
The Get-Tasks function uses Windows Management Instrumentation (WMI) to retrieve process Name, ProcessId, SessionId,
VirtualSizeMB, Handles, Owner, PercentProcessorTime and ThreadCount

.PARAMETER computerName
Computername or IP Adress of the computer to query

.PARAMETER credential
Credentials to query computer as System.Management.Automation.PSCredential

.EXAMPLE
Get-Tasks
Get-Tasks -computerName "server.domain.com" -credential $credential

.NOTES
You need to run this CMDlet with elevated permissions
#>

function Get-Tasks {
    [CmdletBinding()]
    param (
        [parameter(Mandatory=$true,ValueFromPipeline=$false)]
        [string]$computername,

        [parameter(Mandatory=$true,ValueFromPipeline=$false)]
        [System.Management.Automation.PSCredential]$credential      
    )

    PROCESS {
        $colProcs = Get-wmiobject win32_process -computername $computername  -Credential $credential | select *,@{Name=”Owner”;Expression={($_.GetOwner()).User}}
        $colPerfs = Get-wmiobject win32_perfformatteddata_perfproc_process -computername $computername  -Credential $credential 
        $colTasklist = @()

        foreach ($proc in $colProcs) {
            $process = New-Object System.Object

            $perf = $colPerfs | Where-Object { $_.IDProcess -eq $proc.ProcessId }

            $process | Add-Member -type NoteProperty -name "Name" -value $proc.Name       
            $process | Add-Member -type NoteProperty -name "ProcessId" -value $proc.ProcessId
            $process | Add-Member -type NoteProperty -name "SessionId" -value $proc.SessionId
            $process | Add-Member -type NoteProperty -name "VirtualSizeMB" -value ([math]::Round(($proc.VirtualSize / 1024 /1024), 2))
            $process | Add-Member -type NoteProperty -name "Handles" -value $proc.Handles
            $process | Add-Member -type NoteProperty -name "Owner" -value $proc.Owner
            $process | Add-Member -type NoteProperty -name "PercentProcessorTime" -value $perf.PercentProcessorTime
            $process | Add-Member -type NoteProperty -name "ThreadCount" -value $perf.ThreadCount

            $colTasklist += $process
        }

        $colTasklist | Sort-Object PercentProcessorTime -Desc

        return $colTasklist
    }
}
Read More
Featured Programming

Creating VMware Virtual Machines using PowerCLI

During one of my current projects, I needed to create lots of virtual machines on a VMware vSphere 5 environment. These virtual machines were used as Citrix XenApp Worker servers provisioned by Citrix Provisioning Services (PVS). Therefore, we additionally needed to configure a static MAC address on each virtual machine.

For faster deployment and better documentation, I decided to do the word with the VMware Powershell interface called PowerCLI:

http://www.vmware.com/go/powercli


# --------------------------------------------------
# Connect to vCenter Server
# --------------------------------------------------
connect-viserver –server "myVCenter.domain.local"

# --------------------------------------------------
# Create new VMs from Template
# --------------------------------------------------
New-VM -Name NewVM01 -Template W2K8R2_Datacenter_ENU -Datastore "SAN-Datastore-01" -VMHost "esx01.domain.local"
New-VM -Name NewVM02 -Template W2K8R2_Datacenter_ENU -Datastore "SAN-Datastore-01" -VMHost "esx02.domain.local"

# --------------------------------------------------
# Setting DRS Rules to separate NewVM01 and NEWVM02
# --------------------------------------------------
New-DrsRule -Name "Never on the same Host" -Cluster "Production" -Enabled $true -KeepTogether $false -VM "NewVM01", "NewVM02"

# --------------------------------------------------
# Setting static MAC Addresses
# --------------------------------------------------
Get-VM "NewVM01" | Get-NetworkAdapter | Set-NetworkAdapter -MacAddress "00:50:56:1A:00:01" -Confirm:$false
Get-VM "NewVM02" | Get-NetworkAdapter | Set-NetworkAdapter -MacAddress "00:50:56:1A:00:02" -Confirm:$false

Read More
1 2