SCCM 報告名稱:工作站上的頂級控制台使用者/一般計算機信息

SCCM 報告名稱:工作站上的頂級控制台使用者/一般計算機信息

我不斷收到可怕的“在需要條件的上下文中指定的非布林類型的表達式”。錯誤者位於粗體“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 資產智能(啟用時)並要求“審核帳號登入事件「策略也可以在您的環境中啟用,這可以透過 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]

相關內容