
Sigo recibiendo el temido "Una expresión de tipo no booleano especificada en un contexto donde se espera una condición". error en negrita "dbo.v_R_System.ResourceID" en el código siguiente en la sección de declaración "De". Y también aparece el mensaje "Sintaxis incorrecta cerca de la palabra clave 'DÓNDE'". mensaje de error también.
¿Dónde, en esta consulta mía, está el error?
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
Respuesta1
Lo más probable es que esté teniendo problemas con un problema de precedencia y su cláusula from no se esté evaluando de la manera que cree.
Intente agregar paréntesis, así:
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)
Si eso no es lo que realmente desea que haga, verá el problema.
Como nota, aunque no es estrictamente necesario y el planificador de ejecución de consultas podría encargarse de ello, es posible que pueda crear tablas temporales más pequeñas si utiliza una subconsulta para cuidar la condición en su cláusula WHERE antes de comenzar. haciendo uniones.
Tampoco estoy del todo seguro de que la sintaxis CASE sea correcta. creo que debería ser
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]
pero se sabe que estoy equivocado. El error que esperaría de esto sería algo así como "Campo desconocido [Usuario principal de la consola]".
Respuesta2
Nombre del informe SCCM: Usuario principal de la consola/Información general de la computadora en estaciones de trabajo
Explicación:
Esto es lo que hice para arreglar mi código inicial que estaba fallando arriba, así pude obtener información sobre el usuario principal de la consola, así como información general de la computadora, como el fabricante y el modelo. Por cierto, el usuario principal de la consola aprovecha SCCM Asset Intelligence (cuando está habilitado) y requiere que "Auditar eventos de inicio de sesión de cuenta"La política también se habilitará en su entorno, lo que se puede hacer a través de un GPO. Puede leer más sobre cómo habilitar esta política aquí enMicrosoft Technet.Además, estaba teniendo problemas con este informe que no mostraba todos los valores NULL, pero luego jugué con mis uniones y me di cuenta de que necesitaba una unión izquierda con dos uniones derechas para que todos mis datos se mostraran en todas las estaciones de trabajo de mi entorno. . Entonces, el siguiente informe hará dos cosas:
- Mostrará qué sistemas tienen el usuario de consola principal si el registro de seguridad está siendo auditado para inicios de sesión exitosos (lo que nuevamente se puede hacer a través del GPO ya mencionado) o manualmente por sistema.
y
- También le mostrará todos los valores NULL (en este caso, 'Auditar eventos de inicio de sesión de cuenta no habilitados' ya que esto es lo que le estoy diciendo al informe que reemplace los valores NULL), lo que obviamente le indicará qué sistemas no tienen el registro de seguridad. siendo auditado.
Nota:
Algunos sistemas pueden informar al "Usuario principal de la consola" incluso si NO tiene habilitada la "Auditar eventos de inicio de sesión de cuenta" a través de un GPO solo si por alguna razón el Registro de seguridad se configuró manualmente para ser auditado en ese sistema en particular por alguien, como un superusuario, un administrador local, etc. Por lo tanto, no se asuste si ve que algunos sistemas informarán esta información, pero la mayoría no, porque es muy probable que esta sea la razón.
Código SQL:
Seleccionar Distinto
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]
De
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
Dónde
(Not (dbo.v_GS_OPERATING_SYSTEM.Caption0 Like '%Server%'))
Agrupar por
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
Ordenar por
[Top Console User]
Nombre del informe SCCM: Registro del último usuario que inició sesión/cliente SCCM en estaciones de trabajo
Explicación:
Ahora aquí está el código que finalmente necesitaba usar después de que hablé con el Departamento de Gestión de Activos y me dijeron que en realidad no necesitaban el Usuario de la Consola Superior, sino el último Usuario que inició sesión. No entendían la diferencia entre los dos, así que tuve que explicárselo y luego hicieron un "Oh, ya lo entendemos. No, necesitamos el último usuario que inició sesión, así como la última vez". La estación de trabajo se ha registrado o está en línea, gracias". Entonces trabajé en este código que pudieron usar. Por cierto, este código no aprovecha SCCM Asset Intelligence y no es necesario habilitar la auditoría del registro de seguridad para que esto funcione. Además, para obtener la última vez que se "registró" una estación de trabajo, simplemente utilicé el último escaneo de inventario de hardware para obtener esta información. Otra cosa, para obtener el último usuario que inició sesión desde "dbo.v_GS_COMPUTER_SYSTEM.UserName0", el escaneo de inventario de hardware debe habilitarse todos los días, que es como lo configuré en mi entorno SCCM, por eso lo uso. Sin embargo, si no tiene habilitado el Inventario de hardware para ejecutarse diariamente, entonces debería obtener los datos del último usuario que inició sesión desde "V_GS_NETWORK_LOGIN_PROFILE.Name0".
Código SQL:
Seleccionar Distinto
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]
De
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
Dónde
dbo.v_GS_OPERATING_SYSTEM.Caption0 Not Like '%Server%' and dbo.v_R_SYSTEM.Name0 Not Like 'WN%'
Agrupar por
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
Ordenar por
[Computer Name]