VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1663|回复: 3

[求助] WIN7 CREATEPROCESSASUSER 错误1314

[复制链接]
34_avatar_middle
online_vip 发表于 2016-1-29 12:17:30 | 显示全部楼层 |阅读模式
现在我遇到的问题是这样的,需要在win7的普通账户下,
使用管理员权限(比如:右键,使用管理员权限运行)运行某个程序,
这个程序又要开启一个进程,使用当前账户的权限来运行(好麻烦),
网上的做法是先扫描explorer.exe进程,获取token,然后再用CreateProcessAsUser来创建进程,
但是我写了一个小程序来模拟,CreateProcessAsUser这个函数调用失败,提示1314,权限不足。
不知是我的代码哪里有问题,请大家帮忙看看,谢啦~



  1. #include <iostream>
  2. using namespace std;

  3. #include "windows.h"
  4. #include "tlhelp32.h"

  5. BOOL GetProcessTokenByName(HANDLE &hToken, LPTSTR szProcessName)
  6. {       
  7.         // 变量及初始化       
  8.         STARTUPINFO st;       
  9.         PROCESS_INFORMATION pi;
  10.         PROCESSENTRY32 ps;
  11.         HANDLE hSnapshot;       
  12.         ZeroMemory(&st, sizeof(STARTUPINFO));       
  13.         ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));       
  14.         st.cb = sizeof(STARTUPINFO);       
  15.         ZeroMemory(&ps,sizeof(PROCESSENTRY32));       
  16.         ps.dwSize = sizeof(PROCESSENTRY32);       
  17.         // 遍历进程       
  18.         hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);       
  19.         if(hSnapshot == INVALID_HANDLE_VALUE)       
  20.         {               
  21.                 return FALSE;       
  22.         }       
  23.         if(!Process32First(hSnapshot,&ps))       
  24.         {               
  25.                 return FALSE;       
  26.         }       
  27.         do
  28.         {
  29.                 wprintf(_T("%s , %u\n"), ps.szExeFile, ps.th32ProcessID);
  30.                 // 比较进程名               
  31.                 if(lstrcmpi(ps.szExeFile,szProcessName)==0)               
  32.                 {                        // 找到了                       
  33.                         //*lpPID = ps.th32ProcessID;                       
  34.                         //CloseHandle(hSnapshot);                       
  35.                         //return TRUE;               

  36.                         HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ps.th32ProcessID);
  37.                         BOOL bRet = FALSE;
  38.                         HANDLE tmpToken;
  39.                         if( OpenProcessToken(hProcess, /*TOKEN_QUERY*/TOKEN_ALL_ACCESS, &tmpToken) )
  40.                         {
  41.                                 bRet = DuplicateTokenEx(
  42.                                         tmpToken,                                                //_In_      HANDLE hExistingToken,
  43.                                         MAXIMUM_ALLOWED,                                //_In_      DWORD dwDesiredAccess,
  44.                                         NULL,                                                        //_In_opt_  LPSECURITY_ATTRIBUTES lpTokenAttributes,
  45.                                         SecurityIdentification,                        //_In_      SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
  46.                                         TokenPrimary,                                        //_In_      TOKEN_TYPE TokenType,
  47.                                         &hToken                                                        //_Out_     PHANDLE phNewToken
  48.                                         );

  49.                                 //DWORD dwSessionId = WTSGetActiveConsoleSessionId();
  50.                                 //SetTokenInformation(hToken,TokenSessionId,(void*)dwSessionId,sizeof(DWORD));

  51.                                 //SetPrivilege(hToken, SE_ASSIGNPRIMARYTOKEN_NAME, TRUE);


  52.                         }
  53.                         else
  54.                         {
  55.                                 printf("OpenProcessToken error: %u\n", GetLastError());
  56.                         }
  57.                         CloseHandle (hSnapshot);
  58.                         return (bRet);
  59.                 }       
  60.         }while(Process32Next(hSnapshot,&ps));       
  61.         // 没有找到       
  62.         CloseHandle(hSnapshot);       
  63.         return FALSE;
  64. }

  65. BOOL RunasUser( )
  66. {
  67.         HANDLE        hToken;
  68.         if( GetProcessTokenByName( hToken, _T("explorer.exe") ) )
  69.         {
  70.                 if( hToken != INVALID_HANDLE_VALUE )
  71.                 {
  72.                         STARTUPINFO si;
  73.                         PROCESS_INFORMATION pi;

  74.                         ZeroMemory(&si, sizeof(STARTUPINFO));
  75.                         si.cb= sizeof(STARTUPINFO);
  76.                         si.lpDesktop = TEXT("winsta0\\default");

  77.                         {
  78.                                 TOKEN_PRIVILEGES        tp;
  79.                                 tp.PrivilegeCount        =1;
  80.                                 if(!LookupPrivilegeValue(NULL,SE_ASSIGNPRIMARYTOKEN_NAME/*SE_DEBUG_NAME*/,&tp.Privileges[0].Luid))
  81.                                 {               
  82.                                         printf("LookupPrivilegeValue value Error: %u\n",GetLastError());
  83.                                 }

  84.                                 tp.Privileges[0].Attributes        = SE_PRIVILEGE_ENABLED;
  85.                                 if(!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL) )
  86.                                 {               
  87.                                         printf("Adjust Privilege value Error: %u\n",GetLastError());
  88.                                 }
  89.                         }
  90.                         printf("Adjust Privilege\n");
  91.                         {
  92.                                 TOKEN_PRIVILEGES        tp;
  93.                                 tp.PrivilegeCount        =1;
  94.                                 if(!LookupPrivilegeValue(NULL,SE_INCREASE_QUOTA_NAME/*SE_DEBUG_NAME*/,&tp.Privileges[0].Luid))
  95.                                 {               
  96.                                         printf("LookupPrivilegeValue value Error: %u\n",GetLastError());
  97.                                 }
  98.                                 tp.Privileges[0].Attributes        = SE_PRIVILEGE_ENABLED;
  99.                                 if(!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL) )
  100.                                 {               
  101.                                         printf("Adjust Privilege value Error: %u\n",GetLastError());
  102.                                 }
  103.                         }

  104.                         BOOL bResult = CreateProcessAsUser(
  105.                                 hToken,                                                        //_In_opt_     HANDLE hToken,
  106.                                 _T("D:\\GetMac.exe"),                        //_In_opt_     LPCTSTR lpApplicationName,
  107.                                 NULL,                                                        //_Inout_opt_  LPTSTR lpCommandLine,
  108.                                 NULL,                                                        //_In_opt_     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  109.                                 NULL,                                                        //_In_opt_     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  110.                                 FALSE,                                                        //_In_         BOOL bInheritHandles,
  111.                                 NORMAL_PRIORITY_CLASS,                        //_In_         DWORD dwCreationFlags,
  112.                                 NULL,                                                        //_In_opt_     LPVOID lpEnvironment,
  113.                                 NULL,                                                        //_In_opt_     LPCTSTR lpCurrentDirectory,
  114.                                 &si,                                                        //_In_         LPSTARTUPINFO lpStartupInfo,
  115.                                 &pi                                                                //_Out_        LPPROCESS_INFORMATION lpProcessInformation
  116.                                 );
  117.                         CloseHandle(hToken);

  118.                         if( bResult )
  119.                         {
  120.                                 //成功
  121.                                 return TRUE;
  122.                         }
  123.                         else
  124.                         {
  125.                                 DWORD dwErr = GetLastError();
  126.                                 printf( "error: %u\n", dwErr );
  127.                         }
  128.                 }
  129.         }
  130.         else
  131.         {
  132.                 printf("GetProcessTokenByName fail\n");
  133.         }

  134.         return FALSE;
  135. }
  136. int _tmain(int argc, _TCHAR* argv[])
  137. {

  138.         BOOL bRet = RunasUser();

  139.         printf("result: %d\n", bRet);
  140.         system("pause");
  141.         return 0;
  142. }
复制代码




上一篇:修改 获取宽带ADSL的账号与密码 源码 要求能在vs2010上用
下一篇:ReadString读取Unicode TXT文本错误
22_avatar_middle
在线会员 发表于 2016-1-29 13:03:35 | 显示全部楼层
我机器上执行正常,可以运行指定的程序。
环境:win7 x64 VS2013 with update5
UAC关闭状态。
51_avatar_middle
online_admins 发表于 2016-1-29 13:21:49 | 显示全部楼层
如果还是不行的话,可以参考下这个帖子,里面提到的问题跟楼主类似,而且找到解决的方法了
http://bbs.csdn.net/topics/10402133
34_avatar_middle
ico_lz  楼主| 发表于 2016-1-29 14:22:51 | 显示全部楼层
Syc 发表于 2016-1-29 13:21
如果还是不行的话,可以参考下这个帖子,里面提到的问题跟楼主类似,而且找到解决的方法了
http://bbs.csd ...

不行啊老大。我把提权什么也加进去了。还是不行
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-6-20 02:12

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表