Meilleur auteur de réponses
GPO Shutdown

Question
-
Bonjour
Je reprend la gestion d'un parc informatique et découvre Windows sevrer 2012.
Après une mise à jours de nos switch par un prestataire extérieur, la création d'UO par zone et l'installation du gestionnaire d'impression, je m'attaque et butte sur la GPO :
Mon prédécesseur avait mis en place une tache planifié sur le serveur qui appelle un fichier .bat par salle contenant des commandes du type : shutdown /s /f /m:B01-PC01
Un .bat par salle et une ligne pour chaque PC de la salle dans le fichier .bat.
Cette procédure fonctionne.
Ayant créé des UO, je souhaite passer à une GPO qui réalise la même tache sans avoir à maintenir en état les fichiers .bat.
J'ai donc créé une GPO avec les même paramètres et en supprimant /m:.....
Problème cela ne fonctionne pas uniformément : dans la même salle des pc ayant la même configuration sur Win7 s'éteigne et d'autres ne s’éteigne pas.
Après une semaine de recherche infructueuse sur internet, je me tourne vers vous.
Merci d'avance pour vos lumières.
Réponses
-
Bonjour Trop Curieux,
Ayant créé des UO, je souhaite passer à une GPO qui réalise la même tache sans avoir à maintenir en état les fichiers .bat.
==> Pas la bonne méthode, je pense. En effet, avec une GPO tu ne peux pas maîtriser l'heure d'application de celle-ci. Une GPO s'applique toutes les 90 min plus ou moins 30 min.
En revanche une tâche planifiée, sur un serveur de préférence, là tu maîtrises l'heure d'éxécution.
Et pourquoi ne plus utiliser cette vieille commande shutdown ? Parce que ... dès fois ça passe, et des fois ça ne passe pas comme ça devrait ... et ça c'est génant. Oublies ces vieux .bat legacy, ça marche encore bien entendu, mais oublies, et passe à Powershell.
Il y a une simple cmdlet nommée Stop-Computer qui fait le boulot.
# Recherche des machines dans une OU donnée, ça devient du dynamique $Machines = Get-ADComputer -SearchBase <FQDN de mon OU> | Select-Object -Property Name # lancement de l'arrêt des machines dans l'OU foreach ($Computer in $Machines) { Stop-Computer -ComputerName $Computer.Name -Force }
Tu as ton script .ps1, plus qu'à le planifier ... avec un compte qui:
- dispose des droits nécessaires pour lancer une tâche ("Local System" a bien ce droit, mais n'a aucun droit sur les postes distants, il faut donc utiliser un compte de domaine ayant les droits d'administration appropriés sur ton serveur)
- dispose des droits nécessaire d'administration sur les postes distants (le même compte domaine donc).
@matteu31400
Il parle d'arrêt de postes de travail, et pas de redémarrage des serveurs. Tu n'as pas chaussé tes lunettes ce jour ou tu es fatigué.
Il est tout à fait possible de créer par GPO une tache planifiée qui fera un redémarrage du poste à une heure donnée.
==> Oui c'est possible, mais à quoi bon "distribuer via GPO", maintenir et superviser des centaines de tâches planifiées sur les machines distantes alors qu'une seule centralisée peut faire la même chose ?Plus facile à mettre en oeuvre, plus facile à maintenir, plus facile à superviser.
Nota : pour le redémarrage à une heure donnée, un script fait l'affaire, mais pour démarrer (cold boot), c'est no-way comme ceci. Il faut passer par une commande W.O.L. (Wake-On-Lan) qui peut être dans un script (.bat, .ps1), mais aussi s'assurer au préalable que les éléments réseaux ont bien été configurés correctement pour laisser passer les packets W.O.L.
cordialementOlivier
- Marqué comme réponse Trop Curieux mercredi 3 juin 2020 13:58
- dispose des droits nécessaires pour lancer une tâche ("Local System" a bien ce droit, mais n'a aucun droit sur les postes distants, il faut donc utiliser un compte de domaine ayant les droits d'administration appropriés sur ton serveur)
-
Bonjour,
Vous pouvez remplacer
$ListeOU = Get-ADOrganizationalUnit -Filter * -SearchBase 'ou=Parc Informatique, ou=Gestion, dc=DomaineIT, dc=local' | Select-Object -Property Name
par
$ListeOU = (Get-ADOrganizationalUnit -Filter * -SearchBase 'ou=Parc Informatique, ou=Gestion, dc=DomaineIT, dc=local' ).name
ou alors
foreach ($OU in $ListeOU)
par
foreach ($OU in $ListeOU.name)
ou encore
$Machines = Get-ADComputer -Filter * -SearchBase "ou=$ou,dc=audit, dc=lan"
par
$Machines = Get-ADComputer -Filter * -SearchBase "ou=$($ou.name),dc=audit, dc=lan"
Cela vous laisse l’embarras du choix :)
Merci de marquer comme reponses les interventions qui vous ont ete utile.
- Modifié matteu31400 mardi 2 juin 2020 20:55
- Marqué comme réponse Trop Curieux mercredi 3 juin 2020 13:58
Toutes les réponses
-
-
Bonjour,
l'option /M:\\machine indiquant la machine sur laquelle déclencher l'arrêt était peut être importante.
Comment fais-tu pour appliquer ta GPO à une heure donnée? Là, j'ai un gros doute.
=> Cette notion d'"horaire" n'existe pas dans les GPOs.
A bientôt,
Thierry DEMAN-BARCELO. Office Apps&Services MVP. MCSE:Enterprise admin, Messaging, Server Infrastructure 2016(89 MCPs). MCSA Office 365,Microsoft 365 Certified: Messaging Administrator Associate,Modern Desktop Administrator Associate, Security Admin https://base.faqexchange.info
-
Bonjour,
Il est tout à fait possible de créer par GPO une tache planifiée qui fera un redémarrage du poste à une heure donnée.
Toutefois, je m'interroge sur l'utilité de faire redémarrer les serveurs.... Ils sont sensé redémarrer 1 fois par mois lors des mises à jours, ce qui devrait être suffisant :)
Merci de marquer comme reponses les interventions qui vous ont ete utile.
-
il manque quelque détails dans sa présentation, car la il dit qu'il souhaite éteindre et non redémarrer, la commande /s éteint, en plus il parle des clients win7 ? je pense qu'il veut éteindre les postes dans une salle quand c'est la nuit, et les gens s'en vont sans les éteindre, cela arrive dans les écoles etc....
si c'est le cas tu peux créer une GPO qui éteint les postes à une heure précise.
Problème cela ne fonctionne pas uniformément : dans la même salle des pc ayant la même configuration sur Win7 s'éteigne et d'autres ne s’éteigne pas.
-
Bonjour Trop Curieux,
Ayant créé des UO, je souhaite passer à une GPO qui réalise la même tache sans avoir à maintenir en état les fichiers .bat.
==> Pas la bonne méthode, je pense. En effet, avec une GPO tu ne peux pas maîtriser l'heure d'application de celle-ci. Une GPO s'applique toutes les 90 min plus ou moins 30 min.
En revanche une tâche planifiée, sur un serveur de préférence, là tu maîtrises l'heure d'éxécution.
Et pourquoi ne plus utiliser cette vieille commande shutdown ? Parce que ... dès fois ça passe, et des fois ça ne passe pas comme ça devrait ... et ça c'est génant. Oublies ces vieux .bat legacy, ça marche encore bien entendu, mais oublies, et passe à Powershell.
Il y a une simple cmdlet nommée Stop-Computer qui fait le boulot.
# Recherche des machines dans une OU donnée, ça devient du dynamique $Machines = Get-ADComputer -SearchBase <FQDN de mon OU> | Select-Object -Property Name # lancement de l'arrêt des machines dans l'OU foreach ($Computer in $Machines) { Stop-Computer -ComputerName $Computer.Name -Force }
Tu as ton script .ps1, plus qu'à le planifier ... avec un compte qui:
- dispose des droits nécessaires pour lancer une tâche ("Local System" a bien ce droit, mais n'a aucun droit sur les postes distants, il faut donc utiliser un compte de domaine ayant les droits d'administration appropriés sur ton serveur)
- dispose des droits nécessaire d'administration sur les postes distants (le même compte domaine donc).
@matteu31400
Il parle d'arrêt de postes de travail, et pas de redémarrage des serveurs. Tu n'as pas chaussé tes lunettes ce jour ou tu es fatigué.
Il est tout à fait possible de créer par GPO une tache planifiée qui fera un redémarrage du poste à une heure donnée.
==> Oui c'est possible, mais à quoi bon "distribuer via GPO", maintenir et superviser des centaines de tâches planifiées sur les machines distantes alors qu'une seule centralisée peut faire la même chose ?Plus facile à mettre en oeuvre, plus facile à maintenir, plus facile à superviser.
Nota : pour le redémarrage à une heure donnée, un script fait l'affaire, mais pour démarrer (cold boot), c'est no-way comme ceci. Il faut passer par une commande W.O.L. (Wake-On-Lan) qui peut être dans un script (.bat, .ps1), mais aussi s'assurer au préalable que les éléments réseaux ont bien été configurés correctement pour laisser passer les packets W.O.L.
cordialementOlivier
- Marqué comme réponse Trop Curieux mercredi 3 juin 2020 13:58
- dispose des droits nécessaires pour lancer une tâche ("Local System" a bien ce droit, mais n'a aucun droit sur les postes distants, il faut donc utiliser un compte de domaine ayant les droits d'administration appropriés sur ton serveur)
-
Bonjour
Avant tout merci pour vos contributions.
Quel plaisir de savoir que même si l'on maitrise mal un système on peut continuer à progresser grâce aux échanges.
Je vais donc me plonger dans les scripts powershell et tester prochainement cette solution.
Cordialement
-
-
Je suppose que la rallonge est de l'humour de Geek ou d'administrateur réseau. D'ailleurs est ce le même humour ???
Je pense avoir compris le script et le testerai demain.
Le script va éteindre tous les PC présent dans le chemin défini dans <FQDN de mon OU>.
Si je souhaite que les OU se nommant NPE (Ne Pas Eteindre) ne soit pas pris en compte, quelle méthode me conseillez vous ?
cdt
-
-
Bonjour
Après plusieurs tests fructueux sur la fonction ADComputer, je butte sur 1 message d'erreur sur la fonction suivante : Stop-Computer -ComputerName B01-P02.Name -Force
Le poste existe bien et reconnu par ADComputer. Il est en fonction.
Message d'erreur : Stop-Computer : Le serveur RPC n'est pas disponible. (Exception de HRESULT : 0x800706BA)
Après plusieurs recherches sur internet et modifications de services W7 et redémarrage... rien de nouveau.
Avez vous une piste à me proposer ?
Cdt
-
-
-
-
Bonjour
Je souhaite faire évoluer la fonction mais je bute sur la syntaxe de ou=$OU dans le deuxième searchbase :
$ListeOU = Get-ADOrganizationalUnit -Filter * -SearchBase 'ou=Parc Informatique, ou=Gestion, dc=DomaineIT, dc=local' | Select-Object -Property Name foreach ($OU in $ListeOU) { Write-Output $OU $Machines = Get-ADComputer -Filter * -SearchBase "ou=$ou, ou=Parc Informatique, ou=Gestion, dc=DomaineIT, dc=local" | Select-Object -Property Name # lancement de l'arrêt des machines dans l'OU foreach ($Computer in $Machines) { Write-Output $Computer #Stop-Computer -ComputerName $Computer.Name -Force } }
Le message d'erreur envoyé est :
Get-ADComputer : La syntaxe du nom de l’objet est incorrecte Au caractère Ligne:8 : 17 + $Machines = Get-ADComputer -Filter * -SearchBase "ou=$ou, ou=Parc Informatiq ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Get-ADComputer], ADException + FullyQualifiedErrorId : ActiveDirectoryServer:8335,Microsoft.ActiveDirectory.Management.Commands.GetADComputer
Pouvez vous m'aider SVP.
Cdt
Trop Curieux
-
Bonjour,
Vous pouvez remplacer
$ListeOU = Get-ADOrganizationalUnit -Filter * -SearchBase 'ou=Parc Informatique, ou=Gestion, dc=DomaineIT, dc=local' | Select-Object -Property Name
par
$ListeOU = (Get-ADOrganizationalUnit -Filter * -SearchBase 'ou=Parc Informatique, ou=Gestion, dc=DomaineIT, dc=local' ).name
ou alors
foreach ($OU in $ListeOU)
par
foreach ($OU in $ListeOU.name)
ou encore
$Machines = Get-ADComputer -Filter * -SearchBase "ou=$ou,dc=audit, dc=lan"
par
$Machines = Get-ADComputer -Filter * -SearchBase "ou=$($ou.name),dc=audit, dc=lan"
Cela vous laisse l’embarras du choix :)
Merci de marquer comme reponses les interventions qui vous ont ete utile.
- Modifié matteu31400 mardi 2 juin 2020 20:55
- Marqué comme réponse Trop Curieux mercredi 3 juin 2020 13:58
-
Bonjour
étant un peu fainéant je choisis la 3éme solution qui fonctionne très bien
Merci beaucoup
Trop Curieux
- Marqué comme réponse Trop Curieux mercredi 3 juin 2020 14:01
- Non marqué comme réponse Trop Curieux mercredi 3 juin 2020 14:01
-
Bonjour
Grace à votre aide j'ai pu découvrir le langage PowerShell, je souhaite donc partager ma réalisation qui correspond exactement à mes besoins :
Write-Output "Date de début : $(Get-Date)" $ListeOU = Get-ADOrganizationalUnit -Filter * -SearchBase 'ou=Parc Informatique, ou=Gestion, dc=audit, dc=local' -SearchScope OneLevel | Select-Object -Property Name | Sort-Object -Property Name foreach ($OU in $ListeOU) { Write-Output "Salle : $($OU.name)" # lancement de l'arrêt des machines dans l'OU if($ou.Name -eq "NePasEteindre"){ Write-Output "Non traité : $($OU.Name)" } else{ $Machines = Get-ADComputer -Filter * -SearchBase "ou=$($ou.name), ou=Parc Informatique, ou=Gestion, dc=audit, dc=local" -SearchScope OneLevel | Select-Object -Property Name | Sort-Object -Property Name foreach ($Computer in $Machines) { Write-Output " $($Computer.name)" #Stop-Computer -ComputerName $Computer.Name -Force } } } Write-Output "Date de fin : $(Get-Date)"
Merci à tous
Trop Curieux
-
Bonjour
Suite des opérations, maintenant beaucoup plus de PC sont mis en service quotidiennement, je me suis aperçu que le script ci-dessus présente une faille.
Le Script renvoi un message d'erreur "Le serveur RPC n'est pas disponible" dans 2 cas :
- le PC est éteint => pas de problème
- le PC est en veille simple ou prolongée :
Après des recherches j'ai constaté que les cartes réseau sont configurés sur la fonction réveil avec la notion de paquet magique pouvant donc être réveillé par l'envoi d'une commande avec l'adresse MAC.
N'ayant pas les adresses MAC dans l'AD, il semblerait donc nécessaire de les collecter pour pouvoir réveiller les PC et leur demander de s'éteindre => opération qui me semble complexe avec notamment Getmac.....
Je vois donc 2 solutions :
- simple : je désactive la notion de paquet magique et une simple commande d'appel du PC réveille le PC,
- soit je collecte l'adresse MAC : galère en perspective...
Voyez vous d'autres solutions, à part couper le courant des prises informatique ?
Trop Curieux
-
Bonjour,
Hé oui, un script n'est pas seulement un alignement de cmdlets les unes derrières les autres, ça serait trop facile. Tu viens de mettre le doigt sur le plus délicat ... la gestion des erreurs.
Ci-dessous les réflexions que je me fais sur ta préoccupation. Il y a peut-être d'autres pistes à exploiter.
Tu écris [...le PC est éteint => pas de problème...]. Non. Ca génère une erreur dans le Stop-Computer. Il faut gérer cela. Tu ne dois exécuter Stop-Computer que si la machine est Online. Un petit if (Test-Connexion $Computer) {stop-Computer $Computer} et tu règles cette question.
Reste la question du [....le PC est en veille simple ou prolongée...] à traiter.
Comment aborder cet aspect ?Envisager de configurer les postes (par GPO) pour qu'ils ne se mettent pas en veille ou alors seulement extinction de l'écran (pas la carte réseau et pas le disque) et encore moins la veille prolongée ? Pourquoi pas ! Dans ce cas, ça pourrait régler ton soucis.Simple à mettre en oeuvre. Penser à ne pas autoriser l'utilisateur à changer cette conf. cependant.
Relever les MacAddress ? Possible, mais il faudrait collecter NomMachine, MacAddress et mettre ça dans un .csv que ton script pourrait utiliser. Fichier qu'il te faudrait mettre à jour régulièrement en fonction de l'évolution de ton parc. De plus, il faudrait que les cartes réseaux acceptent les magicPackets et ce n'est pas le cas de toutes les cartes, ... et que les cartes aient été configurées pour ça (encore un truc à param). Enfin, si tu as plusieurs VLAN, il faut que les équipements réseaux aient été configurés pour laisser passer les magipackets du W.O.L. (ça ne passe pas les switchs et les routeurs par d&faut car c'est du broadcast). Encore un truc supplémentaire à prévoir. Galères en perspective.
Perso, je vois bien vers quelle solution je m'orienterais, mais fais ton choix. :-)
Bon courage, tu tiens le bon bout.
cordialement
Olivier