在服务中用管理员权限创建一个可弹出UI的进程



在服务中用管理员权限创建一个可弹出UI的进程

       
  1. do  
  2.     {  
  3. //      if (!OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hThisToken ))  
  4. //      {  
  5. //          PrintfDbgStr(TEXT("OpenProcessToken error !error code:%d\n"),GetLastError());  
  6. //          bSuccess = FALSE;  
  7. //          break;  
  8. //      }  
  9. //      if(!SetPrivilege(hThisToken,SE_TCB_NAME,TRUE))  
  10. //      {  
  11. //          PrintfDbgStr(TEXT("SetPrivilege error !error code:%d\n"),GetLastError());  
  12. //          bSuccess = FALSE;  
  13. //          break;  
  14. //      }  
  15.         DWORD dwSessionId = WTSGetActiveConsoleSessionId();  
  16.         if(!WTSQueryUserToken(dwSessionId,&hToken))  
  17.         {  
  18.             PrintfDbgStr(TEXT("WTSQueryUserToken error !error code:%d\n"),GetLastError());  
  19.             bSuccess = FALSE;  
  20.             break;  
  21.         }  
  22.   
  23.         STARTUPINFO si;  
  24.         PROCESS_INFORMATION pi;  
  25.         ZeroMemory(&si,sizeof(STARTUPINFO));  
  26.         ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));  
  27.         si.cb = sizeof(STARTUPINFO);  
  28.         si.lpDesktop = _T("WinSta0\\Default");  
  29.         si.wShowWindow = TRUE;  
  30.         si.dwFlags     = STARTF_USESHOWWINDOW;  
  31.   
  32.         LPVOID pEnv = NULL;  
  33.         DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;  
  34.         if(!CreateProcessAsUser(hToken,NULL,pBuf,NULL,NULL,FALSE,dwCreationFlag,pEnv,NULL,&si,&pi))  
  35.         {  
  36.             PrintfDbgStr(TEXT("CreateProcessAsUser error !error code:%d\n"),GetLastError());  
  37.             bSuccess = FALSE;  
  38.             break;  
  39.         }  
  40.           
  41.     }while(0);  
do
	{
// 		if (!OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hThisToken ))
// 		{
// 			PrintfDbgStr(TEXT("OpenProcessToken error !error code:%d\n"),GetLastError());
// 			bSuccess = FALSE;
// 			break;
// 		}
// 		if(!SetPrivilege(hThisToken,SE_TCB_NAME,TRUE))
// 		{
// 			PrintfDbgStr(TEXT("SetPrivilege error !error code:%d\n"),GetLastError());
// 			bSuccess = FALSE;
// 			break;
// 		}
		DWORD dwSessionId = WTSGetActiveConsoleSessionId();
		if(!WTSQueryUserToken(dwSessionId,&hToken))
		{
			PrintfDbgStr(TEXT("WTSQueryUserToken error !error code:%d\n"),GetLastError());
			bSuccess = FALSE;
			break;
		}

		STARTUPINFO si;
		PROCESS_INFORMATION pi;
		ZeroMemory(&si,sizeof(STARTUPINFO));
		ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
		si.cb = sizeof(STARTUPINFO);
		si.lpDesktop = _T("WinSta0\\Default");
		si.wShowWindow = TRUE;
		si.dwFlags     = STARTF_USESHOWWINDOW;

		LPVOID pEnv = NULL;
		DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
		if(!CreateProcessAsUser(hToken,NULL,pBuf,NULL,NULL,FALSE,dwCreationFlag,pEnv,NULL,&si,&pi))
		{
			PrintfDbgStr(TEXT("CreateProcessAsUser error !error code:%d\n"),GetLastError());
			bSuccess = FALSE;
			break;
		}
		
	}while(0);

这种方法创建的进程不是管理员权限的,因为是调用了用户的令牌创建的进程。不过,确实能顺利弹出UI。

  1. HANDLE hToken = NULL;  
  2.     HANDLE hTokenDup = NULL;  
  3.     do   
  4.     {  
  5.         if(OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken))  
  6.         {  
  7.             if(DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS,NULL, SecurityIdentification, TokenPrimary, &hTokenDup))  
  8.             {  
  9.                 DWORD dwSessionId = WTSGetActiveConsoleSessionId();  
  10.                 if(!SetTokenInformation(hTokenDup,TokenSessionId,&dwSessionId,sizeof(DWORD)))  
  11.                 {  
  12.                     PrintfDbgStr(TEXT("SetTokenInformation error !error code:%d\n"),GetLastError());  
  13.                     bSuccess = FALSE;  
  14.                     break;  
  15.                 }  
  16.   
  17.                 STARTUPINFO si;  
  18.                 PROCESS_INFORMATION pi;  
  19.                 ZeroMemory(&si,sizeof(STARTUPINFO));  
  20.                 ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));  
  21.                 si.cb = sizeof(STARTUPINFO);  
  22.                 si.lpDesktop = _T("WinSta0\\Default");  
  23.                 si.wShowWindow = SW_SHOW;  
  24.                 si.dwFlags     =   STARTF_USESHOWWINDOW /*|STARTF_USESTDHANDLES*/;  
  25.   
  26.                 LPVOID pEnv = NULL;  
  27.                 DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT;  
  28.                 if(!CreateEnvironmentBlock(&pEnv,hTokenDup,FALSE))  
  29.                 {  
  30.                     PrintfDbgStr(TEXT("CreateEnvironmentBlock error !error code:%d\n"),GetLastError());  
  31.                     bSuccess = FALSE;  
  32.                     break;  
  33.                 }  
  34.   
  35.                 if(!CreateProcessAsUser(hTokenDup,NULL,pBuf,NULL,NULL,FALSE,dwCreationFlag,pEnv,NULL,&si,&pi))  
  36.                 {  
  37.                     PrintfDbgStr(TEXT("CreateProcessAsUser error !error code:%d\n"),GetLastError());  
  38.                     bSuccess = FALSE;  
  39.                     break;  
  40.                 }  
  41.   
  42.                 if(pEnv)  
  43.                 {  
  44.                     DestroyEnvironmentBlock(pEnv);  
  45.                 }  
  46.             }  
  47.             else  
  48.             {  
  49.                 PrintfDbgStr(TEXT("DuplicateTokenEx error !error code:%d\n"),GetLastError());  
  50.                 bSuccess = FALSE;  
  51.                 break;  
  52.             }  
  53.   
  54.                   
  55.         }  
  56.         else  
  57.         {  
  58.             PrintfDbgStr(TEXT("cannot get administror!error code:%d\n"),GetLastError());  
  59.             bSuccess = FALSE;  
  60.             break;  
  61.         }  
  62.     }while(0);  
  63.   
  64.     if(hTokenDup != NULL && hTokenDup != INVALID_HANDLE_VALUE)  
  65.         CloseHandle(hTokenDup);  
  66.     if(hToken != NULL && hToken != INVALID_HANDLE_VALUE)  
  67.         CloseHandle(hToken);  
HANDLE hToken = NULL;
	HANDLE hTokenDup = NULL;
	do 
	{
		if(OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken))
		{
			if(DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS,NULL, SecurityIdentification, TokenPrimary, &hTokenDup))
			{
				DWORD dwSessionId = WTSGetActiveConsoleSessionId();
				if(!SetTokenInformation(hTokenDup,TokenSessionId,&dwSessionId,sizeof(DWORD)))
				{
					PrintfDbgStr(TEXT("SetTokenInformation error !error code:%d\n"),GetLastError());
					bSuccess = FALSE;
					break;
				}

				STARTUPINFO si;
				PROCESS_INFORMATION pi;
				ZeroMemory(&si,sizeof(STARTUPINFO));
				ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
				si.cb = sizeof(STARTUPINFO);
				si.lpDesktop = _T("WinSta0\\Default");
				si.wShowWindow = SW_SHOW;
				si.dwFlags     =   STARTF_USESHOWWINDOW /*|STARTF_USESTDHANDLES*/;

				LPVOID pEnv = NULL;
				DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT;
				if(!CreateEnvironmentBlock(&pEnv,hTokenDup,FALSE))
				{
					PrintfDbgStr(TEXT("CreateEnvironmentBlock error !error code:%d\n"),GetLastError());
					bSuccess = FALSE;
					break;
				}

				if(!CreateProcessAsUser(hTokenDup,NULL,pBuf,NULL,NULL,FALSE,dwCreationFlag,pEnv,NULL,&si,&pi))
				{
					PrintfDbgStr(TEXT("CreateProcessAsUser error !error code:%d\n"),GetLastError());
					bSuccess = FALSE;
					break;
				}

				if(pEnv)
				{
					DestroyEnvironmentBlock(pEnv);
				}
			}
			else
			{
				PrintfDbgStr(TEXT("DuplicateTokenEx error !error code:%d\n"),GetLastError());
				bSuccess = FALSE;
				break;
			}

				
		}
		else
		{
			PrintfDbgStr(TEXT("cannot get administror!error code:%d\n"),GetLastError());
			bSuccess = FALSE;
			break;
		}
	}while(0);

	if(hTokenDup != NULL && hTokenDup != INVALID_HANDLE_VALUE)
		CloseHandle(hTokenDup);
	if(hToken != NULL && hToken != INVALID_HANDLE_VALUE)
		CloseHandle(hToken);
这里就能用管理员权限打开一个进程并,弹出UI了,注意dwCreationFlag和si的参数设定,我是经过多次试验得出的,错了的话,可能就弹不出来了哦。这种方法是打开用户的令牌但是把服务的所有权限都给这个令牌,所以用户令牌就有足够的权限用管理员打开进程了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值