Отчет SCCM для возврата состояния КБ на серверах

Я пытаюсь создать пользовательский отчет в SCCM, который сообщит мне, установлен ли определенный КБ на пуле серверов, и вернет двоичный ответ (в этом случае да или нет).

Проблема в том, что я не могу заставить его вернуть статус только одного КБ. Я управляю этим:

SELECT
 SYS.Name0 'Computer',
 SYS.operatingSystem0 'OS',
 UIN.Title 'Update',
 CASE
  WHEN UIN.Title LIKE '%KB3092627%' THEN 'Yes'
  ELSE 'No'
  END 'KB Installed'

FROM v_R_System SYS
 INNER JOIN v_UpdateComplianceStatus UCS ON SYS.ResourceID = UCS.ResourceID
 INNER JOIN v_UpdateInfo UIN ON UCS.CI_ID = UIN.CI_ID

WHERE SYS.operatingSystem0 LIKE '%Server 2008%'

ORDER BY SYS.Name0

но я получаю сотни результатов для каждогоSYS.Name0, по одному для каждого обнаруженного обновления. Все записи для обновлений, которые не являются нужными КБ имеют значение 'No'forKB Installed, но они все еще перечислены. Я SELECT DISTINCTпытался увидеть, если это дало мне другие результаты, но это не так.

Что я хочу, чтобы определить, если KB присутствует, и вернуться, если это или нет. Я чувствую, что даже не задаю фундаментальный вопрос «установлен или нет» с этим кодом, но я не могу придумать способ задать это по-другому. Это то, что я должен делать в Построителе отчетов, а не в запросе?

2 ответа

  1. Отказ от ответственности: я не протестировал это на репрезентативном наборе данных, поскольку вы его не предоставили, но я думаю, что это должно сделать то, чего вы пытаетесь достичь:

    SELECT DISTINCT
        s1.Name0 'Computer',
        s1.operatingSystem0 'OS',
        CASE WHEN matches.Computer IS NULL THEN 'No' ELSE 'Yes' END 'KB Installed'
    FROM v_R_System s1
    LEFT JOIN
    (
        SELECT s2.Name0 'Computer',
        FROM v_R_System s2
        INNER JOIN v_UpdateComplianceStatus UCS ON s2.ResourceID = UCS.ResourceID
        INNER JOIN v_UpdateInfo UIN ON UCS.CI_ID = UIN.CI_ID
        WHERE UIN.Title LIKE '%KB3092627%'
    ) AS matches ON s1.Name0 = matches.Computer
    WHERE s1.operatingSystem0 LIKE '%Server 2008%'
    ORDER BY s1.Name0
    

    Таким образом, это эффективно возвращает отдельный список всех компьютеров и LEFT JOINs это к результирующему набору только записей для рассматриваемого обновления для каждого данного компьютера. Таким образом , когда поле возвращается из LEFT JOINisNULL, обновление не было установлено и наоборот.

    И чтобы ответить на ваш вопрос, я лично думаю, что хорошо делать это в запросе (в отличие от вашего отчета) — это там, где я бы это сделал.

  2. Пожалуйста, выполните этот запрос ниже:

    SELECT DISTINCT 
     SYS.Name0 'Computer',
     SYS.Operating_System_Name_and0 'OS',
     UIN.Title 'Update',
     CASE
      WHEN UIN.Title LIKE '%KB3079343%' THEN 'Yes'
      ELSE 'No'
      END 'KB Installed'
    
    FROM v_R_System SYS
     left JOIN v_UpdateComplianceStatus UCS ON SYS.ResourceID = UCS.ResourceID
     left JOIN v_UpdateInfo UIN ON UCS.CI_ID = UIN.CI_ID
    
    WHERE  UIN.Title LIKE '%KB3079343%'
    
    
    ORDER BY SYS.Name0

    В моей тестовой лаборатории есть несколько записей, соответствующих одному номеру КБ. Этот метод не может быть идеальным решением.
    Введите описание изображения здесь

    Можно попробовать встроенный отчет:
    \Мониторинг\Обзор\Отчеты\Отчеты\Обновления Программного Обеспечения-Соответствие Требованиям\
    Соответствие 8-компьютеры в определенном состоянии соответствия для обновления (вторичный)