#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从服务启动交互式桌面中的程序。
答案 0 :(得分:2)
错误1314
是“客户端未持有所需的权限”。
来自WTSQueryUserToken()
文档(http://msdn.microsoft.com/en-us/library/aa383840.aspx):
要成功调用此函数,调用应用程序必须在LocalSystem帐户的上下文中运行并具有SE_TCB_NAME权限
此外,您对WTSQueryUserToken()
的致电应如下:
WTSQueryUserToken(dwSessionId, &hTokenDup);
您还需要启用SetTokenInformation()
的相应权限。
最重要的是,您正在尝试执行Windows为高权限进程保留的内容,因此您需要确保将您的进程配置为正常运行(可能作为与常规非特权进行对话的服务)用户互动的过程。)