使用另一个表中的变量遍历sql查询

时间:2019-07-04 14:46:42

标签: sql sqlite osquery

我有两个表文件和用户,

我想查看C:\ Users \%USERNAME%\ Documents每个用户的文件信息

例如这将从“示例”文档中获取信息:

SELECT * FROM file WHERE path LIKE 'C:\Users\example\Documents\%%';

但是用户名来自用户

SELECT username FROM users;

返回

+--------------------+
| username           |
+--------------------+
| Administrator      |
| DefaultAccount     |
| example            |
| Guest              |
| WDAGUtilityAccount |
| SYSTEM             |
| LOCAL SERVICE      |
| NETWORK SERVICE    |
+--------------------+

或者,有:

SELECT directory FROM users;

+---------------------------------------------+
| directory                                   |
+---------------------------------------------+
|                                             |
|                                             |
| C:\Users\example                            |
|                                             |
|                                             |
| %systemroot%\system32\config\systemprofile  |
| %systemroot%\ServiceProfiles\LocalService   |
| %systemroot%\ServiceProfiles\NetworkService |
+---------------------------------------------+

哪个提供了路径的第一部分,但仍然无法将“文档”加入查询的末尾,也无法运行文件查询。

所以,如何遍历每个用户名。

我尝试修改,但是两个表都不能修改

2 个答案:

答案 0 :(得分:0)

这是使用JOIN查询的绝佳机会:

SELECT f.*
FROM file f JOIN users u
WHERE f.path LIKE 'C:\Users\' || u.username || '\Documents\%%'

运行此查询时,osquery将首先生成用户列表,然后将用户名替换为file表提供的路径。

JOIN是组合各种表结果的一种非常强大的方法,值得花一些时间进行实验并学习如何使用此功能。

答案 1 :(得分:0)

Zach的回答很好,但是有时用户目录的名称可以不同于其各自的用户名。

非常感谢,我们在directory表中还有users列,该列返回用户的主目录。使用此列将防止目录/用户名不匹配导致查询输出出现问题:

SELECT f.*
FROM file f JOIN users u
WHERE f.path LIKE u.directory || '\Documents\%%';