已转至新的博客 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

最新文章

  1. 移动端click事件延迟300ms的原因以及解决办法
  2. 将C1Chart数据导出到Excel
  3. web设计经验&lt;一&gt; 提升移动设备响应式设计的8个建议
  4. SSH2 架构常用注解
  5. OnClose()和 OnDestroy()
  6. 一步一步写算法(之 A*算法)
  7. A. Liserious战队
  8. listview——显示窗体
  9. EntityFramework6.X之概述
  10. 前端经典面试题之CSS实现三栏布局,左右宽度固定,中间宽度自适应
  11. Python 爬虫 解析库的使用 --- XPath
  12. hdu2461 Rectangles 线段树--扫描线
  13. C++ 项目中直接使用JsonCpp源码文件
  14. virtual的使用方法
  15. 【mysql】新方法修改数据库密码以及解决--ERROR 1045 (28000)的问题
  16. mac 安装python3
  17. Xamarin.Forms学习之Page Navigation(二)
  18. codevs1796 社交网络
  19. 【阿圆实验】Alertmanager HA 高可用配置
  20. Diycode开源项目 SitesListFragment分析

热门文章

  1. cocos2dx新建工程分析
  2. 底层由于接收到操作系统的信号而停止(the inferior stopped because it triggered an exception)
  3. Programming C#.Inheritance and Polymorphism
  4. C++中指针和引用的选择
  5. Highcharts使用手册
  6. objective -c こだわり
  7. zend framework virtualhost设置方法
  8. Oracle单个数据文件超过32G后扩容
  9. 如何使Label带有链接??此法感觉有点取巧!!!
  10. 坑爹JDK8,可怜的XP