Я создаю сценарий PowerShell для инвентаризации Outlook .. Я хочу получить:
Код:
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. Большую часть времени я могу обойтись без кода из существующих отчетов и Интернета, но этот меня поставил в тупик. Спасибо, что нашли время изучить мою проблему.
Вы пробовали просто использовать поле MemberCount из v_Collection вместо COUNT (*)? Таким образом, вам не понадобится предложение «Группировать по», и это упростит отладку.
Взгляните на ссылку ниже, чтобы загрузить полный список представлений SQL, это поможет в построении запросов позже.
https://gallery.technet.microsoft.com/SCCM-Configmgr-2012-R2-SQL-5fefdd3b
Ура
Джо
Я обновил ваш запрос, чтобы он работал правильно.
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