如何获取Windows上安装OSQuery的用户SID并实现注册表查询方案
如何在Windows中获取OSQuery安装用户的SID并查询其注册表项
一、核心背景说明
OSQuery无法直接查询CURRENT_USER注册表 hive,必须通过用户SID定位HKEY_USERS下对应的用户注册表分支。但logged_in_users表返回的是当前所有登录用户,不一定等于安装OSQuery的用户,因此需要更精准的定位方法。
二、获取OSQuery安装用户的SID
方法1:通过服务/进程信息反推
如果OSQuery以服务形式运行,可先查询服务运行用户,再关联users表获取SID:
-- 查询OSQuery服务的运行用户 SELECT username FROM services WHERE name = 'osqueryd'; -- 根据用户名获取对应SID SELECT sid FROM users WHERE username = '上述查询得到的用户名';
如果是手动启动的OSQuery进程,可通过进程表获取启动用户:
-- 查询OSQuery进程的启动用户 SELECT username FROM processes WHERE name IN ('osqueryi.exe', 'osqueryd.exe'); -- 关联users表获取SID SELECT sid FROM users WHERE username = '上述查询得到的用户名';
方法2:通过安装路径注册表项定位
OSQuery的安装路径通常会记录在注册表中,可先找到路径再获取所有者,最终映射到SID:
-- 查询OSQuery的安装路径注册表项 SELECT key, value FROM registry WHERE key LIKE '%SOFTWARE%osquery%' AND value LIKE '%osqueryd.exe';
拿到路径后,通过Windows命令行获取该文件的所有者:
icacls "C:\Program Files\osquery\osqueryd.exe" | findstr /i "OWNER"
再用OSQuery查询该用户的SID:
SELECT sid FROM users WHERE username = '获取到的所有者用户名';
三、查询目标用户的注册表项
拿到SID后,即可精准查询该用户在HKEY_USERS下的注册表项:
-- 替换为实际获取到的SID SELECT * FROM registry WHERE key LIKE '%S-1-5-21-XXXXXXXXX-XXXXXXXXX-XXXXXXXXX-XXXXXX%';
如果需要批量查询所有登录用户的注册表项,可使用关联查询:
SELECT r.* FROM registry r JOIN logged_in_users liu ON r.key LIKE '%' || liu.sid || '%';
四、注意事项
- 若OSQuery以SYSTEM权限运行,
logged_in_users返回的是当前所有交互式登录用户,但安装用户可能已注销不在其中。 - 优先通过服务/进程的运行用户定位,因为安装OSQuery的用户通常就是配置服务启动的用户,或是手动启动进程的用户。
内容的提问来源于stack exchange,提问作者Andrew Zick
相关产品推荐
相关产品推荐

