Назад | Перейти на главную страницу

Продолжайте получать ошибку при запуске моего кода SQL

Я продолжаю получать ужасное «выражение не логического типа, указанное в контексте, где ожидается условие». ошибка жирным шрифтом "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: Пользователь верхней консоли / Общая информация о компьютере на рабочих станциях

Пояснение:

Это то, что я сделал, чтобы исправить свой исходный код, который давал мне ошибку выше, поэтому я смог получить информацию о пользователе верхней консоли, а также некоторую общую информацию о компьютере, такую ​​как производитель и модель. Между прочим, верхний пользователь консоли использует SCCM Asset Intelligence (если он включен) и требует, чтобы "Аудит событий входа в учетную запись"Политика также включена в вашей среде, что можно сделать через объект групповой политики. Подробнее о включении этой политики можно узнать здесь, на Microsoft TechNet. Кроме того, у меня были проблемы с этим отчетом, в котором не отображались все значения NULL, но затем я поигрался со своими объединениями и понял, что мне нужно одно левое соединение с двумя правыми объединениями, чтобы все мои данные отображались на всех рабочих станциях в моей среде. . Итак, отчет ниже будет делать две вещи:

  • Он покажет, какие системы имеют пользователя верхней консоли, если журнал безопасности проверяется на предмет успешных входов в систему (что снова может быть выполнено через уже упомянутый объект групповой политики) или вручную для каждой системы.

и

  • Он также покажет вам все значения NULL (в данном случае `` События входа в учетную запись аудита не включены '', поскольку это то, что я говорю в отчете для замены значений 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: последний вход в систему / Регистрация клиента SCCM на рабочих станциях

Пояснение:

Вот код, который мне наконец нужно было использовать после того, как я поговорил с отделом управления активами, и они сказали мне, что им на самом деле нужен не верхний пользователь консоли, а последний вошедший в систему пользователь. Они не понимали разницы между ними, поэтому мне пришлось объяснить это им, а потом они сказали: «О, теперь мы поняли. Нет, вместо этого нам нужен последний вошедший в систему пользователь, а также последний раз. рабочая станция зарегистрировалась или подключена к сети, спасибо ". Итак, затем я работал над этим кодом, который они могли использовать. Этот код, кстати, не использует 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]