PowerShell : introduction

icone Powershell

PowerShell : filtres, boucles, box, conditions

Les Filtres PowerShell

Logical Operator

Description

Equivalent LDAP operator/expression

-eq

Equal to. This will not support wild card search.

=

-ne

Not equal to. This will not support wild card search.

! x = y

-like

Similar to -eq and supports wildcard comparison. The only wildcard character supported is: *

=

-notlike

Not like. Supports wild card comparison.

! x = y

-approx

Approximately equal to

~=

-le

Lexicographically less than or equal to

<=

-lt

Lexicographically less than

! x >= y

-ge

Lexicographically greater than or equal to

>=

-gt

Lexicographically greater than

! x <= y

-and

AND

&

-or

OR

|

-not

NOT

!

-bor

Bitwise OR

:1.2.840.113556.1.4.804:=

-band

Bitwise AND

:1.2.840.113556.1.4.803:=

-recursivematch

Uses LDAP_MATCHING_RULE_IN_CHAIN (Win2k3 SP2 and above)

:1.2.840.113556.1.4.1941:=

 

Example 1:  Get all entries

        Get-ADObject -Filter { ObjectClass -like “*” }

        LDAP Filter Equivalent: (objectClass=*)

Example 2: Get entries containing “bob” somewhere in the common name

        Get-ADObject -Filter { CN -like “*bob*” }

        LDAP Filter Equivalent:  (cn=*bob*)

Example 3: Get entries with a bad password count greater than five

        Get-ADUser -Filter { badpwdcount -ge 5 }

        LDAP Filter Equivalent: (badpwdcount>=5)

Example 4: Get all users with an e-mail attribute

        Get-ADUser -filter { email -like “*” }

        -or-

        Get-ADObject -filter { email -like “*” -and ObjectClass -eq “user” }

        LDAP Filter Equivalent: (&(objectClass=user)(email=*))

Example 5: Get all user entries with an e-mail attribute and a surname equal to “smith”

        Get-ADUser -Filter { Email -like “*” -and Surname -eq “smith” }

        -or-

        Get-ADUser -Filter { Email -like “*” -and sn -eq “smith” }

        LDAP Filter Equivalent: (&(sn=smith)(objectClass=user)(email=*))

Example 6: Get all user entries with a common name that starts with “andy” and users with a common name of “steve” or “margaret”

        Get-ADUser -Filter { CN -like “andy*” -or CN -eq “steve” -or CN -eq “margaret” }

        -or-

        Get-ADObject -Filter { objectClass -eq “user” -and (CN -like “andy*” -or CN -eq “steve” -or CN -eq “margaret”) }

        LDAP Filter Equivalent: (&(objectClass=user) | (cn=andy*)(cn=steve)(cn=margaret))

Example 7: Get all entries without an e-mail attribute

        Get-ADUser -Filter { -not Email -like “*” }

        -or-

        Get-ADUser -Filter { Email -notlike “*” }

        LDAP Filter Equivalent: (!(email=*))

Example 8: Get all users who did not logon since January 1, 2007

        $date = new-object System.DateTime -ArgumentList @(2007,1,1,0,0,0)

        Get-ADUser -Filter { -not LastLogon -le $date }

        LDAP Filter Equivalent:  (&(lastlogon<=X)(objectClass=user))

        ## where X is number of 100-nanosecond slices since Jan 1st 1601

Example 9: Get all users who have logged on in the last 5 days

        $date = (get-date) – (new-timespan -days 5)

        Get-ADUser -Filter { lastLogon -gt $date }

        LDAP Filter Equivalent:  (&(lastLogon>=128812906535515110) (objectClass=user)(!(objectClass=computer)))

Example 10: Get all security groupsLSA AD sécurité

The following example query string searches for group objects that have the ADS_GROUP_TYPE_SECURITY_ENABLED flag (0x80000000 = 2147483648) set.

        Get-ADGroup -filter { groupType -band 0x80000000 }

        -or-

        Get-ADGroup -filter { GroupCategory -eq “Security” }

        LDAP Filter Equivalent: (&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648))

Example 11: Check if a user is a member of a group (recursively)

The following example query string uses the LDAP_MATCHING_RULE_IN_CHAIN, which is a matching rule OID that is designed to provide a method to look up the ancestry of an object.

        Get-ADUser -Filter { memberOf -RecursiveMatch “CN=Administrators,CN=Builtin,DC=domain,DC=com” } -SearchBase “CN=Administrator,CN=Users,DC=domain,DC=com”  -SearchScope Base

                      ## NOTE: The above command will return the user object (Administrator in this case) if it finds a match recursively in memberOf attribute.

        -or-

        $userObj = Get-ADUser Administrator
        $groupObj = Get-ADUser Administrators

        Get-ADUser -Filter { memberOf -RecursiveMatch $userObj.DistinguishedName } -SearchBase $groupObj.DistinguishedName -SearchScope Base

        LDAP Filter Equivalent: (memberof:1.2.840.113556.1.4.1941:=(CN=Administrators,CN=Builtin,DC=domain,DC=com)))

<https://blogs.msdn.microsoft.com/adpowershell/2009/04/14/active-directory-powershell-advanced-filter-part-ii/>

 

Pour d'autres exemples concret, faites une recherche sur le blog via les étiquettes ou le choix des catégories dans le menu déroulant, le tout à droite de la page.

Les boucles

While

$nb = 0

$tab = 0..9

while ($nb -lt $tab.length)

{Write-Host $tab[$nb]

$nb++}

 

Do-While

Can repeat a set of commands while a condition is met

$a=1 Do {$a; $a++} While ($a –lt 10)

 

Do {Write-Host 'Entrez une valeur entre 0 et 10'

[int]$var = Read-Host}

While( ($var -lt 0) -or ($var -gt 10))

 

$dtmtime = Get-Date -Hour 10 -Minute 10 -Second 00

Do {$dtmCurrent = Get-Date -DisplayHint Time

"The current time is " + $dtmCurrent

"counting to " + $dtmtime

Start-Sleep -Seconds 10}

while ($dtmCurrent -lt $dtmtime)

"time reached `a"

 

Do-Until

Can repeat a set of commands until a condition is met

$a=1

Do {$a; $a++}

Until ($a –gt 10)

 

$i=0;

do {$i++; "i is equal to $i"}

until ($i -eq 0)

 

Try Catch Finally

Try
{New-VM -VMMServer $VMMServer ...   }

catch [System.Net.WebException],[System.Exception]  {Write-Host "Other exception"}

finally {Write-Host "cleaning up ..."}

 

For

[:label] for ([initializer]; [condition]; [iterator]) {}

for ($i = 0; $i –lt 5; $i++) {Write-Object $i}

 

Repeat the same steps a specific number of times

For ($a=1; $a –le 10; $a++) {$a}

 

$tab = 0..99

For ($i=0 ;$i -le 9 ; $i++)

{Write-Host $tab[$i]}

 

for ($a = 1; $a -le 3 ; $a++) {"hello world"}

 

[int]$intping =10

[string]$Intnetwork = "127.0.0.1"

 

Exemple : Ping adresse et résultat

for ($i=1;$i -le $intping; $i++)

{ $strQuery = "select * from win32_pingstatus where address = '" + $Intnetwork + $i + "'"

$wmi = Get-WmiObject -query $strQuery

"Pinging $intNetwork ..."

if ($wmi.statuscode -eq 0)

{"success"}

else { "error:" + $wmi.statuscode + " occured" }}

 

Foreach

Loop Through Collection of Objects 

foreach (identifier in collection) {}

Expression | foreach {}

Expression | foreach {BEGIN{} PROCESS{} END{}}

 

Foreach ($i in Get-Childitem c:\windows) {$i.name; $i.creationtime}

 

foreach ($element in Get-Process)

{ write-host "$($element.name) démarré le :

$($element.StartTime)"}

 

get-process | foreach{$_.Name} | sort -Unique

 

$args = "localhost","loopback","172.0.0.1"

foreach ($i in $args)

{         $strfile="C:\thomas\" + $i + "Processes.txt"

Write-Host "testing" $i "please wait...";

Get-WmiObject -ComputerName $i -Class win32_process |

Select-Object name, processID, priority, threadcount, pagefaults, pagefileusage | where {!$_.processID -eq 0} | Sort-Object -Property name | ft | Out-File $strfile

}

 

#Assembly Load and dialogue box definition

[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")|Out-Null

$MsgBox1 = [Windows.Forms.MessageBox]

$Bouton=[Windows.Forms.MessageBoxButtons]::YesNo

$Icon=[windows.forms.MessageBoxIcon]::Information

 

$array=@{"VM Name"=$VMName;"VM Host"=$VMHost;"VM Disk Size"=$VMDiskSize;"Memory size in MB"=$MemoryMB;"CPU Count"=$CPUCount;"Enable Time sync"=$EnableTimesync;"Hardware Profile"=$HardwareProfile;"Highly Available VM"=$HighlyAvailableVM}

#$array=@(VM Name : $VMName","VM Host : $VMHost","VM Disk Size : $VMDiskSize","Memory size in MB : $MemoryMB","CPU Count : $CPUCount","Enable Time sync : $EnableTimesync","Hardware Profile : $HardwareProfile","Highly Available VM : $HighlyAvailableVM")

#$args = $VMName,$VMHost,$VMDiskSize,$MemoryMB,$CPUCount,$EnableTimesync,$HardwareProfile,$HighlyAvailableVM

 

Foreach + Message box

foreach ($r in $array){

$Click = $MsgBox1::show("$r","Check data if correct",$Bouton,$Icon)

 

if ($click -eq [Windows.Forms.DialogResult]::Yes) {

$MsgBox1Yes = [Windows.Forms.MessageBox]

$BoutonYes=[Windows.Forms.MessageBoxButtons]::Ok

$IconYes=[windows.forms.MessageBoxIcon]::Information

$MsgBox1Yes::show("You said $click for $r","Right data",$BoutonYes,$IconYes)

}

else {

$MsgBox1No = [Windows.Forms.MessageBox]

$BoutonNo=[Windows.Forms.MessageBoxButtons]::Ok

$IconNo=[windows.forms.MessageBoxIcon]::Information

$MsgBox1No::show("You said $click, script stop here! ","Fasle information",$BoutonNo,$IconNo)

}}

 

$wmi = get-wmiobject win32_processor

If ($wmi.Architecture -eq 0)

{"This is an x86 computer"}

Elseif($wmi.architecture -eq 1)

Conditions

 

if (condition) {…}

Ex :

If($ProdNIC -ne "Production"){

Rename-NetAdapter -Name $ProdNIC.name -NewName "Production"}

 

elseif (condition) {…}

else {…}

 

switch

switch (test ou évaluation de valeur) { valeur1 { code à exécuter si test est égal à valeur1;break } valeur2 { code à exécuter si test est égal à valeur2;break } valeur3 { code à exécuter si test est égal à valeur3;break } default { code à exécuter si test est égal à aucune des autres valeurs } }

switch (test ou évaluation de valeur) {

valeur1 { code à exécuter si test est égal à valeur1;break }

valeur2 { code à exécuter si test est égal à valeur2;break }

valeur3 { code à exécuter si test est égal à valeur3;break }

default { code à exécuter si test est égal à aucune des autres valeurs }

}

 

Write-Host 'entrez une chaine'

$chaine1 = Read-Host

switch -regex ($chaine1)

{

'^[aeiouy]' {Write-Host 'La chaine commence par une voyelle'}

'^[bcdfghjklmnpqrstvwxz]' {Write-Host 'La chaine commence par une consonne'}

'^[0-9]' {Write-Host 'La chaine commence par un chiffre'}

}

 

$nombre = read-host 'Entrez un nb compris entre 1 et 5 '

switch ($nombre)

{

1 {Write-Host 'le 1 '}

2 {Write-Host 'le 2 '}

3 {Write-Host 'le 3 '}

4 {Write-Host 'le 4 '}

5 {Write-Host 'le 5 '}

Default {Write-Host "`n le nb n'est pas dans la liste proposée"}

}

 

$a = "r14151"

switch -regex ($a)
{
"[a-d]" {"The color is red."}
"[e-g]" {"The color is blue."}
"[h-k]" {"The color is green."}
"[l-o]" {"The color is yellow."}
"[p-s]" {"The color is orange."}
"[t-v]" {"The color is purple."}
"[w-y]" {"The color is pink."}
"[z]" {"The color is brown."}
default {"The color could not be determined."}
}
$a = "14151"

switch -regex ($a)
{
"\d{8}" {"The color is red."}
"\d{7}" {"The color is blue."}
"\d{6}" {"The color is green."}
"\d{5}" {"The color is yellow."}
"\d{4}" {"The color is orange."}
"\d{3}" {"The color is purple."}
"\d{2}" {"The color is pink."}
"\d{1}" {"The color is brown."}
default {"The color could not be determined."}
}

 

$a = « 14151 »

switch -regex ($a)
{
"\d{8}" {"The color is red.”; break}
"\d{7}" {"The color is blue.”; break}
"\d{6}" {"The color is green.”; break}
"\d{5}" {"The color is yellow.”; break}
"\d{4}" {"The color is orange.”; break}
"\d{3}" {"The color is purple.”; break}
"\d{2}" {"The color is pink.”; break}
"\d{1}" {"The color is brown.”; break}
default {"The color could not be determined."}
}
$a = 21, 38, 6

switch ($a)
{
1 {"The color is red."}
2 {"The color is blue."}
3 {"The color is green."}
4 {"The color is yellow."}
5 {"The color is orange."}
6 {"The color is purple."}
7 {"The color is pink."}
8 {"The color is brown."}
}

<https://technet.microsoft.com/en-us/library/ff730937.aspx>

 

Exemple de  script « enabled/disabled usb drive »

#Run Only with Run as Administrator (for powershell)

$cdDvdRom_State = Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\services\cdrom"

Switch ($cdDvdRom_State.Start)

{

4{Write-Host "CD/DVD-ROM is Disable" ; $e = (Read-Host "If you want Disabled CD/DVD-ROM Push E") ;

If($e -eq "e") {

Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\services\cdrom" -name start -Value 3 ;

Write-Host "Now CD/DVD-ROM is Enabled !" -ForegroundColor Red

}}

 

{Write-Host "CD/DVD-ROM is Enabled" ; $d = (Read-Host "If you want Disabled CD/DVD-ROM Push D") ;If($d -eq "d") {

Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\services\cdrom" -name start -Value 4 ;

Write-Host "Now CD/DVD-ROM is Disabled !" -ForegroundColor Red

}}}

Read-Host "Push <Enter> for exit!"

Dialog Box

Pour la valeur de “$message”, c’est une simple chaine (string) libre à vous …

Pour la valeur de “$titre”, c’est également une simple chaine (string) libre à vous …

Pour la valeur de “$btn”, c’est l’une des valeurs numériques suivantes :

0 : OK

1 : OK Cancel

2 : Abort Retry Ignore

3 : Yes No Cancel

4 : Yes No

5 : Retry Cancel

 

Pour la valeur de “$Icon, c’est l’une des valeurs numériques suivantes :

0 : Aucune icône

16 : Erreur – Croix sur fond rouge32 : Question – Point d’interrogation sur fond bleu

48 : Avertissement – Point d’exclamation sur fond jaune

64 : Information – Point d’exclamation sur fond bleu

 

  • Charger l’Assembly .Net correspondante

$MaMsgBox = [Windows.Forms.MessageBox] #Placé dans une variable

[void]: Permet de définir que le chargement se fera sans en silence (peut-être remplacé par un pipe |Out-Null

LoadWithPartialName: Attention elle est obsolète et est remplacé par Load() voir le site MSDN

  • Définir Le message, l’icone, les boutons et le titre

 

$Monbouton=[Windows.Forms.MessageBoxButtons]::OK

 

Foreach + Message box

foreach ($r in $array){

$Click = $MsgBox1::show("$r","Check data if correct",$Bouton,$Icon)

if ($click -eq [Windows.Forms.DialogResult]::Yes){

$MsgBox1Yes = [Windows.Forms.MessageBox]

$BoutonYes=[Windows.Forms.MessageBoxButtons]::Ok

$IconYes=[windows.forms.MessageBoxIcon]::Information

$MsgBox1Yes::show("You said $click for $r","Right data",$BoutonYes,$IconYes)

}

else{

$MsgBox1No = [Windows.Forms.MessageBox]

$BoutonNo=[Windows.Forms.MessageBoxButtons]::Ok

$IconNo=[windows.forms.MessageBoxIcon]::Information

$MsgBox1No::show("You said $click, script stop here! ","Fasle information",$BoutonNo,$IconNo)

}}

 

MsgBox et affichage réponse sur autre MsgBox

#Chargement des Assembly

[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")|Out-Null

#Définition de la Boite de dialogue

$MsgBox1 = [Windows.Forms.MessageBox]

$Bouton=[Windows.Forms.MessageBoxButtons]::YesNo

$Icon=[windows.forms.MessageBoxIcon]::Information

#Affichage de la boite de dialogue

$Click = $MsgBox1::show("Mon Message","Message Box",$Bouton,$Icon)

if ($click -eq [Windows.Forms.DialogResult]::Yes){

$MsgBox1Yes = [Windows.Forms.MessageBox]

$BoutonYes=[Windows.Forms.MessageBoxButtons]::Ok

$IconYes=[windows.forms.MessageBoxIcon]::Information

$MsgBox1Yes::show("Vous voulez dire $click","Click sur OUI",$BoutonYes,$IconYes)

}

else{

$MsgBox1No = [Windows.Forms.MessageBox]

$BoutonNo=[Windows.Forms.MessageBoxButtons]::Ok

$IconNo=[windows.forms.MessageBoxIcon]::Information

$MsgBox1No::show("Vous voulez dire $click","Click sur Non",$BoutonNo,$IconNo)

}

Fonctions show message box

function Show-Message

param (

[string]$Message = "Veuillez entrer votre message",

[string]$Titre = "Titre de la fenêtre",

[switch]$OKCancel,

[switch]$AbortRetryIgnore,

[switch]$YesNoCancel,

[switch]$YesNo,

[switch]$RetryCancel,

[switch]$IconErreur,

[switch]$IconQuestion,

[switch]$IconAvertissement,

[switch]$IconInformation

)

 

Affecter la valeur selon le type de boutons choisis

if ($OKCancel) { $Btn = 1 }

elseif ($AbortRetryIgnore) { $Btn = 2 }

elseif ($YesNoCancel) { $Btn = 3 }

elseif ($YesNo) { $Btn = 4 }

elseif ($RetryCancel) { $Btn = 5 }

else { $Btn = 0 }

 

Affecter la valeur pour l’icone

if ($IconErreur) {$Icon = 16 }

elseif ($IconQuestion) {$Icon = 32 }

elseif ($IconAvertissement) {$Icon = 48 }

elseif ($IconInformation) {$Icon = 64 }

else {$Icon = 0 }

 

 

Charger la bibliothèque d’objets graphiques Windows.Forms

[System.Reflection.Assembly]::LoadWithPartialName(« System.Windows.Forms ») | Out-Null

 

Afficher la boite de dialogue et renvoyer la valeur de retour (bouton appuyé)

$Reponse = [System.Windows.Forms.MessageBox]::Show($Message, $Titre , $Btn, $Icon)

Return $Reponse

}

Show-Message -Message "Est ce bien ceci ?" -Titre "Vérification données" -YesNoCancel

Regex : expression régulières

Classes de caractères

Le tableau qui suit présente le mode d’emploi des classes de caractères.

#gr[ioa]s# Chaîne qui contient « gris », ou « gros », ou « gras ».
[a-z] Caractères minuscules de a à z.
[0-9] Chiffres de 0 à 9.
[a-e0-9] Lettres de « a » à « e » ou chiffres de 0 à 9.
[0-57A-Za-z.-] Chiffres de 0 à 5, ou 7, ou lettres majuscules, ou lettres minuscules, ou un point, ou un tiret.
#[^0-9]# Chaîne ne contenant PAS de chiffres.
#^[^0-9]# Chaîne ne commençant PAS par un chiffre.

Quantificateurs

#a?# « a » peut apparaître 0 ou 1 fois.
#a+# « a » doit apparaître au moins 1 fois.
#a*# « a » peut apparaître 0, 1 ou plusieurs fois.
#bor?is# « bois » ou « boris ».
#Ay(ay|oy)*# Fonctionne pour Ay, Ayay, Ayoy, Ayayayoyayayoyayoyoyoy, etc.
#a{3}# « a » doit apparaître 3 fois exactement (« aaa »).
#a{3,5}# « a » doit apparaître de 3 à 5 fois (« aaa », « aaaa », « aaaaa »).
#a{3,}# « a » doit apparaître au moins 3 fois (« aaa », « aaaa », « aaaaa », « aaaaaa », etc.)

Métacaractères

! ^ $ ( ) [ ] { } | ? + * .

Pour utiliser un métacaractères dans une recherche, il faut l’échapper avec un antislash : .

#Hein?# Cherche « Hei » ou « Hein ».
#Hein\?# Cherche « Hein? ».

Les métacaractères n’ont pas besoin d’être échappés dans une classe, sauf pour « # » (symbole de fin de la regex), « ] » (symbole de la fin de la classe) et « \ » (si votre classe recherche un antislash) que l’on doit faire précéder d’un antislash.

Si on veut rechercher un tiret dans une classe de caractères, il faut le placer au début ou à la fin de la classe : [a-zA-Z0-9-].

Classes abrégées

Les classes abrégées sont supportées uniquement par les regex PCRE.

\d [0-9]
\D [^0-9]
\w [a-zA-Z0-9_]
\W [^a-zA-Z0-9_]
\t Tabulation
\n Saut de ligne
\r Retour chariot
\s Espace blanc (correspond à \t\n\r)
\S N’est PAS un espace blanc (\t\n\r)
. Classe universelle

Le point est la classe universelle : il signifie « n’importe quel caractère ».

Capture et remplacement

En utilisant la fonction preg_replace on peut automatiquement faire des remplacements à l’aide de regex.

<?php

$texte = preg_replace(‘#[b](.+)[/b]#i’, ‘$1‘, $texte);

?>

  • Les parenthèses servent à entourer un bout de la regex pour créer des variables $1, $2, $3, etc. qui seront utiles pour faire le remplacement.
  • Il peut y avoir jusqu’à 99 parenthèses capturantes, donc jusqu’à $99.
  • (?:texte) est une parenthèse non capturante : elle ne crée pas de variable.
  • Une variable $0 est toujours créée et correspond à l’ensemble de la regex.

Ainsi, la regex suivante…

#(anti)co(?:nsti)(tu(tion)nelle)ment#

… crée les variables suivantes :

  • $0 : anticonstitutionnellement ;
  • $1 : anti ;
  • $2 : tutionnelle ;
  • $3 : tion.

Options

Il existe de nombreuses options que l’on peut utiliser avec les regex PCRE.

Parmi les trois que nous sommes le plus souvent amenés à utiliser, il y a :

  • i : la regex ne fera plus la différence entre majuscules / minuscules ;
  • s : le point (classe universelle) fonctionnera aussi pour les retours à la ligne (\n) ;
  • U : mode « Ungreedy » (pas gourmand). Utilisé pour que la regex s’arrête le plus tôt possible. Pratique par exemple pour le bbCode [b][/b] : la regex s’arrêtera à la première occurrence de [/b].

 

Script pour scanner des cartes réseaux

Get-NetAdapter

$serverName = Read-Host “Enter server name”

$NicConfig = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $serverName

$NicConfig | Format-List *

 

The one thing I was missing though, is the value of the NIC Speed and Duplex. So I started to dig into the registry and found a way to discover these values.

The following key holds the information I’m looking for:

HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}

 

Renommer une carte réseau 

$ProdNIC = Get-NetAdapter | where {($_.LinkSpeed -eq "1 Gbps" -and $_.Status -eq "up")}

If($ProdNIC -ne "Production") {

Rename-NetAdapter -Name $ProdNIC.name -NewName "Nom de la Carte"}

 

Modifier la vitesse sur les paramètres carte réseau

$SpeedProdNIC = Get-NetAdapterAdvancedProperty -DisplayName "Speed & Duplex" | where {($_.Name -eq "Production")}

If($SpeedProdNIC.DisplayName -ne "1.0 Gbps Full Duplex"){

Set-NetAdapterAdvancedProperty -Name $SpeedProdNIC -DisplayValue "1.0 Gbps Full Duplex" -Name $SpeedProdNIC.DisplayName }

 

Faire un check avant promotion des DC virtuel

# Renommage des NIC d'administration

$ProdNIC = Get-NetAdapter | where {($_.LinkSpeed -eq "1 Gbps" -or "10 Gbps" -and $_.Status -eq "up")}

If($ProdNIC -ne "administration") {

Rename-NetAdapter -Name $ProdNIC.name -NewName "administration"

}

 

Disable NLA

 

$TSObj = Get-WMIObject -Class Win32_TSGeneralSetting -Namespace Root\CIMV2\TerminalServices $TSObj.SetUserAuthenticationRequired(1)Pour d’autres exemples concret, faites une recherche sur le blog via les étiquettes ou le choix des catégories dans le menu déroulant, le tout à droite de la page.


[wpedon id=2046]

Laisser un commentaire