Я продолжаю получать ужасное «выражение не логического типа, указанное в контексте, где ожидается условие». ошибка жирным шрифтом "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
Скорее всего, у вас возникли проблемы с проблемой приоритета, и ваше предложение 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]
но, как известно, я ошибался. Ошибка, которую я ожидал бы от этого, была бы чем-то вроде «Неизвестное поле [Пользователь верхней консоли]».
Пояснение:
Это то, что я сделал, чтобы исправить свой исходный код, который давал мне ошибку выше, поэтому я смог получить информацию о пользователе верхней консоли, а также некоторую общую информацию о компьютере, такую как производитель и модель. Между прочим, верхний пользователь консоли использует SCCM Asset Intelligence (если он включен) и требует, чтобы "Аудит событий входа в учетную запись"Политика также включена в вашей среде, что можно сделать через объект групповой политики. Подробнее о включении этой политики можно узнать здесь, на Microsoft TechNet. Кроме того, у меня были проблемы с этим отчетом, в котором не отображались все значения NULL, но затем я поигрался со своими объединениями и понял, что мне нужно одно левое соединение с двумя правыми объединениями, чтобы все мои данные отображались на всех рабочих станциях в моей среде. . Итак, отчет ниже будет делать две вещи:
и
Примечание:
Некоторые системы могут сообщать о «Пользователе верхней консоли», даже если у вас НЕ включена функция «Аудит событий входа в учетную запись» через объект групповой политики, только если по какой-то причине журнал безопасности был вручную настроен для аудита этой конкретной системы кем-то, например суперпользователь или локальный администратор и т. д. Так что не волнуйтесь, если вы видите, что некоторые системы будут сообщать эту информацию, но большинство из них нет, потому что это более чем вероятно причина.
Код SQL:
Выберите Distinct
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 Asset Intelligence, и для этого не нужно включать аудит журнала безопасности. Кроме того, чтобы получить последний раз, когда рабочая станция "зарегистрировалась", я просто использовал последнюю проверку инвентаризации оборудования, чтобы получить эту информацию. Другое дело, чтобы получить истинное значение последнего вошедшего в систему пользователя из "dbo.v_GS_COMPUTER_SYSTEM.UserName0", сканирование инвентаризации оборудования должно быть включено каждый день, как я настроил его в своей среде SCCM, поэтому я и использую его. Однако, если у вас не включена ежедневная инвентаризация оборудования, вы должны вместо этого получить данные последнего авторизованного пользователя из «V_GS_NETWORK_LOGIN_PROFILE.Name0».
Код SQL:
Выберите Distinct
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]