Проблема объединения командлетов Powershell

Я собрал сценарий (извините, не помню источник), который возвращает несколько атрибутов с помощью двух командлетов (Get-user и Get-mailboxstatistics). Код работает, как и ожидалось, если я указываю отдельного пользователя, но при использовании подстановочного знака для возврата всех пользователей он возвращает только атрибуты из Get-user, и я не знаю, почему.

Любая помощь в решении этого приветствуется.

    $outputCollection = @()
$users = Get-User -identity *
$mailboxes = Get-Mailboxstatistics -identity *

$users | Foreach-Object {
   #Associate objects
$userObject = $_
$mailboxObject = $mailboxes
$emailObject = $mail

#Make a combined object
$outputObject = "" | Select FirstName,Lastname,sAMAccountName,windowsemailaddress,ItemCount,Totalitemsize,TotalDeletedItemSize,DatabaseName,ServerName,LastLogonTime,LastLogoffTime
$outputObject.FirstName = $userObject.FirstName
$outputObject.Lastname = $userObject.Lastname
$outputObject.sAMAccountName = $userObject.sAMAccountName
$outputObject.windowsemailaddress = $userObject.windowsemailaddress   
$outputObject.itemcount = $mailboxObject.itemcount
$outputObject.Totalitemsize = $MailboxObject.Totalitemsize
$outputObject.TotalDeletedItemSize = $MailboxObject.TotalDeletedItemSize
$outputObject.DatabaseNAme = $mailboxObject.DatabaseName  
$outputObject.ServerName = $mailboxObject.ServerName  
$outputObject.lastlogontime = $mailboxObject.lastlogontime
$outputObject.lastlogofftime = $mailboxObject.lastlogofftime


  #Add the object to the collection
  $outputCollection += $outputObject
}

 $outputCollection

person Clagnuts    schedule 20.04.2015    source источник


Ответы (4)


Чтобы помочь вам понять, я изменился как можно меньше. Для начала я бы удалил строку $mailboxes = Get-Mailboxstatistics -identity *. Затем для простоты обновите строку ниже

$mailboxObject = Get-Mailboxstatistics -identity $userObject.UserPrincipalName

Вам необходимо получить статистику для одного почтового ящика в каждом проходе цикла. Изменение того, как вы заполняете $mailboxObject, должно выполнить это без необходимости что-либо менять.

Возможно, вы можете удалить $emailObject = $mail, так как вы, похоже, нигде его не используете.

FYI Это не проверено, но должно работать. Это также предполагает, что у пользователя действительно есть почтовый ящик Exchange. В противном случае на выходе будут нулевые значения.

Об эффективности

Я хотел попытаться сделать это проще для вас, чтобы понять. Однако обратите внимание, что Bacon Bits пытался рассказать вам о том, что Get-Mailboxstatistics не запускать каждый раз, верно. Однако мое решение должно работать.

person Matt    schedule 20.04.2015
comment
Привет, спасибо за помощь, я отредактировал код, как вы сказали, но получил следующую ошибку. Get-MailboxStatistics: невозможно привязать параметр «Идентификация». Не удается преобразовать значение в тип Microsoft.Exchange.Configuration.Tasks.GeneralMailboxOrMailUserIdParameter. Ошибка: значения параметров типа Microsoft.Exchange.Configuration.Task s.GeneralMailboxOrMailUserIdParameter не могут быть пустыми. Укажите значение и повторите попытку. - person Clagnuts; 21.04.2015
comment
У вас все еще есть строка выше с $userObject = $_? Похоже, $userObject.UserPrincipalName возвращает ноль. Если у вас есть только строка $userObject.UserPrincipalName, она возвращает желаемый результат. - person Matt; 21.04.2015

Основная проблема в том, что между $users и $mailboxes нет корреляции.

Например: Почему $mailboxObject = $mailboxes автоматически выбирает почтовый ящик нужного пользователя? Ответ заключается в том, что это не так. Он вернет все, что было в $mailboxes. Так что $mailboxObject.FirstName ничего не значит, потому что $mailboxObject — это массив, как и $mailboxes. Вы можете сказать ``$mailboxObject[0].FirstName`, но это не будет правильно соотноситься.

Вам нужно ключевое поле, существующее в обоих объектах, которое вы можете найти с помощью оператора $mailboxObject = $mailboxes | Where-Object { $_.SomeKeyField = $userObject.SomeKeyField }.

В качестве альтернативы вы можете подождать с запуском Get-MailboxStatistics, пока не окажетесь внутри своего цикла, но это значительно увеличит объем трафика в вашей системе Exchange.

Кроме того, имейте в виду, что все вышеперечисленное предполагает, что Пользователь существует для каждого MailboxStatistic. Если это не так, вам придется проделать еще больше работы, если вы хотите, чтобы в результатах были и то, и другое.

person Bacon Bits    schedule 20.04.2015

Вы могли бы попробовать это!

Как упоминал Бэкон, либо $users, либо $mailboxes должны быть отфильтрованы с отношением между ними; Так же, как внешний ключ.

**Всегда используйте хеш-таблицу при добавлении пар ключ-значение, чтобы иметь больше возможностей для управления и простоты понимания.

        # DECLARE HASHTABLE
        $outputCollection = @{}

        $users = Get-User -identity *
        $mailboxes = Get-Mailboxstatistics -identity $userObject.UserPrincipalName

        $users | Foreach-Object {
        #Associate objects
        $userCollection = $_
        $mailboxCollection = $mailboxes | Where-Object { $_.SomeKeyField = $userCollection.SomeKeyField }

        # ADD ELEMENTS TO HASH TABLE

        # Add elements from userCollection
        $outputCollection.add("FirstName",$userCollection.FirstName);
        $outputCollection.add("Lastname",$userCollection.Lastname);
        $outputCollection.add("sAMAccountName",$userCollection.sAMAccountName);
        $outputCollection.add("windowsemailaddress",$userCollection.windowsemailaddress);

        # Add elements from mailboxCollection
        $outputCollection.add("itemcount",$mailboxCollection.itemcount);
        $outputCollection.add("Totalitemsize",$mailboxCollection.Totalitemsize);
        $outputCollection.add("TotalDeletedItemSize",$mailboxCollection.TotalDeletedItemSize);
        $outputCollection.add("DatabaseNAme",$mailboxCollection.DatabaseNAme);
        $outputCollection.add("ServerName",$mailboxCollection.ServerName);
        $outputCollection.add("lastlogontime",$mailboxCollection.lastlogontime);
        $outputCollection.add("lastlogofftime",$mailboxCollection.lastlogofftime);
        }

        $outputCollection

Используя хэш-таблицу, вы также можете использовать другое имя для ключей. Например, вы можете сделать это,

       outputCollection.add("Last Logoff Time",$mailboxCollection.lastlogofftime);
       #Instead of
       outputCollection.add("lastlogofftime",$mailboxCollection.lastlogofftime);

Надеюсь это поможет!!

person Pradebban Raja    schedule 20.04.2015
comment
Спасибо за вашу помощь. Я попытался использовать ваш код, но получил сообщение об ошибке. Вызов метода не выполнен, поскольку [System.Collections.Hashtable] не содержит метод с именем «add_item». Также просто хотел проверить, что $outputCollection.add_item(FirstName,userCollection.FirstName);' должно быть $outputCollection.add_item(FirstName,$userCollection.FirstName); - person Clagnuts; 21.04.2015
comment
Спасибо, что дал мне знать! - person Pradebban Raja; 21.04.2015

Спасибо за помощь. Наконец-то мне удалось отсортировать это, используя следующий код.

Get-MailboxServer | Get-Mailbox -resultsize 1 | foreach-object {$email = $_.primarysmtpaddress; $_ | Get-MailboxStatistics | Sort @{expression= "totalitemsize";descending=$true}}| select DisplayName, @{expression={$_.totalitemsize.value.ToMB()};label=”Size(MB)”}, @{expression={$_.TotalDeletedItemSize.value.ToMB()};label=”Deleted Size(MB)”}, ServerName, DatabaseName, itemcount, lastlogontime, lastloggedonuseraccount, @{Name="EmailAddress";expression={$email}}| Export-csv c:\Report.csv -notypeinformation
person Clagnuts    schedule 28.04.2015