CreateProcessAsUser

原创 2011年01月11日 19:49:00

微软从XP/2003开始为我们提供了一套Windows Terminal Service 的相关API,这些API都以WTS开头(请安装MSDN2005以查阅相关说明),要获得活动Session也不止一个途径,最简单的就是直接使用  
DWORD WTSGetActiveConsoleSessionId(void);  
来获得活动Session Id 。要在程序中使用这些API需要最新的Platform SDK(如果你正在使用Visual Studio 2005那么它已经具备了相关头文件和库文件可以直接使用了),如果你在使用VC++ 6.0 你也没有或者不打算安装最新的SDK那么你可以直接使用LoadLibrary() 装载wtsapi32.dll然后使用GetProcAddress()获得相关函数的地址以调用它们。我们获得了活动SessionId后就可以使用  
BOOL WTSQueryUserToken(  
ULONG SessionId,  
PHANDLE phToken  
);  
来获取当前活动Session中的用户令牌(Token),有了这个Token我们的就可以在活动Session中创建新进程了,  
BOOL CreateProcessAsUser(  
HANDLE hToken,  
LPCTSTR lpApplicationName,  
LPTSTR lpCommandLine,  
LPSECURITY_ATTRIBUTES lpProcessAttributes,  
LPSECURITY_ATTRIBUTES lpThreadAttributes,  
BOOL bInheritHandles,  
DWORD dwCreationFlags,  
LPVOID lpEnvironment,  
LPCTSTR lpCurrentDirectory,  
LPSTARTUPINFO lpStartupInfo,  
LPPROCESS_INFORMATION lpProcessInformation  
);  
将我们获得的Token作为此API的第一个参数即可,你可以先尝试一下运行一个notepad.exe看看,怎么样?你可以在控制台桌面上看到新进程了。再查看一下进程列表,该进程的用户名是当前控制台登录的用户。可是这里我们又遇到一个问题,我们需要收集当前交本机互式登录用户的一些信息,而有些操作需要很高的权限才能完成,而Vista下即使是Administraotrs用户组成员默认也是以Users权限启动进程的,所以我们创建的新进程只有Users权限,无法完成一些操作,当然我们可以使用Vista所提供的UI来询问用户以提升至管理员权限,可有些操作甚至是管理员Token也无法完成的,而且需要用户确认实在在易用性上大打折扣,所以我决定在活动Session中以SYSTEM权限启动我们的用户交互程序。显然 WTSQueryUserToken() 是不好用了。  
之前,我们提到过进程所属的Session是由进程Token中的TokenSessionId来决定的,那么我们是不是可以复制服务进程的Token然后修改其中的TokenSessionId,从而在用户桌面上创建一个具有SYSTEM权限的新进程呢?答案是肯定的。一下是实现这个操作的代码,为了缩小篇幅我删除了异常处理代码  
HANDLEhTokenThis = NULL;  
HANDLEhTokenDup = NULL;  
HANDLEhThisProcess = GetCurrentProcess();  
OpenProcessToken(hThisProcess, TOKEN_ALL_ACCESS, &hTokenThis);  
DuplicateTokenEx(hTokenThis, MAXIMUM_ALLOWED,NULL, SecurityIdentification, TokenPrimary, &hTokenDup); 
DWORDdwSessionId = WTSGetActiveConsoleSessionId();  
SetTokenInformation(hTokenDup, TokenSessionId, &dwSessionId, sizeof(DWORD));  

STARTUPINFOsi;  
PROCESS_INFORMATION pi;  
ZeroMemory(&si, sizeof(STARTUPINFO));  
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));  
si.cb = sizeof(STARTUPINFO);  
si.lpDesktop = "WinSta0//Default";  

LPVOIDpEnv = NULL;  
DWORDdwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;  

CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE);  

CreateProcessAsUser(  
  hTokenDup,  
  NULL,  
  (char *)"notepad",  
  NULL,  
  NULL,  
  FALSE,  
  dwCreationFlag,  
  pEnv,  
  NULL,  
  &si,  
  &pi);

相关文章推荐

使用CreateProcessAsUser的范例代码

-------- CreateProcessEx.h文件 -------- #ifndef _CREATE_PROCESS_EX_H_ #define _CREATE_PROCESS_EX_H_ #i...
  • dsg333
  • dsg333
  • 2016年09月01日 10:26
  • 3499

CreateProcessAsUser的用法

    最近太忙了,忙着弄公司的产品,现在好不容易有点时间来写点东西,代码很乱,没有整理,只是提供思路DWORD __stdcall INTER_GetExplorerToken(OUT PHANDL...
  • sdpdww
  • sdpdww
  • 2008年12月16日 15:33
  • 18403

用CreateProcessAsUser 创建最低权限进程

高 管理权限(进程可以将文件安装到“Program Files”文件夹,并写入敏感注册表区域,如 HKEY_LOCAL_MACHINE。) 中 用户权限(进程可在用户的“文档”文件夹创建和修改文件,...
  • fakine
  • fakine
  • 2013年01月24日 13:42
  • 7752

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

win7 createprocess 如何以当前登陆用户身份运行程序

开发中有时会遇到这样的问题,当服务程序需要使用某些功能时,由于用户的关系而受到限制, 比如访问注册表的HKEY_CURRENT_USER键,使用网络等等,这时候就需要以当前登陆用户的身份 去进行操作,...

CreateProcessAsUser的用法

    最近太忙了,忙着弄公司的产品,现在好不容易有点时间来写点东西,代码很乱,没有整理,只是提供思路DWORD __stdcall INTER_GetExplorerToken(OUT PHANDL...
  • sdpdww
  • sdpdww
  • 2008年12月16日 15:33
  • 18403

CreateProcessAsUser 资料

  • 2010年10月04日 22:15
  • 24KB
  • 下载

CreateProcessAsUser()的使用

HANDLE hToken = NULL; TCHAR szUsername[MAX_PATH]; TCHAR para[MAX_PATH] = {0}; TCHAR szUsernamePat...

CreateProcessAsUser常用参数说明

最近写代码,要把进程启到别的session下,要用到CreateProcessAsUser函数。  查阅了MSDN, 整理了参数说明供日后查阅。 先看函数原型 BOOL WINAPI ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CreateProcessAsUser
举报原因:
原因补充:

(最多只允许输入30个字)