如何在进程启动时获取AppContainer SID以打开指定目录对象?
获取进程的AppContainer SID(进程启动时即可获取)
当然有办法在进程启动时拿到目标进程的AppContainer SID!Windows提供了原生API来实现这个需求,本质上就是从进程的访问令牌中提取该SID,这也是Process Explorer背后用的核心逻辑。
核心思路与步骤
要获取AppContainer SID,你需要和Windows的令牌系统交互,步骤如下:
- 第一步:获取目标进程的句柄,并打开它的访问令牌(需要
TOKEN_QUERY权限) - 第二步:通过
GetTokenInformation函数,指定TokenAppContainerSid参数来查询令牌中的AppContainer SID - 第三步:将二进制格式的SID转换为可读的字符串格式(用
ConvertSidToStringSidW函数)
代码示例(C++)
以下是一个可以直接复用的示例,以获取当前进程的AppContainer SID为例:
#include <windows.h> #include <sddl.h> #include <iostream> #pragma comment(lib, "advapi32.lib") #pragma comment(lib, "user32.lib") int main() { HANDLE hProcess = GetCurrentProcess(); HANDLE hToken = nullptr; // 打开当前进程的访问令牌 if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) { std::cout << "OpenProcessToken failed: " << GetLastError() << std::endl; return 1; } // 先获取所需缓冲区大小 DWORD dwSize = 0; GetTokenInformation(hToken, TokenAppContainerSid, nullptr, 0, &dwSize); if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { std::cout << "GetTokenInformation (size check) failed: " << GetLastError() << std::endl; CloseHandle(hToken); return 1; } // 分配缓冲区并获取AppContainer SID PSID pAppContainerSid = (PSID)LocalAlloc(LPTR, dwSize); if (!GetTokenInformation(hToken, TokenAppContainerSid, pAppContainerSid, dwSize, &dwSize)) { std::cout << "GetTokenInformation failed: " << GetLastError() << std::endl; LocalFree(pAppContainerSid); CloseHandle(hToken); return 1; } // 将SID转换为字符串 LPWSTR pszSidString = nullptr; if (ConvertSidToStringSidW(pAppContainerSid, &pszSidString)) { std::wcout << L"AppContainer SID: " << pszSidString << std::endl; LocalFree(pszSidString); } else { std::cout << "ConvertSidToStringSidW failed: " << GetLastError() << std::endl; } // 清理资源 LocalFree(pAppContainerSid); CloseHandle(hToken); return 0; }
注意事项
- 权限问题:如果要获取其他进程的AppContainer SID,需要先调用
OpenProcess获取目标进程的句柄,且需要PROCESS_QUERY_INFORMATION权限;打开令牌时同样需要TOKEN_QUERY权限。 - 进程启动时机:进程启动后,其访问令牌立即生效,所以你可以在进程启动后的第一时间(比如自己进程的入口函数,或者监控到其他进程启动后)执行上述逻辑,完全可以拿到SID。
- 非AppContainer进程:如果目标进程不是AppContainer进程,
GetTokenInformation会返回ERROR_NO_TOKEN或者ERROR_INVALID_PARAMETER,可以通过这个判断进程是否处于AppContainer沙箱中。
内容的提问来源于stack exchange,提问作者Enosh Cohen
相关产品推荐
相关产品推荐

