如何在Window服务中创建当前用户权限的子进程

void CreateMyProcess()
{
    DWORD dwSessionID = WTSGetActiveConsoleSessionId();
    HANDLE hToken = NULL;
    HANDLE hTokenDup = NULL;
    LPVOID pEnv = NULL;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    //获取当前处于活动状态用户的Token
    if (!WTSQueryUserToken(dwSessionID, &hToken))
    {
        DWORD nCode = GetLastError();
        CloseHandle(hToken);
        return;
    }

    //复制新的Token
    if (!DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hTokenDup))
    {
        DWORD nCode = GetLastError();
        CloseHandle(hToken);
        return;
    }

    //创建环境信息
    if (!CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE))
    {
        DWORD nCode = GetLastError();
        CloseHandle(hTokenDup);
        CloseHandle(hToken);
        return;
    }

    //设置启动参数
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    si.lpDesktop = _TEXT("winsta0\\default");

    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

    char szCurrentDirectory[MAX_PATH] = {};

    //获取当前工作目录,由GetModuleFileName实现
    //CAppPathUtil::GetAppDir(szCurrentDirectory, MAX_PATH);

    //开始创建进程
    //创建标志信息,这里定义,但至少包含CREATE_UNICODE_ENVIRONMENT 和 NORMAL_PRIORITY_CLASS
    DWORD dwCreateFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT;
    if (!CreateProcessAsUser(hTokenDup, szApp, NULL, NULL, NULL, FALSE, dwCreateFlag, pEnv, szCurrentDirectory, &si, &pi))
    {
        DWORD nCode = GetLastError();
        DestroyEnvironmentBlock(pEnv);
        CloseHandle(hTokenDup);
        CloseHandle(hToken);
        return;
    }

    //附加操作,回收资源
    //等待启动的进程结束
    //WaitForSingleObject(pi.hProcess, INFINITE);
    DestroyEnvironmentBlock(pEnv);
    CloseHandle(hTokenDup);
    CloseHandle(hToken);
}

转载于https://blog.csdn.net/CMbug/article/details/52691180

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值