已转至新的博客 http://www.raysoftware点击打开链接.cn/?p=49

项目中用到一个功能,Win7下超级管理员创建普通权限任务.

试了几种办法,例如获取资源管理器的Token,然后以这个Token用CreateProcessWithTokenW创建任务。这样做是可以的.

但是如果当前没有资源管理器或者其他普通权限的任务怎么办?CreateToken自己构造一个Token也可以,但是那些参数看了就头大.

试了一下以超级用户方式启动任务管理器用菜单中的运行,居然是默认创建普通权限任务,有一个复选项是以超级用户权限启动任务.

用WINDBG跟踪了一下.发现任务管理器调用的是WdcRunTaskAsInteractiveUser这个函数.函数位域wdc.dll中.

函数的形式分析出来如下:

Delphi声明:

  1. function WdcRunTaskAsInteractiveUser ( pwszCmdLine, pwszPath : PWIDECHAR;
  2. dwDummy : DWORD):HResult; stdcall; external 'wdc.dll';

C++声明:

  1. HRESULT WINAPI WdcRunTaskAsInteractiveUser (LPCWSTR pwszCmdLine,
  2. LPCWSTR pwszPath,
  3. DWORD dwDummy);

这是一个微软没有公开的函数.在MSDN和谷歌上都找不到.

这个函数用起来参数非常少,也很简单.

最后一个参数任务管理器给的是39.应该是用位来标识的.39应该是 32 or 4 or 2 or 1得到的.

我试过如果给0,打开EXE等是没问题的,但是打开MP3等会失败.

用IDA反编译WdcRunTaskAsInteractiveUser发现他的实现方式是创建一个低权限的计划任务,然后调用计划任务的Run方法,

另外还有一个小插曲.我认为Vista和Windows7差不多,就判断Windows版本>=6就用WdcRunTaskAsInteractiveUser,否则调用ShellExecuteExE.

结果发现Vista上不行,Vista上没有这个函数,甚至没有wdc.dll.Vista的进程管理器也不能在超级用户权限下创建普通进程,它仅仅是简单的调用了ShellExecuteEx.

当然Vista下我们可以自己用计划任务来创建普通权限进程任务,然后Run之.也就是自己实现一遍WdcRunTaskAsInteractiveUser.

我比较懒,项目中只要GetProcAddress找不到WdcRunTaskAsInteractiveUser ,我就用ShellExecuteEx了.

下面给出我在项目中封装的一个执行代码.

  1. function RunTaskAsInteractiveUser(cmdLine, Param, dir: String): Boolean;
  2. const
  3. wdc = 'wdc.dll';
  4. type
  5. TWdcRunTaskAsInteractiveUser = function(pwszCmdLine, pwszPath: PWideChar;
  6. dwDummy: DWORD): HResult; stdcall;
  7. var
  8. WdcRunTaskAsInteractiveUser: TWdcRunTaskAsInteractiveUser;
  9. fullname: string;
  10. sei: SHELLEXECUTEINFO;
  11. e: Integer;
  12. hwdc: Cardinal;
  13. begin
  14. Result := False;
  15. SetLength(fullname, Length(cmdLine));
  16. CopyMemory(PChar(fullname), PChar(cmdLine), ByteLength(cmdLine));
  17. //如果Windows版本>=6
  18. if Win32MajorVersion >= 6 then
  19. begin
  20. hwdc := GetModuleHandle(wdc);
  21. if hwdc = 0 then
  22. hwdc := LoadLibrary(wdc);
  23. @WdcRunTaskAsInteractiveUser := GetProcAddress(hwdc,    'WdcRunTaskAsInteractiveUser');
  24. //如果能找到WdcRunTaskAsInteractiveUser那么就应该是Windows7
  25. if Assigned(WdcRunTaskAsInteractiveUser) then
  26. begin
  27. if Length(Param) > 0 then
  28. fullname := format('"%s" %s', [fullname, Param]);
  29. // fullname + '  ' + Param;
  30. // 最后一个参数39是逆向出来的.不知道含义.TaskMgr给的就是固定的39
  31. // 如果给0的话,EXE等是可以启动的,但是文件夹,MP3等启动不了
  32. e := WdcRunTaskAsInteractiveUser(PChar(fullname), PChar(dir), 39);
  33. Result := e = S_OK;
  34. end;
  35. end;
  36. //如果没执行成功,通常就是没有WdcRunTaskAsInteractiveUser,可能系统是Vista或者XP
  37. if not Result then
  38. begin
  39. //
  40. ZeroMemory(@sei, sizeof(sei));
  41. sei.cbSize := sizeof(SHELLEXECUTEINFO);
  42. sei.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI;
  43. sei.lpFile := PChar(fullname);
  44. sei.lpVerb := 'Open';//如果这里给'runas'可以以超级用户权限启动
  45. sei.nShow := SW_SHOW;
  46. if Length(Param) > 0 then
  47. sei.lpParameters := PChar(Param)
  48. else
  49. sei.lpParameters := nil;
  50. sei.lpDirectory := PChar(dir);
  51. ShellExecuteEx(@sei);
  52. if sei.hProcess <> 0 then
  53. CloseHandle(sei.hProcess);
  54. end;
  55. end;

http://blog.csdn.net/wr960204/article/details/6600581

Win7下超级管理员创建普通权限任务的更多相关文章

  1. win7开启超级管理员账户(Administrator)

    win7开启超级管理员账户(Administrator) 不同于XP系统,Windows7系统据说出于安全的考虑,将超级管理员帐户"Administrator"在登陆界面给隐藏了, ...

  2. Win7 下以管理员身份运行批处理文件,切换JDK版本

    Win7下 切换JDK的批处理命令 1. 批处理文件(必须以管理员身份执行)内容如下 @echo off rem --- Base Config 配置JDK的安装目录 --- :init set JA ...

  3. Django在Win7下安装与创建项目hello word示例

    Django在Win7下的安装及创建项目hello word的例子 有关python 的django 框架安装与开发的小例子.Django在Win7下的安装及创建项目hello word.1.安装:命 ...

  4. VS2005 工程在win7下使用管理员权限运行

    想关资料 http://stackoverflow.com/questions/13030492/set-administrator-privilege-for-my-c-application-in ...

  5. vs2005 ,2008,2010中引入app.manifest(即c#程序在win7下以管理员权限运行方法)

    打开VS2005.VS2008.VS2010工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件:如没有,按如下方式创建:鼠标右击工程在菜单中选择“属性”,点击工 ...

  6. csharp:引入app.manifest,程序在win7下以管理员权限运行配置方法

    https://msdn.microsoft.com/en-us/library/windows/desktop/hh848036(v=vs.85).aspx https://msdn.microso ...

  7. Win7下运行VC程序UAC权限问题 VC2010设置UAC权限方法

    https://msdn.microsoft.com/en-us/library/bb756929.aspx 我使用的是VS2010,设为连接器清单文件的uac执行级别 直接项目右键---属性---配 ...

  8. VS2005 VS2008编译的程序在Win7下以管理员身份运行的设置

    在VS2005或者VS2008 里面,直接项目右键---属性---连接器---清单文件---uac执行级别   选择requireAdministrator  重新编译 这样你的程序直接运行就拥有管理 ...

  9. WIN7下用笔记本创建无线网

    系统要求:WIN7  硬件要求:拥有无线网卡  网络要求:已经连接internet 1.启用并设定虚拟Wifi网卡:运行以下命令启用虚拟无线网卡(相当于打开路由器): netsh wlan set h ...

随机推荐

  1. js call方法介绍

    call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, [,.argN ...

  2. TCP/IP详解之:Ping程序、Traceroute程序

    Ping程序: ping程序是通过发送一份ICMP回显请求报文(即ICMP报文的一种,其类型为8,代码为0)给主机,并等待返回ICMP回显应答 来测试另一台主机是否可达. ping程序不用经过传输层, ...

  3. linux系统find命令使用

    find命令简介 1.find的作用 find是个使用频率比较高的命令.常常用它在系统特定目录下,查找具有某种特征的文件. 2.    find命令的格式 find  [-path……]-option ...

  4. php正则的使用[替换,匹配]

    // 隐藏电话的中间四位 echo parseMobile('15836365252'); function parseMobile($mobile, $start = 4, $len = 4){ $ ...

  5. 在IE6/7下表格td标签没有内容时不显示边框?

    有以下几种方法: 1.在单元格中加入一个空格.这样: <td> </td> 2.直接在table里这样写:<table border="0" cell ...

  6. how to install git 1.8 rpm

    git版本在低于1.8之前,对于私有项目会出现401的pull失败错误,只能通过升级git版本来解决 It appears that git18 is no longer available from ...

  7. JavaWeb基础之tomcat部署

    有些东西,看起来简单,做起来也简单,简单的你并不一定知道! 问题:如何将一个java project转变为 web project,并使其自动部署到tomcat? 1.先建立一个Java Projec ...

  8. silverlight imagesource赋值与转换

    介绍几种常用的Image source 赋值方式: this.abc.Source = new BitmapImage(new Uri("/1.jpg", UriKind.Rela ...

  9. ListView的简单使用和性能优化

    起源:ListView是Android开发中使用最广泛的一种控件,它以垂直列表的形式显示所有列表项. 创建ListView有两种方式: ☆ 直接使用ListView进行创建. ☆让Activity继承 ...

  10. java.sql.ResultSetMetaData.getColumnLabel和getColumnName的区别

    如果将ResultSet的结果映射到HashMap中,要使用getColumnLabel,而不要用getColumnName,这样可提高程序的健壮性 理由: getColumnName返回的是sql语 ...