Question Joindre les membres issus de deux commandes

Plus d'informations
il y a 15 ans 9 mois #2551 par Legabs

Attention j'ai écrit sans vérifier la syntaxe mais le principe est là.


Et moi j'ai légèrement corrigé pour faire quelque chose qui fonctionne et ça donne ça :

[code:1]
$mbs = Get-mailbox -Server myServer

$dict = @{}

foreach ($mb in $mbs) {
if ($mb.UserPrincipalName) {
if ($stats = Get-Mailboxstatistics -Identity $mb.UserPrincipalName) {
# Si la boîte mail utilise les paramètres par défaut du MailboxStore
if ($mb.UseDatabaseQuotaDefaults -eq $true) {
# On récupère les données propres à la MailboxDatabase
$mbdb = Get-MailboxDatabase -Identity $mb.Database
$data = Select ProhibitSendQuota,ProhibitSendReceiveQuota,IssueWarningQuota -input $mbdb
} else { # Sinon
# On récupère les données propres à la boîte mail
$data = Select ProhibitSendQuota,ProhibitSendReceiveQuota,IssueWarningQuota -input $mbdb
}

add-member -input $data -name MailboxStatistics -membertype NoteProperty -value $stats
$dict.($mb.UserPrincipalName) = $data
}
}
}

return $dict
[/code:1]

Maintenant il faut que je vois comment on fait pour manipuler ça simplement en VB.NET parce que j'ai cru voir hier soir que ça créait un objet PSCustomObject et non pas un PSObject.

Ça va faire l'objet d'un post dans la journée je pense :)

DirectCast ne serais pas plus approprié/rapide ?


Apparement pour pouvoir utiliser DirectCast il faut qu'il y ait une notion d'héritage et ça n'est pas le cas ici donc je pense que ça ne va pas être possible. A confirmer.

Ensuite regarde si la manipulation d'une classe spécifique (compilé) peut simplifier ton code, ie. manipuler une instance créé dans VB et pas dans PS. Inverser le pb en qq sorte ...


Je pense en effet que plus on se servira de VB.NET pour traiter les données, au dépend de PowerShell, et moins ça prendra de temps... :) Mais comme il faut passer par les deux, le tout est de trouver un compromis intéressant.

Bon je m'y replonge, je posterai mes résultats dans la journée...

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #2552 par Laurent Dardenne
Legabs écrit:

ça créait un objet PSCustomObject et non pas un PSObject.

De ce que j'ai compris la Classe PSCustomObject indique qu'il n'y a pas d'objet wrappé, enfin je suppose que tu as déjà consulté le SDK.
Legabs écrit:

Apparement pour pouvoir utiliser DirectCast il faut qu'il y ait une notion d'héritage

Autant pour moi.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #2554 par Legabs
Hé bien voilà, je crois que je suis arrivé à peu près au bout. Voici donc le script final dans son intégralité :

[code:1]
# DO NOT DELETE THIS COMMENT LINE
$mbs = Get-mailbox -Server $serverName

$dict = @{}

foreach ($mb in $mbs) {
if ($mb.UserPrincipalName) {
if ($stats = Get-Mailboxstatistics -Identity $mb.UserPrincipalName) {
# Si la boîte mail utilise les paramètres par défaut du MailboxStore
if ($mb.UseDatabaseQuotaDefaults -eq $true) {
# On récupère les données propres à la MailboxDatabase
Write-Host \"par défaut\"
$mbdb = Get-MailboxDatabase -Identity $mb.Database
$data = Select-Object ProhibitSendQuota,ProhibitSendReceiveQuota,IssueWarningQuota -input $mbdb
} else { # Sinon
# On récupère les données propres à la boîte mail
Write-Host \"par Mailbox\"
$data = Select-Object ProhibitSendQuota,ProhibitSendReceiveQuota,IssueWarningQuota -input $mb
}

add-member -input $data -name MailboxStatistics -membertype NoteProperty -value $stats
$dict.($mb.UserPrincipalName) = $data
}
}
}

return $dict
[/code:1]

et le code VB.NET qui permet de s'en servir :

[code:1]
' On déclare la liste qui sera retournée par la fonction
Dim listOfStats As List(Of PSE_MailboxStat) = New List(Of PSE_MailboxStat)

' On instancie les éléments nécessaires à l'exécution d'un script PowerShell
Dim snapinException As PSSnapInException = Nothing
Dim EMSConfig As RunspaceConfiguration = RunspaceConfiguration.Create()
Dim info As PSSnapInInfo = EMSConfig.AddPSSnapIn(\"Microsoft.Exchange.Management.PowerShell.Admin\", snapinException)
Dim runSpace As Runspace = RunspaceFactory.CreateRunspace(EMSConfig)

' On ouvre la connexion vers PowerShell
runSpace.Open()

' On passe à la recherche des statistiques proprement dite
' On commence pour cela par récupérer le script
Dim sr As StreamReader = New StreamReader(\"getListOfStatisticsScript.ps1\"«»)
Dim getMailboxStatsScript As String = sr.ReadToEnd()

' Et on l'injecte à la création du pipeline
Dim getStatsPipe As Pipeline = runSpace.CreatePipeline(\"$serverName = \"\"\" + serverName + \"\"\"\" + getMailboxStatsScript)
Dim getStatsResults As New Collection(Of System.Management.Automation.PSObject)

' On récupère les résultats
getStatsResults = getStatsPipe.Invoke()

' En cas de problème lors de l'exécution, on retourne une erreur
If getStatsResults.Count = 0 Then
Throw New Exception(\"L'exécution du script de récupération des statistiques de boîtes mail a échoué\"«»)
End If

' Si on arrive ici, c'est que tout va bien
' On récupère les données retounrées par la commande PowerShell
Dim ht As Hashtable = CType(getStatsResults.Item(0).BaseObject, Hashtable)

' Pour chacune des entrées retournées
For Each dictEntry As DictionaryEntry In ht

' On déclare une entité permettant de stocker les informations
Dim e As New PSE_MailboxStat()

' On renseigne l'UPN dans l'entité
e.UPN = dictEntry.Key.ToString()

' On récupère les statistiques
Dim data As PSObject = dictEntry.Value

' On met à jour les différents champs
e.MailboxStatistics = CType(data.Properties.Item(\"MailboxStatistics\"«»).Value, PSObject).BaseObject
e.IssueWarningQuota = CType(data.Properties.Item(\"IssueWarningQuota\"«»).Value, Unlimited(Of ByteQuantifiedSize))
e.ProhibitSendQuota = CType(data.Properties.Item(\"ProhibitSendQuota\"«»).Value, Unlimited(Of ByteQuantifiedSize))
e.ProhibitSendReceiveQuota = CType(data.Properties.Item(\"ProhibitSendReceiveQuota\"«»).Value, Unlimited(Of ByteQuantifiedSize))

' On ajoute l'élément dans la liste
listOfStats.Add(e)
Next

' On retourne la liste
Return listOfStats
[/code:1]

NB :
1 - j'ai supprimé un certain nombre de levés d'exception (gestion d'erreurs) pour ne conserver que l'essentiel. ;)
2 - PSE_MailboxStat c'est un objet que j'ai créé moi même pour faire l'interface entre la couche PowerShell d'accès aux données et la couche générique d'accès aux données.

Le seul truc moche (enfin sans vouloir être trop prétentieux) c'est la façon de transmettre le nom du serveur au script pour pouvoir faire une fonction générique.

[code:1]Dim getStatsPipe As Pipeline = runSpace.CreatePipeline(\"$serverName = \"\"\" + serverName + \"\"\"\" + getMailboxStatsScript)[/code:1]

Je n'ai pas trouvé de façon de faire plus propre. Il faudrait que je m'applique à trouver une solution mais bon, pour le moment on s'approche du week-end :laugh:

Enfin voilà quoi. Donc vraiment merci beaucoup à toi Laurent. Ça fait plaisir de trouver des gens sympas qui se creusent la tête pour aider quand on a du mal à avancer. Et j'ai même l'impression que tu y as pris un certain plaisir, et c'est d'autant plus sympa. Sur ce coup là on a bossé à deux :) Toi autant que moi.<br><br>Message édité par: Legabs, à: 4/07/08 16:53

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #2556 par Laurent Dardenne
Legabs écrit:

Sur ce coup là on a bossé à deux :) Toi autant que moi

Comme quoi dans le travail la coopération est bien plus bénéfique que la compétition :P
Il me faut dire aussi que j'ai du temps en ce moment, ce qui n'est pas négligeable.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

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