Як перетворити WQL запит SCCM в SQL звіт

Для вибірки різних даних з комп'ютерів, користувачам, пристроїв в базі System Center Configuration Manager і побудови колекцій постійно доводиться створювати різні запити. У редакторі запитів SCCM (query editor) присутній досить зручний майстер навігації по різних класах і атрибутам. Для більш зручного представлення потрібної інформації користувачам я вважаю за краще використовувати веб звіти SCCM (reports). Проблема в тому, що, якщо ви захочете сформувати веб звіт на базі отриманого запиту SCCM, ви зіткнетеся з тим, що код SCCM запиту можна використовувати для побудови звіту.

Справа в тому, що запити в ConfigMgr формуються на мові WQL, а в звітах необхідно використовувати безпосередньо запити до бази MSSQL на мові SQL. Хоча синтаксис WQL і SQL в чомусь схоже, ви не можете безпосередньо конвертувати WQL запит в SQL. У цій статті я покажу найпростіший і швидкий спосіб отримання коду запиту SQL з WQL запиту в SCCM.

Мені знадобилося створити веб звіт для користувачів, в якому повинні міститися комп'ютери, що не вимикали на ніч. У мене вийшов такий запит (query):

select distinct SMS_R_System.NetbiosName, SMS_R_System.LastLogonUserName, SMS_R_System.IPAddresses, SMS_R_System.ADSiteName, SMS_G_System_WORKSTATION_STATUS.LastHardwareScan, SMS_G_System_OPERATING_SYSTEM.LastBootUpTime, SMS_G_System_COMPUTER_SYSTEM.Model from SMS_R_System inner join SMS_G_System_WORKSTATION_STATUS on SMS_G_System_WORKSTATION_STATUS.ResourceID = SMS_R_System.ResourceId inner join SMS_G_System_OPERATING_SYSTEM on SMS_G_System_OPERATING_SYSTEM.ResourceID = SMS_R_System.ResourceId inner join SMS_G_System_COMPUTER_SYSTEM on SMS_G_System_COMPUTER_SYSTEM.ResourceID = SMS_R_System.ResourceId where DATEPART (DY, SMS_G_System_OPERATING_SYSTEM.LastBootUpTime)! = DATEPART (DY, SMS_G_System_WORKSTATION_STATUS.LastHardwareScan)

Як ви бачите, vs будемо вважати, що комп'ютер користувача не вимикався на ніч, якщо дата останнього сканування (LastHardwareScan) не дорівнює датою завантаження ОС (LastBootUpTime).

Тепер з цього запиту потрібно сформувати SQL запит для побудови звіту зі списком комп'ютерів і користувачів. Вручну перетворювати цей запит в SQL досить складно (можна, звичайно, використовувати SQL Server Report Builder для побудови коду запиту, але є простіший шлях). Справа в тому, що движок ConfigMgr при виконанні WQL запитів сам транслює їх в синтаксис t-SQL за допомогою WMI провайдера і відправляє запит до бази. Всі ці операції фіксуються в балці smsprov.log.

Отже, виконайте свій запит і відкрийте файл \ ConfigMgr \ Logs \ smsprov.log. Знайдіть в балці свій запит. Він повинен починатися з Execute WQL =. Трохи нижче зверніть увагу на рядок, яка починається з Execute SQL =. Це як раз і є перетворений запит в мову SQL. Скопіюйте код SQL запиту. Ви можете використовувати його для побудови веб звіту SCCM або в Report Builder.

Distinct SMS_R_System.Netbios_Name0, SMS_R_System.User_Name0, SMS_R_System.AD_Site_Name0, ___ System_WORKSTATION_STATUS0.LastHWScan, SMS_G_System_OPERATING_SYSTEM.LastBootUpTime0, SMS_G_System_COMPUTER_SYSTEM.Model0 from System_DISC AS SMS_R_System INNER JOIN WorkstationStatus_DATA AS ___System_WORKSTATION_STATUS0 ON ___ System_WORKSTATION_STATUS0.MachineID = SMS_R_System.ItemKey INNER JOIN Operating_System_DATA AS SMS_G_System_OPERATING_SYSTEM ON SMS_G_System_OPERATING_SYSTEM.MachineID = SMS_R_System.ItemKey INNER JOIN Computer_System_DATA AS SMS_G_System_COMPUTER_SYSTEM ON SMS_G_System_COMPUTER_SYSTEM.MachineID = SMS_R_System.ItemKey INNER JOIN _RES_COLL_CM100213 AS SMS_CM_RES_COLL_CM100213 ON SMS_CM_RES_COLL_CM100213 .MachineID = SMS_R_System.ItemKey where DATEPART (dayofyear, SMS_G_System_OPERATING_SYSTEM.LastBootUpTime0) DATEPART (dayofyear, ___ System_WORKSTATION_STATUS0.LastHWScan)

Оскільки початковий WQL запит був обмежений колекцією SCCM, в SQL запиті також присутній відмежування по ID колекції (в цьому прикладі CM100213).

При формуванні звіту SCCM на веб-сторінці може з'явитися помилка:

An error occurred when the report was run. The details are as follows:
The SELECT permission was denied on the object '_RES_COLL_CM100213', database 'SMS_CM1', schema 'dbo'.
Error Number: -2147217911
Source: Microsoft OLE DB Provider for SQL Server
Native Error: 229

Судячи помилково поточному користувачеві не надано роль db_datareader для доступу до таблиці бази даних. Для виправлення цієї помилки необхідно вручну надати доступ на таблицю або подання до базі SCCM. Для цього запустіть SQL Server Management Studio, підключіться до бази SCCM, в розділі Tables або View знайдіть зазначену таблицю (в цьому прикладі _RES_COLL_CM100213) і відкрийте її властивості.

На вкладці Permissions надайте права на Select для smsschm_user і webreport_approle.

Спробуйте оновити веб-звіт в браузері, якщо знову виникне помилка "The SELECT permission was denied" із зазначенням інших таблиць, потрібно аналогічним чином дати доступ на них.