在服务中用管理员权限创建一个进程

来源:互联网 发布:代码高亮java 编辑:程序博客网 时间:2024/06/06 21:04
HANDLE hToken;    HDESK hdesk;    HWINSTA hwinsta;    PROCESS_INFORMATION pi;    PSID psid;    STARTUPINFO si;    //    // obtain an access token for the user fester    //    if (!LogonUser(        strUser, //用户名“administrator"        NULL,        strPwd,  //密码“password”        LOGON32_LOGON_INTERACTIVE,        LOGON32_PROVIDER_DEFAULT,        &hToken))    {        goto end;    }    //    // obtain a handle to the interactive windowstation    //    hwinsta = OpenWindowStation(        "winsta0",        FALSE,        READ_CONTROL | WRITE_DAC        );    if (hwinsta == NULL)        goto end;    HWINSTA hwinstaold = GetProcessWindowStation();    //    // set the windowstation to winsta0 so that you obtain the    // correct default desktop    //    if (!SetProcessWindowStation(hwinsta))        goto end;    //    // obtain a handle to the "default" desktop    //    hdesk = OpenDesktop(        "default",        0,        FALSE,        READ_CONTROL | WRITE_DAC |        DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS        );    if (hdesk == NULL)        goto end;    //    // obtain the logon sid of the user fester    //    if (!ObtainSid(hToken, &psid))        goto end;    //    // add the user to interactive windowstation    //    if (!AddTheAceWindowStation(hwinsta, psid))        goto end;    //    // add user to "default" desktop    //    if (!AddTheAceDesktop(hdesk, psid))        goto end;    //    // free the buffer for the logon sid    //    RemoveSid(&psid);    //    // close the handles to the interactive windowstation and desktop    //    CloseWindowStation(hwinsta);    CloseDesktop(hdesk);    //    // initialize STARTUPINFO structure    //    ZeroMemory(&si, sizeof(STARTUPINFO));    si.cb = sizeof(STARTUPINFO);    si.lpDesktop = "winsta0\\default";    //    // start the process    //    if (!CreateProcessAsUser(        hToken,        NULL,        (LPSTR)(LPCTSTR)strcmd,        NULL,        NULL,        FALSE,        NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE,        //CREATE_NO_WINDOW|NORMAL_PRIORITY_CLASS,        NULL,        NULL,        &si,        &pi        ))    {        goto end;    }    SetProcessWindowStation(hwinstaold); //set it back    //    // close the handles    //    CloseHandle(pi.hProcess);    CloseHandle(pi.hThread);


原创粉丝点击