SnakeNET

Utilisateur principal de ce site web.

Mai 082014
 

import-module activedirectory

$Application= »
$sgroup= »

Import-Csv c:\temp\source.csv -Delimiter ‘;’ | where-object { $_.’Create DL’ -eq ‘X’ } | Sort-Object DL_,AD | select-object DL_,AD -unique | foreach {
if ($_.DL_ -eq $Application) {
$sgroup+= »(MemberOfGroup -eq ‘ »+(Get-ADGroup $_.AD | Select-Object -ExpandProperty DistinguishedName)+ »‘) -or  »
} else {
if ($Application -ne  » ) {
$sgroup=$sgroup.Substring(0,$sgroup.Length-4)
Remove-DynamicDistributionGroup « $Application » -Confirm:$false
$a= »New-DynamicDistributionGroup ‘$Application’ -Alias ‘$Application’ -OrganizationalUnit ‘OU=Distribution Lists,OU=Groups,OU=Users and groups,DC=MonDomaine,DC=local’ -RecipientFilter {(RecipientType -eq ‘UserMailbox’) -and ( ($sgroup)) }  »
invoke-expression $a

}
$Application=$_.DL_
$sgroup= »(MemberOfGroup -eq ‘ »+(Get-ADGroup $_.AD | Select-Object -ExpandProperty DistinguishedName)+ »‘) -or  »
}
}

if ($_.DL_ -ne $Application) {
$sgroup=$sgroup.Substring(0,$sgroup.Length-4)
Remove-DynamicDistributionGroup « $Application » -Confirm:$false
$a= »New-DynamicDistributionGroup ‘$Application’ -Alias ‘$Application’ -OrganizationalUnit ‘OU=Distribution Lists,OU=Groups,OU=Users and groups,DC=MonDomaine,DC=local’ -RecipientFilter {(RecipientType -eq ‘UserMailbox’) -and ( ($sgroup)) }  »
invoke-expression $a

}

#########################################################

$MyGroup = Get-DynamicDistributionGroup -id MA_DDL
Get-Recipient -RecipientPreviewFilter $MyGroup.RecipientFilter

Fév 282014
 

Fonction ? garder dans un coin :

Function Get-RDPSession {
    [cmdletbinding(DefaultParameterSetName = 'session',ConfirmImpact = 'low')]
    Param(
        [Parameter(Mandatory = $True,Position = 0,ValueFromPipeline = $True)]  [string[]]$name)             
Begin {$report = @()}
Process { 
    foreach ($computer in $name) {
        write-host Checking $computer. 
        if ( Test-Connection svc -ErrorAction SilentlyContinue -Count 1    ) {
            $sessions = query session /server:$computer
            1..($sessions.count -1) | % {
                $temp = "" | Select Computer,SessionName, Username, Id, State, Type, Device
                $temp.Computer = $computer
                $temp.SessionName = $sessions[$_].Substring(1,18).Trim()
                $temp.Username = $sessions[$_].Substring(19,20).Trim()
                $temp.Id = $sessions[$_].Substring(39,9).Trim()
                $temp.State = $sessions[$_].Substring(48,8).Trim()
                $temp.Type = $sessions[$_].Substring(56,12).Trim()
                $temp.Device = $sessions[$_].Substring(68).Trim()
                $report += $temp
            } 
        }
    }
}
End {$report}
}

Exemple d’utilisation :

# Get-RDPSession -name svctxpd01 -ErrorAction silentlycontinue

Dans le cadre d’un AD, et en s?lectionnant que certains serveurs :

import-module activedirectory
Get-RDPSession -name (get-adcomputer -Filter 'Name -like "VM_DESK*"' | select -ExpandProperty name ) | Out-GridView

Tout l’AD :

Get-RDPSession -name (get-adcomputer -Filter * | select -ExpandProperty name ) | Out-GridView

Un autre AD que l’AD principal:

Get-RDPSession -name (Get-ADComputer -Server DC_AUTRE_DOMAINE -filter 'name -like "*"' | select -ExpandProperty name ) | Out-GridView

Bref… que du bonheur !!!

Jan 272014
 

Se connecter ? tous les vCenters (si on en a plusieurs)

Connect-VIServer VC.dev
Connect-VIServer VC.acc

Sortir la liste de toutes les HBA (Fibre Channel)

Get-VMhost | Get-VMHostHBA -Type FibreChannel | Select VMHost,Device,@{N="WWN";E={"{0:X}"-f$_.PortWorldWideName}} | Sort VMhost,Device | Out-GridView

Sortir la liste de tous les identifiants BIOS (UUID) de chaque serveur

(Get-VMHost |? get-view) | select name,@{label='UUID';expression={$_.hardware.systeminfo.uuid}} | out-gridview

Sortir la liste des HOSTS, le num?ro de s?rie du chassis, l’IP de leur vCenter et l’UUID.

(Get-VMHost | get-view) | select name,
 @{label='Chassis Serial Number';expression={($_).summary.Hardware.OtherIdentifyingInfo[-1].IdentifierValue}},
@{label='vCenter IP';expression={$_.summary.ManagementServerIp}},
@{label='UUID';expression={$_.summary.hardware.uuid}} | out-gridview

xx

.summary.ManagementServerIp

 

Jan 272014
 

Cr?er le vSwitch (et conserver l’information pour y ajouter les port Group

$VirtualSwitch = New-VirtualSwitch -VMHost VESX01 -name vSwitch1 -NumPorts 256 -Nic vmnic1,vmnic4

Ou, r?cup?rer le vSwitch existant:

$VirtualSwitch=(Get-VMHostNetwork -VMHost VESX01).VirtualSwitch[1]

Cr?er les portGroup avec les vLans

New-VirtualPortGroup -Name "DMZ" -VirtualSwitch $virtualSwitch -VLanId 13
New-VirtualPortGroup -Name "FrontEnd WEB" -VirtualSwitch $virtualSwitch -VLanId 14

Et voil?…

Nov 192013
 

# Changer le comportement en cas d’erreur (get-help about_Preference_Variable)

$ErrorActionPreference='Inquire'

# OU

$ErrorActionPreference='Stop'

# Executer une commande a distance (n?cessite que les services soient configur?s via ‘Enable-PSRemoting’

Enter-PSSessionHOSTNAME

# Connaitre la version PowerShell

$PSVersionTable

# Forcer l’utilisation d’une version sp?cifique de powershell:

powershell-version2.0

# V?rifier les actions qui seront faites sans les executer r?ellement : # Ajouter le parametre ?WhatIf # Jouer avec la date:

(get-date).addDays(-7)

# Faire du caasting de valeur :

[string]$objet

# Connaitre TOUTES les donn?es renvoy?es par une fonction.

Get-Process|Get-Member

# Logguer nos actions dans un fichier de log :

Start-Transcript‘fichierdelog.txt’ Stop-Transcript

# Ne choisir que les 3 derniers enregistrements d’un tableau de donn?e:

$a=get-process $a[-3..-1]

# Filtrer les enregistrements: Chercher tous les processus powershell ou powershell_ise dont le temps d’occupation CPU a d?pass? 5 secondes.

Get-Process|Where-Object { ($_.name -eq‘powershell’-or$_.name -eq‘powershell_ise’) -and ($_.CPU -gt5 )}

# Ne conserver que quelques champs (pas un filtre)

Get-Process|Select-ObjectName,CPU,ID

# Trier les champs dans l’ordre inverse

Get-Process|sortID-Descending

# Aller chercher les valeurs Minimales et Maximales de CPU de certains processus

Get-Process-Namesvchost|sort-Objectcpu|select-First1-Last1

# Cr?er des champs suppl?mentaires calcul?s

Get-Process-Namesvchost|selectname,npm,pm, @{label=‘Somme’;expression={$_.PM +$_.NPM}}

# Boucler sur chaque record.

Get-Process-namesvchost|ForEach-Object

#Sauver des donn?es dans un fichier texte

Get-Process|out-file’fichier.txt’

get-process|select*|out-file’fichier.txt’

# Sauver la liste de tous les services d?marr?s. Ne conserver que les propri?t?s du nom de service ainsi que son statut. Le tout, tri? sur le nom du service par ordre croissant.

Get-Service|selectname,status|Where-Object { $_.status -eq« Running »} |Out-Filelab1.txt

# D?marrer tous les services dont le nom commence par la lattre ‘a’ et afficher sur la console le service qui a ?t? d?marr?.

Get-Service-name’a*’|Where-Object { $_.Status -ne‘Running’ } |ForEach-Object { $a=$_.name ; write-host« Demarrage de $a « ; Start-Service-name$a}

# ou

Get-Service-name’a*’|Where-Object { $_.Status -ne‘Running’ } |ForEach-Object { $a=$_.name ; write-host« Demarrage de $a « ; $_.Start()}

# lister les services qui commencent par ‘A’:

Get-Service-name’a*’

# ou

Get-Service|Where-Object { $_.name -like‘a*’ }

# g?n?rer un rapport indiquant la liste des processus ayant consomm? plus d’une minute de temps CPU. On ne veux que cette valeur et le nom du processus.

Get-Process|Select-Objectname,cpu|Where-Object { $_.cpu -gt1 }

# Enregistrer dans un fichier texte les 3 erreurs les plus r?centes du log systeme en ne gardant que la date, le num?ro d’erreur, et le message d’erreur.

$a=Get-EventLog-LogNameSystem?EntryTypeError $a[-3..-1]

# ou

Get-EventLog-LogNameSystem-EntryTypeError-Newest3

# Faire des statistiques

Get-Process|Measure-Objectcpu,pm-Average-Minimum-Maximum-Sum

# Trier des enregistrements, ne sortir que les 4 premiers, mais sauter les 3 premiers

Get-Process|Sort-Objectcpu-Descending|Select-Object-first4-skip3

# Sauver dans un fichier HTML les 10 derniers warnings du log systeme:

Get-EventLog-LogNameSystem-Newest10-EntryTypeWarning|ConvertTo-Html|out-file’c:\sample.html’

# On dispose d’une liste de nom de machine dans un fichier texte (1 nom de machine par ligne). On d?sire connaitre l’?tat du service ‘bits’ sur toutes ces machines

Get-Contentc:\liste.txt|ForEach-Object { get-service-nameBITS-ComputerName$_ }

#ou

get-service-nameBITS-ComputerName (Get-Content(‘C:\liste.txt’))

#Envoyer un r?sultat vers 2 directions : TEE

Get-Processpowershell*|Tee-Object-variableredirection1|Select-Objectprocessname

$redirection1

# Prendre la VALEUR sans l’objet (la valeur string par exemple)

Get-Processpowershell|select-expandPropertyname

# Lier des commandes entre elles.

# Si une commande envois des objets et qu’il n’y a pas de lien entre les noms de propri?t?s et les noms des parametres : Cr?er un LABEL

getADDomainController|select*,@{label=‘ComputerName’;expression={$_.hostname}} |get-service-nameDNS

# Cr?er un « Drive » connect? sur l’AD, la base de registre pour le parcourir comme dans un r?pertoire :

New-PSDrive-PSProviderActiveDirectory-nameAD-root’ou=sales,dc=domaine,dc=com’

set-locationAD:

# les lister :

Get-PSDrive

# Exercice : Cr?er un TREESIZE

Get-ChildItem-AttributesD|ForEach-Object {

$taille=0

Get-ChildItem-path$_.Name -Recurse|ForEach-Object {

$taille=$taille+$_.Length

}

Write-Host$_.Name $taille

}

# Sortir la liste complete de TOUTES les propri?t?s de maniere recursive

get-process|Format-Custom

# Cr?er des champs CUSTOM.

Get-Process|Format-Table-PropertyName,ID,@{n=‘VM(MB)’;

e={$PSItem.VM /1MB};

formatString=‘N2’;

align=‘right’} -AutoSize

# Afficher des donn?es sous forme de tableau graphique interractif

get-process|Out-GridView

# Faire une interface graphique de selection de records avant de passer ces elements a autre chose: ##### UTILE #####

get-process|Out-GridView-PassThru|selectprocessNameCPU

# Cr?er un objet COM pour interragir avec

$objetCom=New-Object-ComObjectwscript.network

$objetCom|Get-Member

# Bypasser la limitation qui empeche de lancer des scripts (l’ordre des parametres a de l’importance)

powershell-executionpolicyunrestricted-filec:\script.ps1

# Manipuler du WMI

Get-WmiObjectWin32_volume|Where-Object {$_.DriveLetter -eq‘C:’} |selectDriveLetter,capacity,freespace, @{label=‘EspaceLibre (Gb)’;expression={$_.freespace/1GB}}

Get-WmiObject-query’SELECT DriveLetter,Freespace FROM win32_volume WHERE DriveLetter= »C: » ‘

?

Nov 102013
 

J’ai des VMs sur un host, et je veux les envoyer sur un autre host, mais en prenant bien mon temps, car la ligne est lente et les serveurs peu puissant.

Voici comment j’ai fait :

$VMs=Get-VM -Datastore NomDuDatastore| where { $_.vmhost.name -eq "EsxSource" }
 foreach ($VM in $VMs) {
 Write-Host "------------- Moving $VM -------------" -foreground "Yellow"
 $VM | move-vm -Destination (get-vmhost "EsxDestination")
 Write-Host "------------- Moved? $VM --------------" -foreground "Green"
 Write-Host "."
 Write-Host "."
 sleep 60
 }

Concretement: Toutes les VMs qui se trouvent sur un ESX « EsxSource » ET sur le datastore « NomDuDatastore » sont envoy?es vers « EsxDestination« .

Une VM ? la fois, et en attendant 1 minute apr?s chaque transfert.

Nov 102013
 

Ouvrez une console PowerShell et indiquez ce code :

Set-Alias ngen @(
dir (join-path ${env:\windir} "Microsoft.NET\Framework") ngen.exe -recurse |
sort -descending lastwritetime
)[0].fullName
[appdomain]::currentdomain.getassemblies() | %{ngen $_.location}

Et PAF, ca fait des chocapics, ca fonctionne !