Eteindre tous les PC du domaine -- Mon premier script en powerShell

Je découvre le powershell sur un windows serveur 2008.

Le but était de remettre en place un script en tâche planifiée et qui force l'extinction des ordinateurs du LAN (au moins une fois par semaine), à cause de tous les sagoins qui ne les éteignent jamais, et que du coup mes GPO ne s'appliquent pas!!!!

Bien évidement il fallait exclure les serveurs et quelques PC. Pour ça, j'ai créé un groupe "serveurs" dans la partie "computers" de l'active directory. Dans le script renseignez $groupToExclude="serveurs" par éventuellement un autre groupe. Je critiquerai le powershell après, dans l'immédiat, Voici le script:

Petite précision: si les ordinateurs du LAN ont un parefeu trop contraignant, ça ne marchera pas: tous ceux qui partagent un dossier ou une imprimante, ce sera OK le port est ouvert, pour les autres ouvrir le port 445.

#########################################################################################
#Chope la liste des ordinateurs de l'active directory et leur demande de s'éteindre	
#Get computers list from active directory and shutdown each of them.			
#											
#Script rédigé par Gnieark https://blog-du-grouik.tinad.fr septembre 2012		
#											
#En pompant ce script du site powershell-scripting.com 					
#http://www.powershell-scripting.com/telechargements/list-group.ps1			
#qui liste les membres d'un groupe							
#											
#et en pompant sensei.dje sur "Blog de Sys Admin"					
#http://blog.developpez.com/sysadmin/p10038/powershell/lister_les_ordinateurs_d_un_domaine_ad_e
#Mais je ne le remercie pas, car son URL dépasse le cadre de cette entête :p		
#########################################################################################

#lister du groupe ne pas éteindre

$groupToExclude="serveurs"
$message="Les ordinateurs du CH du Bois Petit s'éteignent automatiquement à 23h afin d'économiser un peu d'électricité (l'économie est estimée à 100€ par an par ordinateur éteind la nuit). De plus certaines mises à jour ne peuvent etre appliquées qu'au démarrage des ordinateur... faut donc les éteindre de temps en temps. Vous pourrez cependant rallumer l'ordinateur juste après son arret."



function decomp($chaine){
  $fin=$chaine.IndexOf(",")
  $debut=$chaine.IndexOf("=")+1
  $chaine=$chaine.Substring($debut,$($fin-$debut))
  return $chaine	
}

##########Lister les ordinateurs à ne pas éteindre################

$cpt=0
$trouve=0
$ldapQuery = "(&(objectCategory=group))"     # Requête sur le type Groupe
$de = new-object system.directoryservices.directoryentry
$ads = new-object system.directoryservices.directorysearcher -argumentlist $de,$ldapQuery
$ads.PageSize=1000                   # On ne limite pas le nombre de recherche à 1000
$grouplist = $ads.findall()

$suggestions = $listPcExclus =  ,""

foreach ($i in $grouplist)   # boucle pour parcourir les groupes
{
  $cpt++               
  $groupe=decomp($i.path)
  if($groupe.toupper() -eq  $groupToExclude.toupper())       # Comparaison avec le groupe recherché
  {
    $mem = $i.GetDirectoryEntry().member
    foreach($member	in $mem)      # On parcourt la liste des membres
    {
      $member_special = $member
      $index = $member.indexof("/")

      if($index -ne -1)      # Si le nom contient un "/"
      {
	$member = $member.replace("/","\/")
      }	
      $name = ([ADSI]"LDAP://$member")		
      # traitement des membres du groupe trouvé
      if(([string]$name.displayname).length -lt 1)
      {
	$res=decomp($member_special)
	$listPcExclus = $listPcExclus + $res  # On ajoute le nom au tableau
      }
      else
      {
	$listPcExclus = $listPcExclus + $name.displayname    # On ajoute le nom au tableau
      }
    }		
    break
  }
}

#################Eteindre les PC du domaine###############"

$filtre = "(objectCategory=Computer)"
$domaine = New-Object System.DirectoryServices.DirectoryEntry
$chercheur = New-Object System.DirectoryServices.DirectorySearcher
$chercheur.SearchRoot = $domaine
$chercheur.PageSize = 1000
$chercheur.Filter = $filtre

# Ajout de la propriété que l'on recherche...
$prop = "name"
foreach ($i in $prop){$chercheur.PropertiesToLoad.Add($i)}

$colResults = $chercheur.FindAll()

foreach ($objResult in $colResults) {
  $objItem = $objResult.Properties
	$pc=$objItem.name
  if ($listPcExclus -notcontains $objItem.name){
    shutdown -s -m \\$pc
  }
}

Critique du powershell que je découvre.(jsuqu'à présent le .bat m'avait suffi, et pour des trucs un peu plus travaillés j'utilise le shell d'un serveur linux).

C'est génial d'avoir acces des bibliothèques d'administration "SYS admin", sans devoir tout recoder. Pour le script ci dessus, c'est le langage de script idéal cependant. C'est quoi ce langage!!!?

  • ARGHHHHH! @zigazou ne me trouve pas tres rigoureux dans ma façon de coder, mais avec ce genre de langage, c'est l'horreur. un espace sert à concaténer des chaines de caractères par exemple, grrr. regardez.
  • Je n'ai trouvé aucun bon référentiel du langage
Page top