
Я постоянно получаю ужасное сообщение "Выражение небулева типа указано в контексте, где ожидается условие". errorr на выделенном жирным шрифтом "dbo.v_R_System.ResourceID" в приведенном ниже коде в разделе оператора "From". И я также получаю сообщение об ошибке "Неправильный синтаксис рядом с ключевым словом 'WHERE'".
Где в этом моем вопросе ошибка?
SELECT DISTINCT
dbo.v_GS_COMPUTER_SYSTEM.Name0 AS [Computer Name],
[Top Console User] = CASE
WHEN (dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 is NULL or dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 = '-1')
THEN 'Unknown'
ELSE dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0
END,
dbo.v_R_System.AD_Site_Name0 AS [Active Directory Site Name],
dbo.v_R_System.Resource_Domain_OR_Workgr0 AS [Domain Name],
dbo.v_GS_OPERATING_SYSTEM.Caption0 AS [Operating System],
dbo.v_GS_OPERATING_SYSTEM.CSDVersion0 AS [Service Pack],
dbo.v_GS_COMPUTER_SYSTEM.Model0 AS [Computer Model],
dbo.v_GS_OPERATING_SYSTEM.InstallDate0 AS [OS Install Date]
FROM
dbo.v_GS_COMPUTER_SYSTEM INNER JOIN
dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP ON dbo.v_GS_COMPUTER_SYSTEM.ResourceID = dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.ResourceID INNER JOIN
dbo.v_GS_OPERATING_SYSTEM INNER JOIN
dbo.v_R_System ON dbo.v_GS_OPERATING_SYSTEM.ResourceID = **dbo.v_R_System.ResourceID**
WHERE
dbo.v_GS_OPERATING_SYSTEM.Caption0 NOT LIKE '%Server%'
GROUP BY
dbo.v_GS_COMPUTER_SYSTEM.Name0,
dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0,
dbo.v_R_System.AD_Site_Name0,
dbo.v_R_System.Resource_Domain_OR_Workgr0,
dbo.v_GS_OPERATING_SYSTEM.CSDVersion0,
dbo.v_GS_PC_BIOS.Manufacturer0,
dbo.v_GS_COMPUTER_SYSTEM.NumberOfProcessors0,
dbo.v_GS_OPERATING_SYSTEM.Caption0,
dbo.v_GS_COMPUTER_SYSTEM.Model0,
dbo.v_GS_OPERATING_SYSTEM.InstallDate0
решение1
Скорее всего, у вас возникли проблемы с приоритетом, и ваше предложение from оценивается не так, как вы думаете.
Попробуйте добавить скобки, например так:
FROM
((dbo.v_GS_COMPUTER_SYSTEM
INNER JOIN dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP
ON (dbo.v_GS_COMPUTER_SYSTEM.ResourceID =
dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.ResourceID)
)
INNER JOIN dbo.v_GS_OPERATING_SYSTEM
)
INNER JOIN dbo.v_R_System ON (dbo.v_GS_OPERATING_SYSTEM.ResourceID =
dbo.v_R_System.ResourceID)
Если это не то, чего вы на самом деле хотите, то вы видите проблему.
Обратите внимание: хотя это не является строго необходимым и может быть учтено планировщиком выполнения запросов, вы можете создать временные таблицы меньшего размера, если используете подзапрос для обработки условия в предложении WHERE до начала выполнения объединений.
Я также не совсем уверен, что ваш синтаксис CASE правильный. Я считаю, что он должен быть
CASE WHEN
(dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 is NULL
or dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0 = '-1')
THEN 'Unknown'
ELSE dbo.v_GS_SYSTEM_CONSOLE_USAGE_MAXGROUP.TopConsoleUser0
END AS [Top Console User]
но, как известно, я ошибался. Ошибка, которую я ожидал бы от этого, была бы чем-то вроде "Неизвестное поле [Top Console User]".
решение2
Название отчета SCCM: Основная информация о пользователях консоли/общих компьютерах на рабочих станциях
Объяснение:
Это то, что я сделал, чтобы исправить мой первоначальный код, который выдавал мне ошибку выше, так что я смог вытащить информацию о главном пользователе консоли, а также некоторую общую информацию о компьютере, такую как производитель и модель. Кстати, главный пользователь консоли использует SCCM Asset Intelligence (когда он включен) и требует, чтобы "Аудит событий входа в учетную запись" политика также может быть включена в вашей среде, что можно сделать с помощью GPO. Вы можете прочитать больше о включении этой политики здесь наMicrosoft TechNet.Кроме того, у меня были проблемы с этим отчетом, не показывающим все значения NULL, но затем я поигрался с моими соединениями и понял, что мне нужно одно левое соединение с двумя правыми соединениями, чтобы все мои данные отображались для всех рабочих станций в моей среде. Поэтому отчет ниже будет делать две вещи:
- Он покажет, в каких системах находится главный пользователь консоли, если журнал безопасности проверяется на предмет успешных входов в систему (что опять же можно сделать через уже упомянутый объект групповой политики) или вручную для каждой системы.
и
- Он также покажет вам все значения NULL (в данном случае «Аудит событий входа в учетную запись не включен», поскольку именно на это я указал отчету заменить значения NULL), что, очевидно, сообщит вам, в каких системах не проводится аудит журнала безопасности.
Примечание:
Некоторые системы могут сообщать о «главном пользователе консоли», даже если у вас НЕ включен «Аудит событий входа в учетную запись» через GPO, только если по какой-то причине журнал безопасности был вручную настроен на аудит в этой конкретной системе кем-то, например, суперпользователем или локальным администратором и т. д. Поэтому не пугайтесь, если увидите, что некоторые системы сообщают эту информацию, но большинство из них этого не делают, потому что, скорее всего, именно по этой причине.
SQL-код:
Выбрать Уникальный
dbo.v_GS_COMPUTER_SYSTEM.Name0 AS [Computer Name],
[Top Console User] = CASE WHEN
(dbo.v_GS_SYSTEM_CONSOLE_USAGE.TopConsoleUser0) is NULL
THEN 'Audit Account Logon Events Not Enabled'
ELSE dbo.v_GS_SYSTEM_CONSOLE_USAGE.TopConsoleUser0
END,
dbo.v_R_System.Resource_Domain_OR_Workgr0 AS [Domain Name],
dbo.v_GS_OPERATING_SYSTEM.Caption0 AS [Operating System],
dbo.v_GS_OPERATING_SYSTEM.CSDVersion0 AS [Service Pack],
dbo.v_GS_COMPUTER_SYSTEM.Manufacturer0 AS [Computer Manufacturer],
dbo.v_GS_COMPUTER_SYSTEM.Model0 AS [Computer Model]
От
dbo.v_R_System
Left Join
dbo.v_GS_SYSTEM_CONSOLE_USAGE ON dbo.v_R_System.ResourceID = dbo.v_GS_SYSTEM_CONSOLE_USAGE.ResourceID
Right Join
dbo.v_GS_COMPUTER_SYSTEM ON dbo.v_GS_SYSTEM_CONSOLE_USAGE.ResourceID = dbo.v_GS_COMPUTER_SYSTEM.ResourceID
Right Join
dbo.v_GS_OPERATING_SYSTEM ON dbo.v_GS_COMPUTER_SYSTEM.ResourceID = dbo.v_GS_OPERATING_SYSTEM.ResourceID
Где
(Not (dbo.v_GS_OPERATING_SYSTEM.Caption0 Like '%Server%'))
Группа по
dbo.v_GS_COMPUTER_SYSTEM.Name0,
dbo.v_GS_SYSTEM_CONSOLE_USAGE.TopConsoleUser0,
dbo.v_R_System.Resource_Domain_OR_Workgr0,
dbo.v_GS_OPERATING_SYSTEM.Caption0,
dbo.v_GS_OPERATING_SYSTEM.CSDVersion0,
dbo.v_GS_COMPUTER_SYSTEM.Manufacturer0,
dbo.v_GS_COMPUTER_SYSTEM.Model0
Сортировать по
[Top Console User]
Имя отчета SCCM: Последний вошедший в систему пользователь/клиент SCCM Регистрация на рабочих станциях
Объяснение:
Вот код, который мне наконец-то понадобился после того, как я поговорил с отделом управления активами, и они сказали мне, что им на самом деле не нужен пользователь верхней консоли, а скорее последний вошедший в систему пользователь. Они не понимали разницы между ними, поэтому мне пришлось объяснить им это, а затем они сказали: «О, теперь мы поняли. Нет, нам нужен последний вошедший в систему пользователь, а также последний раз, когда рабочая станция зарегистрировалась или была в сети, спасибо». Итак, затем я поработал над этим кодом, который они смогли использовать. Кстати, этот код не использует SCCM Asset Intelligence, и для его работы не нужно включать аудит журнала безопасности. Кроме того, чтобы получить последний раз, когда рабочая станция «зарегистрировалась», я просто использовал сканирование последнего оборудования, чтобы извлечь эту информацию. Еще один момент: чтобы получить настоящего последнего вошедшего в систему пользователя из "dbo.v_GS_COMPUTER_SYSTEM.UserName0", сканирование инвентаризации оборудования должно быть включено каждый день, как я и настроил его в своей среде SCCM, поэтому я его и использую. Однако, если у вас не включена ежедневная инвентаризация оборудования, то вместо этого вам следует получить данные последнего вошедшего в систему пользователя из "V_GS_NETWORK_LOGIN_PROFILE.Name0".
SQL-код:
Выбрать Уникальный
dbo.v_GS_COMPUTER_SYSTEM.Name0 AS [Computer Name],
dbo.v_GS_COMPUTER_SYSTEM.Manufacturer0 AS [Computer Manufacturer],
dbo.v_GS_COMPUTER_SYSTEM.Model0 AS [Computer Model],
[Last Logged On User] = CASE WHEN
MAX(dbo.v_GS_COMPUTER_SYSTEM.UserName0) is NULL
THEN 'Uknown'
ELSE dbo.v_GS_COMPUTER_SYSTEM.UserName0
END,
dbo.v_R_SYSTEM.Resource_Domain_OR_Workgr0 AS [Domain],
dbo.v_GS_OPERATING_SYSTEM.Caption0 AS [Operating System],
dbo.v_GS_OPERATING_SYSTEM.CSDVersion0 AS [Service Pack],
dbo.v_GS_WORKSTATION_STATUS.LastHWScan AS [Last SCCM Client Check-In]
От
dbo.v_GS_COMPUTER_SYSTEM
INNER JOIN
dbo.v_R_System ON dbo.v_GS_COMPUTER_SYSTEM.ResourceID = dbo.v_R_System.ResourceID
INNER JOIN
dbo.v_GS_OPERATING_SYSTEM ON dbo.v_R_System.ResourceID = dbo.v_GS_OPERATING_SYSTEM.ResourceID
INNER JOIN
dbo.v_GS_WORKSTATION_STATUS ON dbo.v_GS_OPERATING_SYSTEM.ResourceID = dbo.v_GS_WORKSTATION_STATUS.ResourceID
Где
dbo.v_GS_OPERATING_SYSTEM.Caption0 Not Like '%Server%' and dbo.v_R_SYSTEM.Name0 Not Like 'WN%'
Группа по
dbo.v_GS_COMPUTER_SYSTEM.Name0,
dbo.v_GS_COMPUTER_SYSTEM.Manufacturer0,
dbo.v_GS_COMPUTER_SYSTEM.Model0,
dbo.v_GS_COMPUTER_SYSTEM.UserName0,
dbo.v_R_System.Resource_Domain_OR_Workgr0,
dbo.v_GS_OPERATING_SYSTEM.Caption0,
dbo.v_GS_OPERATING_SYSTEM.CSDVersion0,
dbo.v_GS_WORKSTATION_STATUS.LastHWScan
Сортировать по
[Computer Name]