Продолжайте получать ошибку при запуске моего кода SQL
Я продолжаю получать страшное "Выражение не булева типа, указанное в контексте, где ожидается условие". errorr с выделенным жирным шрифтом "dbo.v_R_System.ResourceID" в коде ниже в разделе "От". Кроме того, я также получаю сообщение об ошибке "Неверный синтаксис рядом с ключевым словом" ГДЕ ".".
Где в этом моем запросе ошибка?
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
2 ответа
Скорее всего, у вас возникли проблемы с проблемой приоритета, а предложение 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]]".
Имя отчета SCCM: Главный пользователь консоли / Общая информация о компьютере на рабочих станциях
Объяснение:
Это то, что я сделал, чтобы исправить мой исходный код, из-за которого я ошибался выше, чтобы я мог получить информацию о пользователе верхней консоли, а также некоторую общую информацию о компьютере, такую как производитель и модель. Кстати, пользователь верхней консоли использует SCCM Asset Intelligence (когда он включен, то есть) и требует, чтобы в вашей среде была включена политика "Аудит событий входа в учетную запись", что можно сделать с помощью объекта групповой политики. Вы можете прочитать больше о включении этой политики здесь на Microsoft TechNet. Кроме того, у меня были проблемы с тем, что в этом отчете не отображались все значения NULL, но затем я поиграл с моими объединениями и понял, что мне нужно одно левое соединение с двумя правыми объединениями, чтобы все мои данные отображались для всех рабочих станций в моей среде., Итак, отчет ниже будет делать две вещи:
- Он покажет, какие системы имеют главного пользователя консоли, если журнал безопасности проверяется для успешных входов в систему (что опять-таки может быть сделано через уже упомянутый объект групповой политики) или вручную для системы
а также
- Он также покажет вам все значения NULL (в данном случае "События входа в учетную запись аудита не включены", поскольку это то, о чем я говорю в отчете для замены значений NULL), что, очевидно, скажет вам, в каких системах отсутствует журнал безопасности. быть проверенным.
Примечание:
Некоторые системы могут сообщать "Top Console User", даже если у вас НЕ включены "Audit Account Logon Events", включенные через объект групповой политики, только если по какой-то причине журнал безопасности был вручную настроен для аудита в этой конкретной системе кем-то, например Суперпользователь, или локальный администратор и т. д. Итак, не волнуйтесь, если вы видите, что некоторые системы сообщают эту информацию, но большинство из них этого не делают, потому что это, скорее всего, причина.
Код 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, и для его работы не нужно включать аудит Журнала Безопасности. Кроме того, для того, чтобы в последний раз получить рабочую станцию "Checked-In", я просто использовал Last Scan Inventory Scan для получения этой информации. Другое дело, чтобы получить истинного последнего вошедшего в систему пользователя из "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]