Win7下超级管理员创建普通权限任务

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

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

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

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


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

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

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

Delphi声明:

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

C++声明:

HRESULT WINAPI WdcRunTaskAsInteractiveUser (LPCWSTR pwszCmdLine, 
                                            LPCWSTR pwszPath, 
                                            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了.


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

function RunTaskAsInteractiveUser(cmdLine, Param, dir: String): Boolean;
const
  wdc = 'wdc.dll';
type
  TWdcRunTaskAsInteractiveUser = function(pwszCmdLine, pwszPath: PWideChar;
    dwDummy: DWORD): HResult; stdcall;
var
  WdcRunTaskAsInteractiveUser: TWdcRunTaskAsInteractiveUser;
  fullname: string;
  sei: SHELLEXECUTEINFO;
  e: Integer;
  hwdc: Cardinal;
begin
  Result := False;
  SetLength(fullname, Length(cmdLine));
  CopyMemory(PChar(fullname), PChar(cmdLine), ByteLength(cmdLine));
  //如果Windows版本>=6
  if Win32MajorVersion >= 6 then
  begin
    hwdc := GetModuleHandle(wdc);
    if hwdc = 0 then
      hwdc := LoadLibrary(wdc);
    @WdcRunTaskAsInteractiveUser := GetProcAddress(hwdc,    'WdcRunTaskAsInteractiveUser');

    //如果能找到WdcRunTaskAsInteractiveUser那么就应该是Windows7
    if Assigned(WdcRunTaskAsInteractiveUser) then
    begin
      if Length(Param) > 0 then
        fullname := format('"%s" %s', [fullname, Param]);
      // fullname + '  ' + Param;
      // 最后一个参数39是逆向出来的.不知道含义.TaskMgr给的就是固定的39
      // 如果给0的话,EXE等是可以启动的,但是文件夹,MP3等启动不了
      e := WdcRunTaskAsInteractiveUser(PChar(fullname), PChar(dir), 39);
      Result := e = S_OK;
    end;
  end;
  //如果没执行成功,通常就是没有WdcRunTaskAsInteractiveUser,可能系统是Vista或者XP
  if not Result then
  begin
    //
    ZeroMemory(@sei, sizeof(sei));
    sei.cbSize := sizeof(SHELLEXECUTEINFO);
    sei.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI;
    sei.lpFile := PChar(fullname);
    sei.lpVerb := 'Open';//如果这里给'runas'可以以超级用户权限启动
    sei.nShow := SW_SHOW;
    if Length(Param) > 0 then
      sei.lpParameters := PChar(Param)
    else
      sei.lpParameters := nil;
    sei.lpDirectory := PChar(dir);
    ShellExecuteEx(@sei);
    if sei.hProcess <> 0 then
      CloseHandle(sei.hProcess);

  end;
end;







已标记关键词 清除标记
相关推荐
<p> <b><span style="background-color:#FFE500;">【超实用课程内容】</span></b> </p> <p> <br /> </p> <p> <br /> </p> <p> 本课程内容包含讲解<span>解读Nginx的基础知识,</span><span>解读Nginx的核心知识、带领学员进行</span>高并发环境的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 </p> <p> <br /> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><br /> </b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><span style="background-color:#FFE500;">【课程如何观看?】</span></b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> PC端:<a href="https://edu.csdn.net/course/detail/26277"><span id="__kindeditor_bookmark_start_21__"></span></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 移动端:CSDN 学院APP(注意不是CSDN APP哦) </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 本课程为录播课,课程永久有效观看时长,大家可以抓紧时间学习后一起讨论哦~ </p> <p style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <strong><span style="background-color:#FFE500;">【学员专享增值服务】</span></strong> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b>源码开放</b> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化 </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 载方式:电脑登录<a href="https://edu.csdn.net/course/detail/26277"></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a>,播放页面右侧点击课件进行资料打包载 </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页