0

Mon objectif est d'appliquer une stratégie de rétention aux boîtes aux lettres nouvellement créées. Détails de l'article précédent here.Powershell: lecture en boucle de la liste des noms de la demande d'échange

Mon actuel code de script est situé here pour une meilleure lisibilité ou au-dessous:

# Get Start Time for script timer 
$startDTM = (Get-Date) 

#Authenticate using cached credentials or re-prompt for credentials. 
if (Test-Path C:\temp\mycred.xml) { 
    $UserCredential = Import-CliXML C:\temp\mycred.xml} 
else{ 
    Get-Credential | Export-CliXml C:\temp\mycred.xml 
    $UserCredential = Import-CliXML C:\temp\mycred.xml} 

#Connect to Exchange Server 
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://munprdcasht04.exchange.com/PowerShell/ -Authentication Kerberos -Credential $UserCredential 
    Import-PSSession $Session 

#returns alias' for mailboxes where creation date is <= 7 days and 
#resides on "ABC" or "DEF" server and has no retention policy applied 
$NeedsRetentions = (Get-Mailbox -ResultSize Unlimited| Where-Object { 
    ($_.WhenCreated –ge ((Get-Date).Adddays(-7))) -and 
    (($_.ServerName -like "*munprdmbxa*") -or ($_.ServerName -like "*wauprdexa*")) -and 
    ($_.retentionpolicy -ne "PurgeDeletedItemsFolder_60days")} | 
    ft -auto alias) 

ForEach ($NeedsRetention in $NeedsRetentions){ 
    set-mailbox -Identity $NeedsRetention -RetentionPolicy "PurgeDeletedItemsFolder_60days" 
    } 

# Get End Time 
$endDTM = (Get-Date) 

# Echo Time elapsed 
"Elapsed Time: $(($endDTM-$startDTM).totalseconds) seconds" 

Quand je fais l'écho des $NeedsRetentions que je reçois la liste des utilisateurs AD que j'ai besoin d'appliquer une politique de rétention. Mais pour une raison quelconque, lorsque je boucle la liste des variables avec la boucle ci-dessous, elle émet une erreur en disant que l'option -Identity n'est pas valide.

ForEach ($NeedsRetention in $NeedsRetentions){ 
    set-mailbox -Identity $NeedsRetention -RetentionPolicy "PurgeDeletedItemsFolder_60days" 
    } 

Pour résoudre i réduit la boucle à ceci afin d'afficher les noms d'utilisateur individuels affectés par le script:

ForEach ($NeedsRetention in $NeedsRetentions){ 
[System.Windows.Forms.MessageBox]::Show($NeedsRetention) 
} 

Faire cela provoque une boîte de message à afficher pour chaque ligne dans la variable mais la chaîne semble être vide et donc le message par défaut apparaît sur la boîte de message.

enter image description here

Toutes les idées pourquoi $NeedsRetention ne passe pas correctement dans ma tâche en boucle?

+0

L'objet que vous avez stocké dans 'NeedsRetenues' est une boîte aux lettres, la variable que vous essayez de transmettre à' -identity' est susceptible d'être une chaîne. Je n'ai pas ce module donc je ne peux pas tester, mais vous pouvez donner un coup de feu 'set-mailbox -Identity ($ NeedsRetention) .identity -RetentionPolicy" PurgeDeletedItemsFolder_60days "' –

+0

@Kai Zhao Cela a du sens mais quand je fais cette modification je reçois l'erreur suivante pour chaque boîte aux lettres répertoriée dans la variable 'Impossible de lier l'argument au paramètre 'Identity' car il est null. + CategoryInfo: invalidData: (:) [Set-Mailbox], ParameterBindingValidationException » + FullyQualifiedErrorId: ParameterArgumentValidationErrorNullNotAllowed, Set-Mailbox + PSComputerName: munprdcasht04.exchange.com' – mttp1990

+0

' -identity' prend des noms non? qu'est-ce que 'get-mailbox | look-member' ressemble? Devrait être une propriété, vous pouvez utiliser. –

Répondre

1

Le problème est que vous avez enregistré le résultat à partir d'un Format-*-cmdlet (dans ce cas Format-Table en utilisant l'alias ft).

Ne jamais enregistrer les résultats de Format-* cmdlets dans une variable. Format-* -Les applets de commande sont uniquement destinées à la présentation graphique/GUI et transforment vos objets de boîtes aux lettres utiles en un format spécial-objets qui ne servent à rien d'autre qu'à la sortie console/fichier.

Modifier:

$NeedsRetentions = (Get-Mailbox -ResultSize Unlimited| Where-Object { 
    ($_.WhenCreated –ge ((Get-Date).Adddays(-7))) -and 
    (($_.ServerName -like "*munprdmbxa*") -or ($_.ServerName -like "*wauprdexa*")) -and 
    ($_.retentionpolicy -ne "PurgeDeletedItemsFolder_60days")} | 
    ft -auto alias) 

Pour:

$NeedsRetentions = Get-Mailbox -ResultSize Unlimited| Where-Object { 
    ($_.WhenCreated –ge ((Get-Date).Adddays(-7))) -and 
    (($_.ServerName -like "*munprdmbxa*") -or ($_.ServerName -like "*wauprdexa*")) -and 
    ($_.retentionpolicy -ne "PurgeDeletedItemsFolder_60days")} 

Si vous voulez afficher les $NeedsRetentions -Objets à la console avant de poursuivre la modification des boîtes aux lettres, puis le faire comme une commande séparée (sans sauvegarder le format-sortie). Ex:

$NeedsRetentions | Format-Table -AutoSize 
+0

re-courir maintenant, les doigts croisés – mttp1990

+0

Bonne chance. Btw. Lorsque vous développez des scripts, exécutez-les uniquement sur quelques utilisateurs pour les tester (par exemple en ajoutant un filtre pour le nom d'utilisateur). Cela fait gagner du temps et fait moins de dégâts si cela ne fonctionne pas. –

+0

merci, normalement je cours ce type de choses dans une unité d'organisation spécifique pour limiter l'impact sur l'environnement. vous me verrez probablement plus souvent, donc jusqu'à la prochaine fois ... – mttp1990