Voici mon code actuel:
Write-output “ENTER THE FOLLOWING DETAILS - When Creating Multiple New Accounts Go to EMC hit F5(refresh) and make sure previous new account is listed before proceeding to the next one”
$DName = Read-Host “User Diplay Name(New User)"
$RUser = Read-Host "Replicate User(Database Grab)"
$RData = ((Get-Mailbox -Identity $RUser).Database).DistinguishedName
$REmailInput = Read-Host “Requester's Name(Notification Email goes to this Person)"
$REmail = ((Get-Mailbox -Identity "$REmailInput").PrimarySmtpAddress).ToString()
Enable-Mailbox -Identity "$DName" -Database "$RData"
Set-CASMailbox -Identity "$DName" -ActiveSyncEnabled $false -ImapEnabled $false - PopEnabled $false
Send-MailMessage -From "John Doe <[email protected]>" -To $REmail -Subject "$DName's email account" -Body "$DName's email account has been setup.`n`n`nJohn Doe`nXYZ`nSystems Administrator`nOffice: 123.456.7890`[email protected]" -SmtpServer [email protected]
Ce code fonctionne parfaitement environ la moitié du temps, mais l'autre moitié j'obtiens cette erreur en retour:
ENTER THE FOLLOWING DETAILS - When Creating Multiple New Accounts Go to EMC hit
F5(refresh) and make sure previous new account is listed before proceeding to
the next one
User Diplay Name(New User): Jane Doe
Replicate User(Database Grab): Julie Doe
Requester's Name(Notification Email goes to this Person): Joanna Doe
Name Alias ServerName ProhibitSendQuo
ta
---- ----- ---------- ---------------
Jane Doe JDDAFA [email protected] unlimited
Set-CASMailbox : Jane Doe is not a mailbox user.
At C:\emailclientbasic.ps1:11 char:15
+ Set-CASMailbox <<<< -Identity "$DName" -ActiveSyncEnabled $false -ImapEnable
d $false -PopEnabled $false
+ CategoryInfo : NotSpecified: (0:Int32) [Set-CASMailbox], Manage
mentObjectNotFoundException
+ FullyQualifiedErrorId : 292DF1AC,Microsoft.Exchange.Management.Recipient
Tasks.SetCASMailbox
Donc, si quelqu'un pouvait m'aider à lancer une sorte de commande d'attente après la création de la boîte aux lettres et attendre que la boîte aux lettres de l'utilisateur soit créée avant que le script ne désactive ActiveSync, etc., ce serait vraiment utile. Je pense que l'utilisation du commutateur -wait ne fonctionne pas.
Utilisez le Start-Sleep
commande:
Start-Sleep -s 10
mettra le script en pause pendant 10 secondes.
J'ai dû faire face à un certain timing dans un script Exchange que j'ai écrit il y a quelque temps. Plus précisément, je devais modifier les autorisations sur un groupe de distribution nouvellement créé, mais je devais attendre que le groupe de distribution soit réellement créé avant d'essayer de le modifier.
do {
sleep -seconds 1
$mailboxExists = get-mailboxpermission -Identity "CN=$displayName,$DN" -User "NT AUTHORITY\SELF" -ErrorAction SilentlyContinue |fw IsValid
write-Host "." -nonewline
} while (!$mailboxExists)
Il tente simplement de retirer l'attribut "IsValid" de la boîte aux lettres (dans cet exemple) en tant que proxy pour "la boîte aux lettres existe". Une fois que get-mailboxpermission
renvoie vrai, l'étape suivante, la définition d'une autorisation fonctionnera réellement. Le write-Host
est juste pour fournir une barre de progression.
Vous pouvez l'exécuter en tant que tâche d'arrière-plan, puis attendre la fin de cette tâche. Comme ça:
$ enablemb = Start-Job {Enable-Mailbox -Identity "$ DName" -Database "$ RData"}
Wait-Job $ enablemb
Receive-Job $ enablemb
Pourquoi pas quelque chose comme:
do {
$testpath = Test-Path -path \\dns2\d$\test
}
until ($testpath -eq $true)
J'utilise ce type de commande avec un _ start-sleep
après le test initial car faire jusqu'à mange beaucoup de cycles de processeur sans lui. Donc le mien ressemble plus à ceci:
do {
$testpath = Test-Path -path \\dns2\d$\test
start-sleep -s 10}
until ($testpath -eq $true)
Si le test va changer d'état rapidement, ne vous inquiétez pas du start-sleep
.
Start-Sleep = attendre x secondes