Question Script powershell de nettoyage de pofils

Plus d'informations
il y a 13 ans 4 mois #13554 par laucaz
Bonjour à tous et bonne année.

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.

Plus d'informations
il y a 13 ans 4 mois #13555 par Matthew BETTON
Bonjour,

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.

Plus d'informations
il y a 13 ans 4 mois #13558 par laucaz
Salut Matthew,

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.

Plus d'informations
il y a 13 ans 4 mois #13563 par Matthew BETTON
Désolé, mais je ne te suis pas.

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 :P

et c'est à nous les admin de maintenir tout ca en conditions opérationnelles ... on s'ennuie pas ...


Tiens... Cela me rappelle quelque chose :whistle:

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.

Plus d'informations
il y a 13 ans 4 mois #13572 par laucaz
Salut Matthew,

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.

Plus d'informations
il y a 13 ans 4 mois #13573 par Matthew BETTON
Salut,

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.

Temps de génération de la page : 0.044 secondes
Propulsé par Kunena