свойства, вычисленные PowerShell для нескольких значений

Я создаю сценарий PowerShell для инвентаризации Outlook .. Я хочу получить:

  • Отображаемое имя учетной записи
  • Адрес электронной почты учетной записи
  • Тип учетной записи ( POP3, IAMP или Exchange)
  • Режим обмена (Online, Cached)

Код:

Add-Type -assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -comobject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")
$namespace.Accounts |
   Select-Object DisplayName, SmtpAddress, UserName, AccountType, ExchangeConnectionMode |
   Sort-Object  -Property SmtpAddress | Format-Table

Это выполнит свою работу, но было бы здорово, если бы я мог использовать вычисляемые свойства для отображения AccountType и ExchangeConnectionMode значения как настраиваемое понятное имя, а не числовое значение. Например:

AccountType
0 = Exchange
1 = IMAP
2 = POP3
Else = numeric value (real value)

ExchangeConnectionMode
700 = Cached
800 = Online
Else = N/A (or whatever similar text, for non exchange accounts)

Я уже использовал вычисляемые свойства раньше, но только с математическими вычислениями и одним значением (без нескольких значений). Я предполагаю, что « foreach » или « if » будут необходимы ... Не могу понять, как: Он выполняется, но когда это происходит, только первая коллекция в списке возвращает свое фактическое членство. Остальные возвращают ненужные данные. Он выполняется, но когда это происходит, только первая коллекция в списке возвращает свое фактическое членство. Остальные возвращают ненужные данные. Это среда SCCM 1610 на виртуальной машине Server 2008R2. Я создаю отчет в SQL Server Report Builder 3.0. Мое тестирование запускает команду execute в конструкторе запросов, а затем сравнивает результаты с информацией о членстве в этой коллекции в консоли Config Manager. Чтобы более полно объяснить мою проблему, вот код для одной коллекции:

SELECT
    v_Collection.Name,
    v_Collection.Comment,
    v_Collection.CollectionID,
    COUNT(*) AS [Members]

FROM
    v_Collection,
    v_FullCollectionMembership

WHERE
    v_Collection.CollectionID = v_FullCollectionMembership.CollectionID
    AND v_Collection.CollectionID LIKE 'XXXXXX01'

GROUP BY
    v_Collection.Name,
    v_Collection.Comment,
    v_Collection.CollectionID

ORDER BY
    v_Collection.Name

Приведенный выше код вернет следующее:

Один результат коллекции

Если я добавлю оператор OR и другую коллекцию, подобную этой:

SELECT
    v_Collection.Name,
    v_Collection.Comment,
    v_Collection.CollectionID,
    COUNT(*) AS [Members]

FROM
    v_Collection,
    v_FullCollectionMembership

WHERE
    v_Collection.CollectionID = v_FullCollectionMembership.CollectionID
    AND v_Collection.CollectionID LIKE 'XXXXXX01'
    OR v_Collection.CollectionID LIKE 'XXXXXX02'

GROUP BY
    v_Collection.Name,
    v_Collection.Comment,
    v_Collection.CollectionID

ORDER BY
    v_Collection.Name

Это результат:

Два результата сбора

CollectionID XXXXXX02 не имеет более 900 000 участников. В нем меньше 200. Если посмотреть на коллекцию в ConfigMgr, это видно, и я достаточно уверен, что у нас нет миллиона мошеннических устройств в этой коллекции.

Больше всего меня сбивает с толку, когда я добавляю последовательные коллекции, каждая после первой имеет тот же номер, и чем больше коллекций в списке, тем он немного больше. Так, например, без дополнительных снимков экрана, если я добавлю третью коллекцию, результаты будут следующими:

CollID   - MemberCount
XXXXXX01 - 1944
XXXXXX02 - 940519
XXXXXX03 - 940519

Если я добавлю четвертую коллекцию, это будет результат:

CollID   - MemberCount
XXXXXX01 - 1944
XXXXXX02 - 940568
XXXXXX03 - 940568
XXXXXX04 - 940568

Хочу отметить, что эти числа не увеличиваются каждый раз на счет сбора. Разница между плохим числом с тремя коллекциями и одним с четырьмя коллекциями составляет 49, но у четвертой коллекции есть пара тысяч членов.

Я уверен, что это вопрос моего незнания как SQL, так и / или общего кодирования , но даже в команде опытных системных администраторов я один из немногих, кто попытается написать что-то подобное, не имея большого опыта, и ни у кого нет большого опыта работы с SQL или запросами в нашей команде, поэтому я де-факто Репортер SCCM. Большую часть времени я могу обойтись без кода из существующих отчетов и Интернета, но этот меня поставил в тупик. Спасибо, что нашли время изучить мою проблему.

0
задан 3 January 2018 в 18:20
2 ответа

Вы пробовали просто использовать поле MemberCount из v_Collection вместо COUNT (*)? Таким образом, вам не понадобится предложение «Группировать по», и это упростит отладку.

Взгляните на ссылку ниже, чтобы загрузить полный список представлений SQL, это поможет в построении запросов позже.

https://gallery.technet.microsoft.com/SCCM-Configmgr-2012-R2-SQL-5fefdd3b

Ура

Джо

0
ответ дан 5 December 2019 в 06:53

Я обновил ваш запрос, чтобы он работал правильно.

SELECT
    Coll.Name as 'Collection Name',
    Coll.Comment as 'Comment',
    Coll.CollectionID as 'Collection ID',
    COUNT(*) AS 'Members'
FROM
    dbo.v_Collection Coll
    join dbo.v_FullCollectionMembership FCM on Coll.CollectionID = FCM.CollectionID
WHERE
    Coll.CollectionID LIKE 'XXXXXX01'
    OR Coll.CollectionID LIKE 'XXXXXX02'
GROUP BY
    Coll.Name,
    Coll.Comment,
    Coll.CollectionID
ORDER BY
    Coll.Name
0
ответ дан 5 December 2019 в 06:53

Теги

Похожие вопросы