Как преобразовать 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.

sccm код запроса на языке wql

Мне понадобилось создать веб отчет для пользователей, в котором должны содержаться компьютеры, которые не выключались на ночь. У меня получился такой запрос (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.

smsprov.log

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

The SELECT permission was denied on the object _RES_COLL_ database SMS, schema dbo

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

На вкладке Permissions предоставьте права на Select для smsschm_user и webreport_approle.

smsschm_user и webreport_approle

Попробуйте обновить веб-отчет в браузере, если снова возникнет ошибка «The SELECT permission was denied» с указанием других таблиц, нужно аналогичным образом дать доступ на них.


Предыдущая статья Следующая статья


Комментариев: 0 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)