получил ошибку 1314 при выполнении SetTokenInformation - PullRequest
0 голосов
/ 25 апреля 2011
#include <windows.h>
#include <stdio.h>
#include <Userenv.h>
#include <Wtsapi32.h>
int main() {
    DWORD err;
    err=GetLastError();
    printf( "err001:%d\n",err);
    HANDLE hTokenThis = NULL;
    HANDLE hTokenDup = NULL;
    HANDLE hThisProcess = GetCurrentProcess();
    OpenProcessToken(hThisProcess, TOKEN_ALL_ACCESS, &hTokenThis);
    err=GetLastError();
    printf( "err002:%d\n",err);
    DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED,NULL, SecurityIdentification, TokenPrimary, &hTokenDup);
    err=GetLastError();
    printf( "err003:%d\n",err);
    DWORD dwSessionId = WTSGetActiveConsoleSessionId();
    WTSQueryUserToken(dwSessionId, hTokenDup);
    //DWORD dwSessionId = 1;
    SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD));
    err=GetLastError();
    printf( "err004:%d\n",err);
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(STARTUPINFO));
    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
    si.cb = sizeof(STARTUPINFO);
    si.lpDesktop = "WinSta0\\Default";
    LPVOID pEnv = NULL;
    DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
    CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE);
    err=GetLastError();
    printf( "err005:%d\n",err);
    CreateProcessAsUser(
            hTokenDup,
            NULL,
            (char *)"notepad",
            NULL,
            NULL,
            FALSE,
            dwCreationFlag,
            pEnv,
            NULL,
            &si,
            &pi);
    printf("here we go\n");
    err=GetLastError();
    printf( "err006:%d\n",err);

    return 0;
}

Компиляция: gcc -o session.exe session.cc http://Windows/System32/kernel32.dll c: // Window s / System32 / wtsapi32.dll -lUserenv

Результат выполнения:

session.exe
err001:126
err002:126
err003:126
err004:1314
err005:203
here we go
err006:87

gcc версии 4.5.2 (GCC) от mingw.

btw, просто игнорируйте ошибку 126.

Мой вопрос: почему возникла ошибка 1314?

Я хочу запустить программу на интерактивном рабочем столе из службы, используя CreateProcessAsUser, не зная логин пользователя и пароль.

1 Ответ

2 голосов
/ 25 апреля 2011

Ошибка 1314: «Требуемая привилегия не удерживается клиентом».

Из документов WTSQueryUserToken() (http://msdn.microsoft.com/en-us/library/aa383840.aspx):

Для успешного вызова этой функции вызывающийприложение должно быть запущено в контексте учетной записи LocalSystem и иметь привилегию SE_TCB_NAME

Также ваш вызов WTSQueryUserToken() должен выглядеть следующим образом:

WTSQueryUserToken(dwSessionId, &hTokenDup);

И вам понадобитсятакже включены соответствующие привилегии для SetTokenInformation().

Суть в том, что вы пытаетесь сделать что-то, что Windows резервирует для процессов с высоким уровнем привилегий, поэтому вам нужно убедиться, что ваш процесс настроен для правильной работы(возможно, как сервис, который общается с обычным непривилегированным процессом для взаимодействия с пользователем).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...