SCCM-Berichtsname: Top-Konsolenbenutzer/Allgemeine Computerinformationen auf Arbeitsstationen

SCCM-Berichtsname: Top-Konsolenbenutzer/Allgemeine Computerinformationen auf Arbeitsstationen

Ich erhalte immer wieder die gefürchtete Fehlermeldung „Ein Ausdruck eines nicht-booleschen Typs wurde in einem Kontext angegeben, in dem eine Bedingung erwartet wird.“ bei der fettgedruckten „dbo.v_R_System.ResourceID" im Code unten im Abschnitt „From“-Anweisung. Außerdem erhalte ich auch die Fehlermeldung „Falsche Syntax in der Nähe des Schlüsselworts ‚WHERE‘.“

Wo in meiner Abfrage liegt der Fehler?

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

Antwort1

Höchstwahrscheinlich liegt ein Vorrangproblem vor und Ihre From-Klausel wird nicht wie erwartet ausgewertet.

Versuchen Sie, Klammern hinzuzufügen, etwa so:

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)

Wenn dies nicht das ist, was Sie eigentlich möchten, liegt das Problem klar auf der Hand.

Beachten Sie: Obwohl es nicht unbedingt erforderlich ist und möglicherweise vom Abfrageausführungsplaner übernommen wird, können Sie möglicherweise kleinere temporäre Tabellen erstellen, wenn Sie eine Unterabfrage verwenden, um die Bedingung in Ihrer WHERE-Klausel zu berücksichtigen, bevor Sie mit der Ausführung von Verknüpfungen beginnen.

Ich bin mir auch nicht ganz sicher, ob Ihre CASE-Syntax korrekt ist. Ich glaube, sie sollte

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]

aber ich habe mich schon oft geirrt. Der Fehler, den ich erwarten würde, wäre etwa „Unbekanntes Feld [Top Console User]“.

Antwort2

SCCM-Berichtsname: Top-Konsolenbenutzer/Allgemeine Computerinformationen auf Arbeitsstationen

Erläuterung:

So habe ich meinen ursprünglichen Code repariert, der oben einen Fehler verursacht hat. So konnte ich Informationen zum Top-Konsolenbenutzer sowie einige allgemeine Computerinformationen wie Hersteller und Modell abrufen. Übrigens nutzt der Top-Konsolenbenutzer SCCM Asset Intelligence (wenn es aktiviert ist) und erfordert, dass die "Kontoanmeldeereignisse überwachen"-Richtlinie muss auch in Ihrer Umgebung aktiviert werden, was über ein GPO erfolgen kann. Weitere Informationen zum Aktivieren dieser Richtlinie finden Sie hier aufMicrosoft TechNet.Außerdem hatte ich Probleme mit diesem Bericht, da nicht alle NULL-Werte angezeigt wurden. Dann habe ich aber mit meinen Joins herumgespielt und festgestellt, dass ich einen Left Join mit zwei Right Joins brauche, damit alle meine Daten für alle Workstations in meiner Umgebung angezeigt werden. Der folgende Bericht macht also zwei Dinge:

  • Es wird angezeigt, welche Systeme den Top-Konsolenbenutzer haben, wenn das Sicherheitsprotokoll auf erfolgreiche Anmeldungen geprüft wird (was wiederum über das bereits erwähnte GPO erfolgen kann) oder manuell pro System

Und

  • Außerdem werden Ihnen alle NULL-Werte angezeigt (in diesem Fall „Audit Account Logon Events Not Enabled“, da ich den Bericht anweise, die NULL-Werte hiermit zu ersetzen). Dadurch erfahren Sie natürlich, bei welchen Systemen das Sicherheitsprotokoll nicht geprüft wird.

Notiz:

Einige Systeme melden den „Top Console User“ möglicherweise auch dann zurück, wenn Sie die Funktion „Kontoanmeldeereignisse überwachen“ NICHT über eine Gruppenrichtlinie aktiviert haben, und zwar nur dann, wenn das Sicherheitsprotokoll aus irgendeinem Grund manuell so konfiguriert wurde, dass es auf diesem bestimmten System von jemandem, z. B. einem Superuser oder einem lokalen Administrator usw., überwacht werden kann. Geraten Sie also nicht in Panik, wenn Sie sehen, dass einige Systeme diese Informationen zurückmelden, die Mehrheit tut dies jedoch nicht, da dies höchstwahrscheinlich der Grund dafür ist.

SQL-Code:

Wählen Sie 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] 

Aus

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 

Wo

(Not (dbo.v_GS_OPERATING_SYSTEM.Caption0 Like '%Server%'))

Gruppiere nach

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

Sortieren nach

[Top Console User]

SCCM-Berichtsname: Zuletzt angemeldeter Benutzer/SCCM-Client-Check-In auf Arbeitsstationen

Erläuterung:

Hier ist nun der Code, den ich schließlich verwenden musste, nachdem ich mit der Asset-Management-Abteilung gesprochen hatte und sie mir sagten, dass sie eigentlich nicht den Top Console User, sondern den Last Logged On User benötigten. Sie verstanden den Unterschied zwischen den beiden nicht, also musste ich ihnen das erklären, und danach sagten sie: „Oh, jetzt haben wir es verstanden. Nein, wir brauchen stattdessen den Last Logged On User sowie den letzten Zeitpunkt, zu dem eine Arbeitsstation eingecheckt oder online war, danke.“ Also arbeitete ich an diesem Code, den sie verwenden konnten. Dieser Code nutzt übrigens nicht SCCM Asset Intelligence und es muss keine Sicherheitsprotokollüberwachung aktiviert werden, damit dies funktioniert. Um außerdem den letzten Zeitpunkt zu ermitteln, zu dem eine Arbeitsstation „eingecheckt“ war, habe ich einfach den Last Hardware Inventory Scan verwendet, um diese Informationen abzurufen. Außerdem sollte der Hardware Inventory Scan jeden Tag aktiviert werden, um den wirklich letzten angemeldeten Benutzer aus „dbo.v_GS_COMPUTER_SYSTEM.UserName0“ zu erhalten. So habe ich es in meiner SCCM-Umgebung konfiguriert, deshalb verwende ich es. Wenn Sie die tägliche Ausführung der Hardwareinventur jedoch nicht aktiviert haben, sollten Sie stattdessen die Daten des zuletzt angemeldeten Benutzers aus „V_GS_NETWORK_LOGIN_PROFILE.Name0“ abrufen.

SQL-Code:

Wählen Sie 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] 

Aus

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

Wo

dbo.v_GS_OPERATING_SYSTEM.Caption0 Not Like '%Server%' and dbo.v_R_SYSTEM.Name0 Not Like 'WN%' 

Gruppiere nach

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

Sortieren nach

[Computer Name]

verwandte Informationen