在执行SetTokenInformation时得到错误1314

时间:2011-04-25 15:07:18

标签: winapi

#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.c c://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
来自mingw的gcc版本4.5.2(GCC)。

不过,请忽略错误126。

我的问题是: 为什么得到错误1314?

我想在不知道登录用户和密码的情况下使用CreateProcessAsUser从服务启动交互式桌面中的程序。

1 个答案:

答案 0 :(得分:2)

错误1314是“客户端未持有所需的权限”。

来自WTSQueryUserToken()文档(http://msdn.microsoft.com/en-us/library/aa383840.aspx):

  

要成功调用此函数,调用应用程序必须在LocalSystem帐户的上下文中运行并具有SE_TCB_NAME权限

此外,您对WTSQueryUserToken()的致电应如下:

WTSQueryUserToken(dwSessionId, &hTokenDup);

您还需要启用SetTokenInformation()的相应权限。

最重要的是,您正在尝试执行Windows为高权限进程保留的内容,因此您需要确保将您的进程配置为正常运行(可能作为与常规非特权进行对话的服务)用户互动的过程。)