Juil 012015
 

Vous souhaitez interroger vos DBs mais les m?thodes fournies sont chiantes peu ergonomiques?
Facile! Voici 2 fonctions qui font le boulot.
Remarque utile : pas besoin d’installer un quelconque client! C’est natif !

SQL

Function querySQL ( $query, $database='master', $Server) {
$connection = New-Object System.Data.SqlClient.SqlConnection;
$connection.ConnectionString = "Server=$Server;Database=$database;Integrated Security=True;Connect Timeout=$timeOut;";
try {
$connection.Open();
$command = $connection.CreateCommand();
$command.CommandText = $query;
try{
$result = $command.ExecuteReader();
$SQLData = new-object System.Data.DataTable;

$SQLData.Load($result);
$connection.Close();
Remove-Variable connection, command, result
$SQLData
}
catch{Write-Host "Oups: Cannot query" -foregroundcolor Magenta}
}
catch{Write-Host "Oups: Connot open : Do you have the right to connect to this DB?" -foregroundcolor Magenta}
}

Oracle

function queryOracle ( $TNSName, $Query, $Username, $Password) {
[System.Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient") | out-null

$OracleConnection = New-Object System.Data.OracleClient.OracleConnection("Data Source=$TNSName;User Id=$Username;Password=$Password;Integrated Security=no");
$OracleConnection.Open()

$SelectCommand = New-Object System.Data.OracleClient.OracleCommand;
$SelectCommand.Connection = $OracleConnection
$SelectCommand.CommandText = $Query
$SelectCommand.CommandType = [System.Data.CommandType]::Text

$result = New-Object System.Data.DataTable
$result.Load($SelectCommand.ExecuteReader())

$reader = $SelectCommand.ExecuteReader()
while ($reader.Read()) {
$obj = New-Object PSObject
0..($reader.FieldCount-1) | % {
$obj | Add-Member -MemberType NoteProperty -Name ($reader.GetName($_) -replace "\W", "") -Value ($reader.GetValue($_))
}
$obj
}
}

Juin 262015
 

Cela fait un moment que j’essaye de trouver le juste ?quilibre entre l’allocation de ressource et ce que les utilisateurs demandent.
Tr?s souvent, c’est TRES largement sur-?valu?. Bien sur, VMware ESXi s’en sort tr?s bien et optimise ? la vol?e, mais… j’aime pas.
J’ai donc cherch? comment mesurer les ressources r?ellement utilis?es et j’en suis arriv? ? ces conclusions:

  • VMware montre ce que les VMs utilisent REELLEMENT.
    • Si vous d?marrez un Windows et le laissez ? ne rien faire pendant des jours, VMware vous montrera une utilisation de quelques centaines de Mo, pas plus. Or, si vous regardez le Gestionnaire des taches, vous constaterez une utilisation de 2 Go… Comment Est-ce possible?
    • VMware note ce qui est r?ellement utilis?. Or, Windows ne fout rien… Donc, VMware montre qu’il n’utilise rien..
  • Windows r?serve ses ressources pour le cas o?. Typiquement, un SQL Server va manger la quasi totalit? de RAM disponible pour lui tout seul (gourmand) alors que potentiellement, il n’en utilise que quelques Mo… Gourmand !
    • Un bon DBA pourra limiter l’utilisation de la RAM par SQL Server pour ?viter qu’il ne vampirise toute la RAM.

Mais comment trouver la « v?rit? » dans ce merdier? Ben… En mesurant les 2 et en r?fl?chissant.

Les 3 sont :

  1. Utilisation r?elle (VMware side)
  2. Utilisation Windows
  3. Le croisement des deux

Allons-y :

1. Ressources sur les 5 derniers jours

(au del?, il agr?ge les donn?es, et ca ne veux plus rien dire)

Function Get-TrueUsage {
? param ($Name, $Start=((get-date).adddays(-5)), $End=(get-date))
# Usage : Get-TrueUsage -Name VM01 -Start ((get-date).addMonths(-2)) -End (get-date)

? $MyVM=Get-VM -Name $name
? $MyVMView=$MyVM | get-view

? $obj=New-Object PSObject
? $obj | add-Member Noteproperty -name Name -value $Name
? $obj | add-Member Noteproperty -name Datacenter -value $MyVM | Get-Datacenter

? $StatsESX= $MyVM | select Name, @{n="AssignedMemory";e={$_.MemoryGB*1024*1024}}, @{n="HostMemoryUsage";e={$_.ExtensionData.Summary.QuickStats.HostMemoryUsage*1024}} 
? $StatsMemGuest=? Get-Stat -Entity ($MyVM ) -Start $Start -Finish $End -Stat mem.active.average | measure -max -min -Average Value
? $StatsCpuGuest=? Get-Stat -Entity ($MyVM ) -Start $Start -Finish $End -Stat cpu.usage.average? | measure -max -min -Average Value

? $obj | add-Member -MemberType Noteproperty -name AssignedMem?? -value $StatsESX.AssignedMemory
? $obj | add-Member -MemberType Noteproperty -name HostUsedMem?? -value $StatsESX.HostMemoryUsage

? $obj | Add-Member -MemberType NoteProperty -Name CPUSocket???? -Value ($MyVMView.config.hardware.NumCPU/(@{$true=$MyVMView.config.hardware.NumCoresPerSocket;$False=1}[$MyVMView.config.hardware.NumCoresPerSocket -gt 0 ]))
? $obj | Add-Member -MemberType NoteProperty -Name Corepersocket -Value @{$true=$MyVMView.config.hardware.NumCoresPerSocket;$False=1}[$MyVMView.config.hardware.NumCoresPerSocket -gt 0 ]

? $obj | add-Member -MemberType Noteproperty -name GuestMaxMem?? -value (($StatsMemGuest.Maximum) )
? $obj | add-Member -MemberType Noteproperty -name GuestMinMem?? -value (($StatsMemGuest.Minimum) )
? $obj | add-Member -MemberType Noteproperty -name GuestAvgMem?? -value ([math]::round($StatsMemGuest.Average) )

? $obj | add-Member -MemberType Noteproperty -name MemPrivShar?? -value ($MyVM.ExtensionData.Summary.QuickStats.PrivateMemory + $MyVM.ExtensionData.Summary.QuickStats.SharedMemory)

? $obj | add-Member -MemberType Noteproperty -name GaspillageMem -value (([Math]::round((1-($StatsMemGuest.Maximum/$StatsESX.AssignedMemory)) *10000 ))/10000 )

? $obj | Add-Member -MemberType NoteProperty -Name GuestMaxCpu?? -value ([Math]::round(($StatsCpuGuest.Maximum)*100 )/10000)
? $obj | Add-Member -MemberType NoteProperty -Name GuestMinCpu?? -value ([Math]::round(($StatsCpuGuest.Minimum)*100 )/10000)
? $obj | Add-Member -MemberType NoteProperty -Name GuestAvgCpu?? -value ([math]::round(($StatsCpuGuest.Average)*100 )/10000)

? $obj | add-Member -MemberType Noteproperty -name GaspillageCpu -value ([Math]::truncate($MyVMView.config.hardware.NumCPU - ($MyVMView.config.hardware.NumCPU*($StatsCpuGuest.Maximum/100))))

## WMI
? try{
??? $WMIPageFile=Get-WmiObject Win32_PageFileUsage -ComputerName $MyVM | select Name,CurrentUsage,AllocatedBaseSize,PeakUsage,TempPageFile
? } catch {
??? $WMIPageFile=''|select Name,CurrentUsage,AllocatedBaseSize,PeakUsage,TempPageFile 
? }

? $obj | Add-Member -MemberType NoteProperty -Name SwapFile????????? -value ($WMIPageFile.Name)
? $obj | Add-Member -MemberType NoteProperty -Name SwapCurrentUsage? -value ($WMIPageFile.CurrentUsage)
? $obj | Add-Member -MemberType NoteProperty -Name SwapAllocatedSize -value ($WMIPageFile.AllocatedBaseSize)
? $obj | Add-Member -MemberType NoteProperty -Name SwapPeak????????? -value ($WMIPageFile.PeakUsage)

? # Calculs recommandations

? # Pic m?moire + 20% et ensuite par blocks rond
? $NewMem=$obj.GuestMaxMem *1.2 /1024
? switch ($true) {
??? ( $NewMem -gt 4096) {$NewMem=([Math]::Truncate($NewMem / 2048)+1)*2048;break}
??? ( $NewMem -gt 3072) {$NewMem=4096;break}
??? ( $NewMem -gt 2048) {$NewMem=3072;break}
??? ( $NewMem -gt 1024) {$NewMem=2048;break}
??? ( $NewMem -gt 512)? {$NewMem=1024;break}
??? default???????????? {$NewMem=512;break}
? }

? # Pic CPU 
? $NewCpu=[System.Math]::Round($obj.GuestMaxCpu * $obj.CPUSocket * $obj.Corepersocket ,0)
? if (($obj.CPUSocket + $obj.Corepersocket) -gt 2 -and $NewCpu -le 1 ) {$NewCpu=2}
? if ($NewCpu -le 1 ) {$NewCpu=1}

? $obj | Add-Member -MemberType NoteProperty -Name RecommendedMemory -value $NewMem
? $obj | Add-Member -MemberType NoteProperty -Name RecommendedCpu??? -value $NewCpu

? $obj
}

Le Performance Monitor

Ce truc peux sauver tout un tas de compteur de votre machine. Les ressources sont quasiment illimit?es, une vrai mine d’or.

REM Delete the counter if it allready exist.
logman STOP VMWARE_AUDIT_MEMORY
logman DELETE VMWARE_AUDIT_MEMORY 
REM Create the counter
logman CREATE counter VMWARE_AUDIT_MEMORY -f bincirc -max 500 -si 2 --v -o "C:\perflogs\VMWARE_AUDIT_MEMORY" -c "\Memory\Available MBytes"

REM We need to delete the old file as the DataCollector does not support an existing file.
del C:\perflogs\VMWARE_AUDIT_MEMORY.blg
logman START VMWARE_AUDIT_MEMORY

Le m?lange des 2

Bon, ben… J’en suis pas encore l?…

On va comparer l’utilisation r?elle VMware (get-stat), les ressources utilis?es par la VM (perfmon), la swap (wmi),…

 

Fév 082015
 

Comme certains l’ignorent peut ?tre, mais les performances sont fortement impact?es en cas de snapshot. Lorsque l’hyperviseur doit rechercher le contenu d’un secteur disque, il va voir dans le? snapshot courant s’il le trouve. S’il ne le trouve pas, alors, il va voir dans le snapshot pr?c?dent, et ainsi de suite jusqu’? revenir au fichier VMDK original? (s’il doit revenir jusque l?, sinon, il s’arr?te d?s qu’il a trouv? ce qu’il cherche.. Ca peux se traduire par un volume de donn?e fort important pour pas grand chose…

Capture

Voici un exemple sous VMware Workstation d’un exemple de copie de fichiers Dans ce cas pr?cis, les donn?es sont sur le snapshot, peu d’impact sur le VMDK original except? les binaires pour la copie elle-m?me et des infos de l’OS sur les secteurs libres… Par contre, si je copie un fichier qui n’?tait pas dans le snapshot, l’impact est diff?rent:

Capture2

Bref… Evitez les snapshot autant que possible.. Et surtout, les snapshot en cascade a chaque click (Hein Olivier 😉 ) Le Olivier en question avait une VM sur disque USB3 avec des performances catastrophiques. Effectivement, une bonne dizaine de snapshot, ca impacte FORTEMENT. (Je ne vous raconte pas les temps de consolidation qui a ?t? n?cessaire) A+ les jeunes !

Jan 162015
 

J’ai fait l’acquisition d’une Surface Pro 3 et cette s***** ne tient pas la batterie. Les commandes suivantes m’ont indiqu?s certaines choses utiles:

powercfg /sleepstudy

le rapport m’indique que le p?riph?rique suivant bouffe toutes les ressources :

"Contr?leur d?h?te compatible xHCI USB (\_SB.PCI0.XHC)"

On dirait mon contr?leur disque…

Cette commande me montre l’?volution de ma batterie dans le temps :

powercfg /batteryreport
16:05:56 Connected standby Battery 90 % 37 mWh
21:23:56 Active Battery 61 % 24 mWh

Donc, en 5 heures, il a vid? 30% de ma batterie…

Je vais contacter Microsoft.

 

 

Jan 072015
 

Pr?-requis

  • 2 bras, 1 cerveau et le tout coordonn?s (patap?
  • R?solutions d??cran identique sur les 2 moniteurs
  • Citrix Receiver vers 14.2

Configuration des ?crans dans Windows 8

 

Configuration de Citrix Receiver

D?marrer une session Citrix et la passer en mode ??Fen?tre??

Mettre la fen?tre ? cheval sur les 2 ?crans (dans mon cas, un ecran est au dessus de l?autre)

Double cliquer sur le titre de la fen?tre Citrix Receiver

Et tadaaaaa.. C?est sur les 2 ?crans

Juil 162014
 

La m?thode longue consiste ? se connecter sur chaque VM, et a executer ce qui suit :

First thing is to log onto the virtual machine and open up msinfo32 via the run prompt (start > run > msinfo32).
Expand ?Software Environment? and then ?System Drivers?
Within this list you?re looking for vsepflt as shown below:

La m?thode automatis?e :
Pensez ? d?sactiver votre proxy de Internet Explorer (oui, je sais, c’est ?trange, et je n’ai ni le temps, ni l’envie de rentrer dans les d?tails)

$credentials=Get-Credential
$VMStatus=Get-VM | Where-Object { $_.PowerState -eq "PoweredOn" -and $_.Guest.OSFullName -match "WinDows" } | ForEach-Object {
$obj=New-Object PSObject
$obj | add-Member Noteproperty -name Name -value $_.name
#? $obj | add-Member Noteproperty -name vShield -value? (Invoke-VMScript -VM $_.name -ScriptType Bat -ScriptText 'driverquery | find /i "vsepflt"' -GuestCredential $credentials -ErrorAction Continue | Select-Object -ExpandProperty ScriptOutput)
$obj | add-Member Noteproperty -name ToolsVersion -value $_.ToolsVersion
$obj | add-Member Noteproperty -name ToolsVersionStatus -value $_.ToolsVersionStatus
$obj | add-Member Noteproperty -name SnapShotCount -value ($_ | Get-Snapshot | Measure-Object | select -ExpandProperty Count )
$obj | add-Member Noteproperty -name SnapShotInfo -value ($_ | Get-Snapshot | select VM,Created, SizeGB, IsCurrent, Name |Out-String )
$obj
}
$VMStatus | out-gridview

Si vous avez le m?me bug que moi, cad, que le re-enregistrement des adresses IP dans le DNS echoue et que le DNS se retrouve vide : http://support.microsoft.com/default.aspx?scid=kb;EN-US;2520155
Pour mettre a jour de maniere pseudo-automatis?e le parc

$credentials=Get-Credential

Get-VM | Where-Object { $_.PowerState -eq « PoweredOn » -and $_.Guest.OSFullName -match « WinDows » -and ($_ | get-snapshot | Measure-Object | select -ExpandProperty Count ) -eq 0 } | foreach {
Get-VM -name svMGTTST01 | foreach {
# ping to check if VM is pinguable
if (Test-Connection $_.name -ErrorAction SilentlyContinue ) { write-host « Ping to $_ : OK » -foregroundcolor green } else { write-host « Ping to $_ : Failed » -foregroundcolor red }
# Take snapshot
New-Snapshot -vm $_.name -Name « Avant VMWare Tools et vShield » -Description « VM avant execution du script automatique » -Memory:$true -Quiesce:$true -Confirm:$false
# Update tools
$_ | Get-View | foreach { $_.Guest.ToolsVersion }
$_ | Mount-Tools
# Copy BAT file
$DestinationFIle= »\\ »+(($_|get-view).Guest.HostName)+ »\c$\UpdateVMwareToolsManually.cmd »
Copy-Item -Path ‘C:\Users\Moi\Desktop\Scripts\VMwareTOols\UpdateVMwareToolsManually.cmd’ -Destination $DestinationFile
Invoke-VMScript -VM $_.name -ScriptType Bat -ScriptText ‘C:\UpdateVMwareToolsManually.cmd’ -GuestCredential $credentials | Select-Object ScriptOutput
Remove-Item $DestinationFile

# unmount
$_ | Wait-Tools

if ( (get-vm svMGTTST01 | Get-CDDrive ).isoPath.Equals(« [] /usr/lib/vmware/isoimages/windows.iso ») -eq $true ) { write-host « CD still mounted. Problem detected » -foregroundcolor red }

# Not necessary. Correct update unmount CDROM.
# $_ | Dismount-Tools

$_ | Get-View | foreach { $_.Guest.ToolsVersion }

# ping to check if VM is still pinguable
if (Test-Connection $_.name -ErrorAction SilentlyContinue ) { write-host « Ping to $_ : OK » -foregroundcolor green } else { write-host « Ping to $_ : Failed » -foregroundcolor red }

# delete snapshot
$_ | Get-Snapshot -Name « Avant VMWare Tools et vShield » | Remove-Snapshot -Confirm:$true
}

Et le script ? envoyer sur chaque VM:

SETLOCAL ENABLEDELAYEDEXPANSION

REM Usage : perform VMWareTools Assisted update and DNS registration
REM http://support.microsoft.com/default.aspx?scid=kb;EN-US;2520155
(
date /t
time /t

set DriveLetter=unknown
for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ) do? ( if exist %%a:\VMwareToolsUpgrader.exe if exist %%a:\certified.txt set DriveLetter=%%a)
echo DriveLetter : !DriveLetter!

REM check current version of vShield
driverquery | find /i « vsepflt »

!DriveLetter!:\Setup.exe /S /v « /qn REBOOT=R ADDLOCAL=ALL REMOVE=Hgfs »
ipconfig /registerdns

REM check new version of vShield
driverquery | find /i « vsepflt »

date /t
time /t
) >> C:\UpdateVMwareToolsManually.log 2>&1

Juil 062014
 

Bon, je passe sous silence le caract?re interdit par la loi. Ceci n’est document? que dans un but ?ducatif. Lisez bien les articles indiqu? ci-dessous.


http://www.framboise314.fr/le-raspberry-pi-comme-emetteur-fm-experimental/

Vous aurez besoin de :

  • Un raspberry Pi
  • Un bout de fil de 75cm (gain? pour ?viter de tout cramer
  • Un fer ? souder pour souder le fil sur le PIN 7 du Raspberry Pi (voir le site : http://www.framboise314.fr/le-raspberry-pi-comme-emetteur-fm-experimental/ ils font ?a mieux que moi

Version courte :

mkdir pifm
cd pifm
wget http://omattos.com/pifm.tar.gz
tar -zxf pifm.tar.gz

Pour ecouter sur la canal 108.0 FM le g?n?rique de la guerre des ?toiles (a ex?cuter en tant que root (sudo):

./pifm sound.wav 100.0

Pour diffuser votre WebRadio pr?f?r?e (dans mon cas: di.fm
Aller chercher le fichier PLS de votre station de radio (enregistrement sur le site obligatoire)
Editer le fichier PLS avec votre editeur de texte pr?f?r?, et copiez la ligne commencant par « File1=xxxx » (Sous Windows, tout est coll?. Utilisez Wordpad, il s’en sort bien!
Pour lancer le streaming :

apt-get install ffmpeg
ffmpeg -i "http://pub5.di.fm:80/di_vocaltrance?041743de647ca132e65513b5 -f s16le -ar 22.05k -ac 1 - | ./pifm - 108.0

Adaptez l’adresse web par la v?tre.

Ah! et bien sur, si vous fermez votre fen?tre de terminal, ben.. y’a plus de musique.
Solution : screen
apt-get install screen
Pour un tutoriel :

sinon:

screen
ffmpeg -i "http://pub5.di.fm:80/di_vocaltrance?041743de647ca132e65513b5 -f s16le -ar 22.05k -ac 1 - | ./pifm - 108.0
(appuyer sur CTRL+A d --> Control A et ensuite, D tout seul )

Ay????…

Juin 042014
 

Vous voulez donner un nom sympa ? vos LUNs au lieu du naa ? rallonge?
Assez facile avec cette fonction :

function Rename-scsilun {
Param([string]$naa, [string]$ScsiLunName)
get-vmhost | foreach {
$esx = Get-VMHost $_.name | Get-View
$storSys = Get-View $esx.ConfigManager.StorageSystem
Get-ScsiLun -VMHost $_.name -LUNType disk -CanonicalName $naa -ErrorAction SilentlyContinue | %{$storSys.UpdateScsiLunDisplayName($_.ExtensionData.Uuid, $ScsiLunName)}
}
}

A utiliser comme ceci :

Rename-scsilun -naa naa.1234567890123456789 -ScsiLunName SAN_PRD-LUN_01

Mai 282014
 

Code :

$ListVM=get-vm | Sort-Object -Property Host
$ListHOST=get-vmhost

$viewSI = Get-View ‘ServiceInstance’
$viewVmProvChecker = Get-View $viewSI.Content.VmProvisioningChecker

$Resultat = $ListVM | ForEach-Object {
$obj=New-Object PSObject
$myVM=$_
$obj | add-Member Noteproperty -name Name -value $myVM.name
$obj | add-Member Noteproperty -name CurrentHost -value $myVM.host
$ListHOST | ForEach-Object {
$myHost=$_
$resultCheck=$viewVmProvChecker.QueryVMotionCompatibilityEx(($myVM).Id, ($myHost).Id)
$nbErreur=($resultCheck[0].Error | measure-object | select -Property count).count
write-host « $myVM vers $myHost : $nbErreur » -foregroundcolor blue
$obj | add-Member Noteproperty -name ($myHost.name) -value ($nbErreur)
}
$obj
}
$Resultat | out-gridview

Ca donne un chouette tableau. o? le chiffre correspond au nombre de problemes rencontr?s pour le vMotion.
Pour connaitre la cause d’un echec :


function get-vmotionProblems{
Param([string]$vmName, [string]$vmHost)
$viewSI = Get-View 'ServiceInstance'
$viewVmProvChecker = Get-View $viewSI.Content.VmProvisioningChecker
$resultCheck=$viewVmProvChecker.QueryVMotionCompatibilityEx((Get-VM -name $vmName).Id, (get-vmhost -name $vmhost).Id)
($resultCheck[0].error)| foreach { $_.LocalizedMessage }
}

Qu’on utilise comme ceci :

get-vmotionProblems -vmName MA_VM01 -vmHost MON_ESX02