Question
Script powershell de nettoyage de pofils
- laucaz
-
Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 48
- Remerciements reçus 0
Je vous expose mon pb.
J'ai pas mal de serveurs W2k3 et w2k8 qui stockent pas mal de profils utilisateurs liés à des cxion TSE ou CITRIX. Mais ces serveurs stockent aussi des comptes locaux (par opposition aux comptes de domaines).
Je dois nettoyer ces profils régulièrement. Pour cela j'utilise la commande Delprof2.exe qui fonctionne parfaitement.
Le pb c'est que je veux pouvoir industrialiser ce nettoyage via un script powershell.
L'idée est la suivante :
Supprimer tous les comptes SAUF les comptes locaux. Delprof2.exe sait nettoyer les profils en excluant certain compte (Exemple : delprof2.exe /c:\\{le serveur cible} / u /ed:admin* /ed:cptelocal* >> log.txt).
Je sais, avec Powershell, recuperer la liste des comptes locaux d'une machine ($connexion.psbase.children | where {$_.psbase.SchemaClassName -eq 'user'} | Foreach{$_.Name} | format-table >> $courant\Temp\log.csv )
Maintenant je cherche à construire ma ligne de commande Delprof2.exe en alimentant dynamiquement le parametre \"/ed:\" d'exclusion en fonction de la liste que j'ai créé avant ....
ET LA JE CALLE ... GRRRRR.
Si vous avez une idée ???
D'avance merci et à nouveau tous mes voeux pour cette nouvelle année.
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
titou4 écrit:
Supprimer tous les comptes SAUF les comptes locaux.
dans cette doc je vois :
/r Delete local caches of roaming profiles only, not local profiles
\"Supprime le cache des profils itinérants uniquement, pas les profils locaux\".
C'est pas plus simple ?
@ +
Matthew
Connexion ou Créer un compte pour participer à la conversation.
- laucaz
-
Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 48
- Remerciements reçus 0
Merci pour ton retour rapide.
Alors non la suppression du cache des profils itinérants ne suffit pas .
Comme dans toutes les grosses boites du tertiaire, on a une palanquée de serveurs (plus de 400 pour les seuls Win) avec des comptes obsolètes, temporaires, des entrées pourries dans le registre, des trucs créés par des projets hors normes, etc... Sans compter les empilages de techno plus ou moins bien maîtrisées( ex : dématérialisation de poste et server via citrix sur les plateformes VmWare avec des disques dynamiques sur des NAS sous unix ....)... et c'est à nous les admin de maintenir tout ca en conditions opérationnelles ... on s'ennuie pas ... LOOOOOL
Donc autant que possible on essai d’être plus proactif possible.
Bref, la suppression des caches des profils itinérants ne suffit pas. je dois vraiment virer les profils des machines pour qu'ils soient redescendus \"proprement\" à l'ouverture de session mais à l'exclusion des profils locaux .
Pour l'instant je le fais à la demande machine par machine ... mais je voudrais pouvoir le programmer ou l'ordonnancer ... voila voila...
J'ai dejà ecrit un script Powershell qui fait le boulot mais je voudrais me prémunir de la suppression \"accidentelle\" d'un compte de service créé localement sur une machine et \"supprimable accidentellement\" parce que justement le service qu'il lance est \"accidentellement \" arrêté ou planté ... Ca arrive plus souvent qu'on ne l'imagine
Donc je sais dire quels sont les comptes qui ne sont pas itinerants mais je ne sais pas construire la ligne de commande en generant dynamiquement les exclusions...
@+
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
Pour moi :
titou4 écrit:
Alors non la suppression du cache des profils itinérants ne suffit pas .
rentre en conflit avec :
je dois vraiment virer les profils des machines pour qu'ils soient redescendus \"proprement\" à l'ouverture de session mais à l'exclusion des profils locaux .
Bref, cela ne correspond pas à l'expression de besoin de ton premier post...
(plus de 400 pour les seuls Win)
Ce n'est pas beaucoup
et c'est à nous les admin de maintenir tout ca en conditions opérationnelles ... on s'ennuie pas ...
Tiens... Cela me rappelle quelque chose
Une fois la liste des comptes locaux récupérée, chaque nom de compte que tu veux exclure de la suppression doit être ajouté en tant que valeur du paramètre '/ed' :
/ed Exclude profile directories whose name matches this pattern
Wildcard characters * and ? can be used in the pattern
May be used more than once and can be combined with /id
Une première piste :
[code:1]
$adsi = [adsi]\"WinNT://localhost\"
$LocalAccounts = $adsi.psbase.children | where {$_.SchemaClassName -eq 'user'} | Select-Object -ExpandProperty Name
$ProfilesToExclude = $null
foreach($Acount in $LocalAccounts){
$ProfilesToExclude += \"/ed `\"$Account`\" \"
}
$CmdLine = \"C:\Tools\Delprof2.exe $ProfilesToExclude\"
Invoke-Expression $CmdLine
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- laucaz
-
Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 48
- Remerciements reçus 0
avec quelques aménagements c'est exactement ce que je cherchais.
je poste ci-dessous l'extrait de code à partir du quel je vais créer ma fonction...
[code:1]
# on variabilise le repertoire d'execution
$courant=Get-location
# on pose la question pour la cible du traitement
$QuestionBrut=Read-host \"La cible ?\"
# on determine la portee de la variable pour pouvoir la réutiliser
Set-variable -Name Question -Value $QuestionBrut -scope script
# on crée la cxion vers la cible
$connexion = [adsi]\"WinNT://$Question\"
# on recupere la liste des cptes locaux et on stocke dans une variable
$LocalAccounts = $connexion.psbase.children | where {$_.SchemaClassName -eq 'user'} | Select-Object -ExpandProperty Name
# on initialise la variable qui stockera les parametres de la ligne de cmde
$ProfilesToExclude = $null
# on boucle pour valoriser la variable
foreach($Account in $LocalAccounts){
$ProfilesToExclude += \"/ed:$Account \"
}
# on affiche la valorisation de la variable... pour vérification ...:«»-)
$ProfilesToExclude
# on cré la ligne de commande
$CmdLine = \"$courant\Delprof2.exe /c:\\$Question /u $ProfilesToExclude\"
# on affiche la ligne de commande... pour vérification ...:«»-)
$CmdLine
# On lance la commande avec un log
Invoke-Expression $CmdLine >> $courant\Logs\$Question.txt
[/code:1]
Sur la piste que tu m'as donnée j'ai juste corrigé le \"foreach\" car il manquait un \"c\" à \"$Account\".
Encore merci
@+
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
titou4 écrit:
Salut Matthew,
avec quelques aménagements c'est exactement ce que je cherchais.
Tant mieux
Sur la piste que tu m'as donnée j'ai juste corrigé le \"foreach\" car il manquait un \"c\" à \"$Account\".
Oui, ça sera mieux
Encore merci
De rien
Par contre, je pensais que tu allais filtrer les comptes locaux et ne pas tous les exclure. Or, tu les exclus tous. Donc pourquoi ne pas utiliser plutôt le paramètre \"/r\" qui fait exactement ce que tu viens de coder...
Quelques idées pour faire évoluer ton script :
- Ecrire une fonction qui attend en argument le nom du serveur concerné (ex. : Remove-Profiles -ComputerName MonServeur) ;
- Faire en sorte que cette fonction accepte l'entrée du pipeline : cela permettrait de lui passer une liste de serveurs, via le pipeline (ex. : Get-Content .\ListeSrv.txt | Remove-Profiles).
- Ajouter un autre paramètre qui permet de désigner les profils locaux à supprimer (qui ne seront donc pas exclus).
@+
Matthew<br><br>Message édité par: Matthew BETTON, à: 9/01/13 10:04
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Script powershell de nettoyage de pofils