版权声明:本文为博主原创文章,未经博主允许不得转载。

  1. BOOL ExecuteAsUser(LPCWSTR lpszUserName, LPCWSTR lpszPassword, LPCWSTR lpszApplication, LPCWSTR lpszCmdLine)
  2. {
  3. if(NULL == lpszUserName)
  4. {
  5. return FALSE;
  6. }
  7. if(NULL == lpszApplication)
  8. {
  9. return FALSE;
  10. }
  11. BOOL bRet = FALSE;
  12. WCHAR* pUserName = NULL;
  13. WCHAR* pPassword = NULL;
  14. STARTUPINFO si = {sizeof(si)};
  15. PROCESS_INFORMATION pi = {0};
  16. WCHAR szApp[MAX_PATH * 2] = {0};
  17. // Check User Name
  18. size_t nLen = wcslen(lpszUserName) + 1;
  19. pUserName = new WCHAR[nLen];
  20. StringCchPrintfW(pUserName, nLen, L"%s", lpszUserName);
  21. // Check Password
  22. nLen = (NULL != lpszPassword) ? (wcslen(lpszPassword) + 1) : 2;
  23. pPassword = new WCHAR[nLen];
  24. StringCchPrintfW(pPassword, nLen, L"%s", (NULL != lpszPassword) ? lpszPassword : L"");
  25. USER_INFO_1 ui;
  26. DWORD dwError = 0;
  27. DWORD dwLevel = 1;
  28. ui.usri1_name = pUserName;
  29. ui.usri1_password = pPassword;
  30. ui.usri1_priv = USER_PRIV_USER;
  31. ui.usri1_home_dir = NULL;
  32. ui.usri1_comment = NULL;
  33. ui.usri1_flags = UF_SCRIPT;
  34. ui.usri1_script_path = NULL;
  35. // Add User
  36. if(NERR_Success != NetUserAdd(NULL, dwLevel, (LPBYTE)&ui, &dwError))
  37. {
  38. goto _END_;
  39. }
  40. if((NULL != lpszCmdLine) && wcslen(lpszCmdLine))
  41. StringCchPrintfW(szApp, _countof(szApp), L"%s %s", lpszApplication, lpszCmdLine);
  42. else
  43. StringCchPrintfW(szApp, _countof(szApp), L"%s", lpszApplication);
  44. if(CreateProcessWithLogonW(lpszUserName, NULL, lpszPassword, LOGON_WITH_PROFILE, NULL, szApp, 0, NULL, NULL, &si, &pi))
  45. {
  46. bRet = TRUE;
  47. CloseHandle(pi.hThread);
  48. CloseHandle(pi.hProcess);
  49. }
  50. else
  51. {
  52. dwError = GetLastError();
  53. goto _CLEANUP_;
  54. }
  55. bRet = TRUE;
  56. _CLEANUP_:
  57. // Delete User
  58. NetUserDel(NULL, lpszUserName);
  59. _END_:
  60. if(NULL != pPassword)
  61. {
  62. delete[] pPassword;
  63. pPassword = NULL;
  64. }
  65. if(NULL != pUserName)
  66. {
  67. delete[] pUserName;
  68. pUserName = NULL;
  69. }
  70. return bRet;
  71. }
  72. // 测试代码
  73. #include "stdafx.h"
  74. #include <Windows.h>
  75. #include <lm.h>
  76. #include <strsafe.h>
  77. #pragma comment(lib, "Netapi32.lib")
  78. int _tmain(int argc, _TCHAR* argv[])
  79. {
  80. ExecuteAsUser(L"ABC", L"Hello", L"F:\\11.exe", NULL);
  81. return 0;
  82. }
 
 
http://blog.csdn.net/visualeleven/article/details/7640475
这样需要创建新的账户,可用OpenProcessToken+CreateRestrictedToken削去当前进程的令牌的特权用于CreateProcessAsUser
 
 

一个简单的以User权限启动外部应用程序(用NetUserAdd函数和USER_INFO_1结构体动态添加用户,然后用CreateProcessWithLogonW启动程序)的更多相关文章

  1. 一个简单的URL访问权限校验

    前言 目前最流行的两大安全框架:SpringSecruity.Shiro 权限控制,无非就是:前端控件是否可见.是否允许请求/访问URL 本文分享一个简单的URL访问权限校验,支持/./*./**等情 ...

  2. Kafka认证权限配置(动态添加用户)

    之前写过一篇Kafka ACL使用实战,里面演示了如何配置SASL PLAINTEXT + ACL来为Kafka集群提供认证/权限安全保障,但有一个问题经常被问到:这种方案下是否支持动态增加/移除认证 ...

  3. 一个简单的以User权限启动外部应用程序

    BOOL ExecuteAsUser(LPCWSTR lpszUserName, LPCWSTR lpszPassword, LPCWSTR lpszApplication, LPCWSTR lpsz ...

  4. 从一个简单案例上手Spring MVC,同时分析Spring MVC面试问题

    很多公司都会用Spring MVC,而且初级程序员在面试时,一定会被问到这方面的问题,所以这里我们来通过一个简单的案例来分析Spring MVC,事实上,我们在培训中就用这个举例,很多零基础的程序员能 ...

  5. 【netty】(2)---搭建一个简单服务器

    netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...

  6. 写了一个简单的 Mybatis

    写了一个简单的 Mybatis,取名 SimpleMybatis . 具备增删改查的基本功能,后续还要添加剩下的基本数据类型和Java集合类型的处理. 脑图中有完整的源码和测试的地址 http://n ...

  7. 一个简单完整的promiseDemo

    想要完全理解代码,需要理解 this 和闭包的含义. Promise是什么 简单来说,Promise 主要就是为了解决异步回调的问题.用 Promise 来处理异步回调使得代码层次清晰,便于理解,且更 ...

  8. 一个简单的环境光shader

    关于shader的一个简短的历史 在DirectX8之前,GPU有一个固定的方法去变换顶点和像素,称为“固定管线”.这使得在将它们传递给GPU后,开发者不可能操作顶点和像素的变换. DirectX8介 ...

  9. 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (三)

    修改数据结构   基本的 API 已经定义好了,现在是个修改 Person 对象结构的好时机.只要修改 Person 结构体,数据库和 API 都会自动做出相应的修改.   我要做的是在 Person ...

随机推荐

  1. VC++编程之对话框贴图

    基于对话框的程序写好后,为对话框贴上个图片让界面更加美观(我承认做界面,MFC显得力不从心,不如QT). 其实很简单,我们以位图为例,选好我们需要的位图资源(bmp),假若自己的图片不是位图资源,可以 ...

  2. 【Binary Tree Level Order Traversal II 】cpp

    题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...

  3. mono for andorid 引用外部的dll问题

    这几天玩mono for android 心想,咱c#终于可以开发移动应用了,心里那个美啊------------ 先开发个什么呢,想起来前几天看到微博里一个用姓名笔画来算两个人关系的小测试,开发个这 ...

  4. Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) C - Bear and Colors

    题目链接: http://codeforces.com/contest/673/problem/C 题解: 枚举所有的区间,维护一下每种颜色出现的次数,记录一下出现最多且最小的就可以了. 暴力n*n. ...

  5. UML序列图总结

    转载请注明出处:htt://blog.csdn.net/tianhai110 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在 ...

  6. weiapi2.2 HelpPage自动生成接口说明文档和接口测试功能

    在开发Webapi项目时每写完一个方法时,是不是需要添加相应的功能说明和测试案例呢?为了更简单方便的写说明接口文档和接口测试HelpPage提供了一个方便的途径. 她的大致原理是:在编译时会生成.dl ...

  7. Spring boot教程

    1.首先是新建Maven工程 2.引入Pom依赖 3.新建一个Controller 4.运行Main方法 5.浏览器访问 pom.xml <project xmlns="http:// ...

  8. 快速、直接的XSS漏洞检测爬虫 – XSScrapy

    XSScrapy是一个快速.直接的XSS漏洞检测爬虫,你只需要一个URL,它便可以帮助你发现XSS跨站脚本漏洞. XSScrapy的XSS漏洞攻击测试向量将会覆盖 Http头中的Referer字段 U ...

  9. sublime text3 插件安装

    安装Package control 先打开安装代码的命令行 按 ctrl+~或者 view  -> show console 将下面的代码粘贴到输入框里 按回车 import urllib.re ...

  10. jQuery实现 浏览器后退到上次浏览位置

    近日看腾讯.新浪的移动端网站,发现一件非常蛋疼的事情,在列表浏览内容,我往下翻,往下翻,突然,看到一个十分霸气的标题,于是点到文章查看详细内容,若干时间后,点回退按钮,浏览器回退到页面的最顶部了. 于 ...