
나는 "조건이 예상되는 컨텍스트에 지정된 부울 유형이 아닌 표현식"이라는 무서운 메시지를 계속 받습니다. 굵게 표시된 "에 오류가 있습니다.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]
그러나 나는 틀린 것으로 알려져 있습니다. 여기서 예상되는 오류는 "알 수 없는 필드 [상위 콘솔 사용자]"로 인한 것입니다.
답변2
SCCM 보고서 이름: 워크스테이션의 상위 콘솔 사용자/일반 컴퓨터 정보
설명:
이것은 위에서 오류가 발생한 초기 코드를 수정하기 위해 수행한 작업이므로 상위 콘솔 사용자에 관한 정보는 물론 제조업체 및 모델과 같은 일부 일반 컴퓨터 정보를 가져올 수 있었습니다. 그런데 상위 콘솔 사용자는 SCCM Asset Intelligence(활성화된 경우)를 활용하고 "계정 로그온 이벤트 감사" 정책은 GPO를 통해 수행할 수 있는 환경에서도 활성화됩니다. 이 정책 활성화에 대한 자세한 내용은 여기에서 확인할 수 있습니다.마이크로소프트 테크넷.또한 이 보고서에 모든 NULL 값이 표시되지 않는 문제가 있었지만 조인을 사용해 본 결과 내 환경의 모든 워크스테이션에 대해 모든 데이터를 표시하려면 하나의 왼쪽 조인과 두 개의 오른쪽 조인이 필요하다는 것을 깨달았습니다. . 따라서 아래 보고서는 두 가지 작업을 수행합니다.
- 성공적인 로그온에 대해 보안 로그를 감사하는 경우(이미 언급한 GPO를 통해 다시 수행할 수 있음) 또는 시스템별로 수동으로 상위 콘솔 사용자가 있는 시스템이 표시됩니다.
그리고
- 또한 보안 로그가 없는 시스템을 분명히 알려주는 모든 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 자산 인텔리전스를 활용하지 않으며 이 기능이 작동하려면 보안 로그 감사를 활성화할 필요가 없습니다. 또한 워크스테이션이 마지막으로 "체크인"된 시간을 얻기 위해 마지막 하드웨어 인벤토리 검색을 사용하여 이 정보를 가져왔습니다. 또 한 가지, "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]