Visual c++ 以用户身份创建进程

Visual c++ 以用户身份创建进程,visual-c++,Visual C++,我有一个作为系统运行的服务。我正在创建一个进程,但该进程也在系统帐户下运行 我想以用户身份运行该特定进程。为此,我使用了CreateProcessAsUserAPI。怎么了?。我复制了下面的代码 void Create_Process() { PHANDLE primaryToken = GetCurrentUserToken(); if (primaryToken == 0) { return FALSE; } STARTUPINFO Start

我有一个作为系统运行的服务。我正在创建一个进程,但该进程也在系统帐户下运行

我想以用户身份运行该特定进程。为此,我使用了
CreateProcessAsUser
API。怎么了?。我复制了下面的代码

void Create_Process()
{
    PHANDLE primaryToken = GetCurrentUserToken();
    if (primaryToken == 0)
    {
    return FALSE;
    }
    STARTUPINFO StartupInfo;
    PROCESS_INFORMATION processInfo;
    StartupInfo.cb = sizeof(STARTUPINFO);
    SECURITY_ATTRIBUTES Security1;
    SECURITY_ATTRIBUTES Security2;
    void* lpEnvironment = NULL; 
    // Get all necessary environment variables of logged in user
    // to pass them to the process
    BOOL resultEnv = CreateEnvironmentBlock(&lpEnvironment,primaryToken, FALSE);
    if (resultEnv == 0)
    { 
    long nError = GetLastError(); 
    }
    // Launch the process in the client's logon session.
    BOOL result= CreateProcessAsUser(
    primaryToken,            
    _T("c:\\windows\\system32\\abc.exe"),              
    NULL,     
    &Security1,              
    &Security2,              
    FALSE,             
    NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT,  
    lpEnvironment,              
    NULL,              
    &StartupInfo,               
    &processInfo               
    );

}

PHANDLE GetCurrentUserToken()
{
    PHANDLE currentToken = 0;
    PHANDLE primaryToken = 0;
    int dwSessionId = 0;
    PHANDLE hUserToken = 0;
    PHANDLE hTokenDup = 0;
    PWTS_SESSION_INFO pSessionInfo = 0;
    DWORD dwCount = 0;
    // Get the list of all terminal sessions 
    WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwCount);
    int dataSize = sizeof(WTS_SESSION_INFO);
    // look over obtained list in search of the active session
    for (DWORD i = 0; i < dwCount; ++i)
    {
    WTS_SESSION_INFO si = pSessionInfo[i];
    if (WTSActive == si.State)
    {
    // If the current session is active – store its ID
    dwSessionId = si.SessionId;
    break;
    }
    }
    // Get token of the logged in user by the active session ID

    BOOL bRet = WTSQueryUserToken(dwSessionId, currentToken);
    if (bRet == false)
    {
    return 0;
    }

    bRet = DuplicateTokenEx(currentToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, 0, SecurityImpersonation, TokenPrimary, primaryToken);
    if (bRet == false)
    {
        return 0;
    }
    return primaryToken;
}
void Create_Process()
{
PHANDLE primaryToken=GetCurrentUserToken();
if(primaryToken==0)
{
返回FALSE;
}
STARTUPINFO STARTUPINFO;
处理信息处理信息;
StartupInfo.cb=sizeof(StartupInfo);
安全属性安全1;
安全属性安全2;
void*lpEnvironment=NULL;
//获取登录用户的所有必要环境变量
//将它们传递给流程
BOOL resultEnv=CreateEnvironmentBlock(&lpEnvironment,primaryToken,FALSE);
如果(resultEnv==0)
{ 
长错误=GetLastError();
}
//在客户端的登录会话中启动进程。
BOOL result=CreateProcessAsUser(
primaryToken,
_T(“c:\\windows\\system32\\abc.exe”),
无效的
&安全1,
&安全2,
错误的
普通_优先级|类|创建_UNICODE |环境,
环境,,
无效的
&StartupInfo,
&processInfo
);
}
幻影GetCurrentUserToken()
{
幻影currentToken=0;
幻影primaryToken=0;
int-dwSessionId=0;
幻影hUserToken=0;
Phantle hTokenDup=0;
PWTS_SESSION_INFO pSessionInfo=0;
DWORD dwCount=0;
//获取所有终端会话的列表
WTSEnumerateSessions(WTS_当前_服务器_句柄、0、1和PSSessionInfo以及dwCount);
int dataSize=sizeof(WTS\u会话\u信息);
//查看获取的列表以搜索活动会话
对于(DWORD i=0;i
“它不工作”不是问题。怎么了?有错误吗?错误发生在哪一行代码上?它会默默地失败吗?这类事情在你的问题中很重要。我看到你调用
GetLastError
。。。你有没有想过告诉我们那个电话的结果可能是什么?