我不断收到可怕的“在预期条件的上下文中指定的非布尔类型的表达式”。在“From”语句部分的下面代码中的粗体“ dbo.v_R_System.ResourceID ”处出现错误。而且我还收到“关键字'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
最有可能的是,您遇到了优先级问题,并且您的 from 子句没有按照您的想法进行评估。
尝试添加括号,如下所示:
如果这不是您真正想要的,您就会看到问题所在。
请注意,虽然这不是绝对必要的,并且可能由查询执行计划程序处理,但如果您在开始之前使用子查询处理 WHERE 子句中的条件,则可以创建较小的临时表做连接。
我也不完全确定您的 CASE 语法是否正确。我相信应该是
但是,众所周知,我是错的。我期望的错误将是“未知字段[顶级控制台用户]”的影响。
SCCM 报告名称:工作站上的顶级控制台用户/一般计算机信息
解释:
这就是我为修复上面错误的初始代码所做的工作,因此我能够提取有关顶级控制台用户的信息以及一些通用计算机信息,如制造商和型号。顺便说一句,顶级控制台用户利用 SCCM 资产智能(启用时)并要求在您的环境中也启用“审核帐户登录事件”策略,这可以通过 GPO 完成。您可以在Microsoft TechNet上阅读有关启用此策略的更多信息。此外,我遇到了此报告未显示所有 NULL 值的问题,但后来我使用了我的连接并意识到我需要一个左连接和两个右连接,以便我的所有数据显示在我的环境中的所有工作站上. 因此,下面的报告将做两件事:
和
笔记:
某些系统可能会报告“顶级控制台用户”,即使您没有通过 GPO 启用“审核帐户登录事件”,仅当出于某种原因手动配置安全日志以由某人在该特定系统上审核时,例如超级用户或本地管理员等。因此,如果您看到某些系统会报告此信息,但大多数系统不会报告此信息,请不要惊慌,因为这很可能是原因。
SQL 代码:
从
在哪里
通过...分组
订购方式
SCCM 报告名称:上次登录用户/SCCM 客户端在工作站上签入
解释:
现在这是我在与资产管理部门交谈后最终需要使用的代码,他们告诉我他们实际上并不需要顶级控制台用户,而是最后登录用户。他们不明白两者之间的区别,所以我不得不向他们解释,然后他们做了一个“哦,我们现在明白了。不,我们需要最后登录用户以及最后一次工作站已签入或在线,谢谢。” 所以,然后我研究了他们能够使用的代码。顺便说一句,此代码不利用 SCCM 资产智能,并且无需启用安全日志审核即可使其正常工作。此外,为了获得工作站“签入”的最后时间,我只是使用最后一次硬件库存扫描来提取此信息。另一件事,要从“dbo.v_GS_COMPUTER_SYSTEM.UserName0”获取真正的最后登录用户,应该每天启用硬件清单扫描,这就是我在 SCCM 环境中配置它的方式,这就是我使用它的原因。但是,如果您没有启用硬件清单以每天运行,那么您应该从“V_GS_NETWORK_LOGIN_PROFILE.Name0”获取最后登录的用户数据。
SQL 代码:
选择不同
从
在哪里
通过...分组
订购方式