
太字の「条件が期待されるコンテキストで非ブール型の式が指定されました。」という恐ろしいエラーが繰り返し表示されます。dbo.v_R_システム.リソースID「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 値が表示されないという問題がありましたが、結合を試してみたところ、環境内のすべてのワークステーションのすべてのデータを表示するには、1 つの左結合と 2 つの右結合が必要であることがわかりました。そのため、以下のレポートでは次の 2 つのことを行います。
- セキュリティログがログオン成功について監査されている場合(これも、すでに述べた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 クライアント チェックイン
説明:
資産管理部門と話した後、最終的に使用する必要があったコードは次のとおりです。彼らは、トップ コンソール ユーザーではなく、最終ログオン ユーザーが必要だと言いました。彼らは 2 つの違いを理解していなかったので、そのことを説明する必要がありました。その後、彼らは「ああ、分かりました。いいえ、代わりに最終ログオン ユーザーと、ワークステーションが最後にチェックインまたはオンラインになった時刻が必要です。ありがとうございます」と言いました。そこで、彼らが使用できるこのコードに取り組みました。ちなみに、このコードは SCCM 資産インテリジェンスを活用しておらず、これを機能させるためにセキュリティ ログ監査を有効にする必要はありません。また、ワークステーションが最後に「チェックイン」した時刻を取得するために、最終ハードウェア インベントリ スキャンを使用してこの情報を取得しました。もう 1 つ、"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]