Вопрос:
Этот конкретный пример – Get-User и Get-Mailbox (Exchange 2010). Get-User возвращает некоторые из столбцов, которые мне нужны, и Get-Mailbox – некоторые другие. Мне трудно понять, как я могу объединить результаты этих двух в одну таблицу с результатами обоих.
Get-User -Filter «…» | Get-Mailbox -Filter «…»
Как взять результаты команды, аналогичной приведенной выше, и превратить ее в результаты, похожие на ниже?
FirstName LastName Alias CustomAttribute1 ——— ——— —— —————- Bob Smith bsmith Example Johnny NoMail Adam Blye ablye Has a Mailbox
Обратите внимание, что FirstName и LastName не возвращаются Get-Mailbox, и, наоборот, Alias и CustomAttributes не возвращаются из Get-User. Не у каждого пользователя есть почтовый ящик, поэтому иногда часть столбцов будет равна нулю. Но у меня есть чертовски время, выясняя лучший способ вернуть комбинированный стол, подобный этому.
Лучший ответ:
Получить пользователей, сохранить каждого пользователя в переменной, получить почтовый ящик для каждого пользователя, а затем создать новый объект со свойствами из обеих переменных
Get-User -Filter … | Foreach-Object{ $user = $_ $mbx = Get-Mailbox $user New-Object -TypeName PSObject -Property @{ FirstName = $user.FirstName LastName = $user.LastName Alias = $mbx.Alias CustomAttribute1 = $mbx.CustomAttribute1 } } Ответ №1
Я создаю пользовательский объект, который может быть излишним, но это самый простой способ, который я нашел.
Вот пример кода для воспроизведения. Сообщите мне, вызвало ли оно какие-либо проблемы или дополнительные вопросы:
$outputCollection = @() $users = Get-User -Filter «…» $mailboxes = Get-Mailbox -Filter «…» $users | Foreach-Object { #Associate objects $userObject = $_ $mailboxObject = $mailboxes | Where-Object {$_.Name -eq $userObject.Name} #Make a combined object $outputObject = «» | Select Name, UserAttribute, MailboxAttribute $outputObject.Name = $userObject.Name $outputObject.UserAttribute = $userObject.UserAttribute $outputObject.MailboxAttribute = $mailboxObject.MailboxAttribute #Add the object to the collection $outputCollection += $outputObject } $outputCollection
Другим вариантом, который должен работать, называется вычисляемые свойства:
Get-User -Filter «…» | Select Name, UserAttribute, @{Name=»OtherAttribute»; Expression={(Get-Mailbox $_.Name).MailboxAttribute}}
… обратите внимание, что это приведет к новой команде Get-Mailbox для каждой записи, что потенциально увеличивает время выполнения
Ответ №2
Спасибо, ребята. Я потратил много времени на то, чтобы выяснить мою собственную проблему, и ваш код помог мне понять все правильно. Мне нужно было найти все календари, если учетная запись по умолчанию не была установлена. Ниже приведено то, что мне нужно было использовать.
Get-Mailbox | ForEach-Object{ $user = $_ $calPerms = Get-MailboxFolderPermission $user»:calendar» -User Default | Where-Object {$_.AccessRights -eq «none»} New-Object -TypeName PSObject -Property @{ Name = $user Permissions = $calPerms.AccessRights Users = $calPerms.user } } Ответ №3
Один лайнер для получения FirstName, LastName, Alias и CustomAttribute1:
Get-User | Select Firstname, Lastname, @{Name=»Alias»; Expression={(Get-Mailbox $_.Name).Alias}}, @{Name=»CustomAttribute1″; Expression={(Get-Mailbox $_.Name).CustomAttribute1}}