如何从进程句柄获取进程SID?附OpenProcess句柄示例
获取进程SID并用于文件权限设置的正确方法
- 调用
GetSecurityInfo()处理进程对象时,第二个参数SE_OBJECT_TYPE必须指定为SE_KERNEL_OBJECT——因为进程属于Windows内核对象类型。 - 我们只需要获取所有者SID,因此安全信息标志传
OWNER_SECURITY_INFORMATION即可。
示例代码
DWORD dwErr = 0; PSID pProcessSid = nullptr; // 从进程句柄提取所有者SID dwErr = GetSecurityInfo( hProcess, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &pProcessSid, nullptr, // 不需要组SID,传空 nullptr, // 不需要DACL,传空 nullptr, // 不需要SACL,传空 nullptr // 不需要接收安全描述符指针,传空 ); if (dwErr == ERROR_SUCCESS && pProcessSid != nullptr) { // 这里可以用pProcessSid构造文件权限的ACE // 例如:创建允许该进程SID访问文件的ACE,再调用SetNamedSecurityInfo设置到目标文件 // 注意:GetSecurityInfo返回的pProcessSid是进程安全描述符的内部指针,无需手动释放 } else { // 处理错误,可调用GetLastError()获取详细错误码 }
关键注意事项
- 你的
hProcess已经用PROCESS_ALL_ACCESS打开,包含了READ_CONTROL权限(获取安全信息必需),满足调用条件。 - 如果需要同时获取组SID或其他安全信息,可组合对应的标志,比如
OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION。 - 获取到SID后,可通过
BuildExplicitAccessWithName或AddAccessAllowedAce等函数构造访问控制项,再应用到目标文件。
内容的提问来源于stack exchange,提问作者szefitoo
相关产品推荐
相关产品推荐

