You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在进程启动时获取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;
}

注意事项

  1. 权限问题:如果要获取其他进程的AppContainer SID,需要先调用OpenProcess获取目标进程的句柄,且需要PROCESS_QUERY_INFORMATION权限;打开令牌时同样需要TOKEN_QUERY权限。
  2. 进程启动时机:进程启动后,其访问令牌立即生效,所以你可以在进程启动后的第一时间(比如自己进程的入口函数,或者监控到其他进程启动后)执行上述逻辑,完全可以拿到SID。
  3. 非AppContainer进程:如果目标进程不是AppContainer进程,GetTokenInformation会返回ERROR_NO_TOKEN或者ERROR_INVALID_PARAMETER,可以通过这个判断进程是否处于AppContainer沙箱中。

内容的提问来源于stack exchange,提问作者Enosh Cohen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:33:49