Win7下超级管理员创建普通权限任务
2011-07-12 16:51
363 查看
已转至新的博客 http://www.raysoftware点击打开链接.cn/?p=49
项目中用到一个功能,Win7下超级管理员创建普通权限任务.
试了几种办法,例如获取资源管理器的Token,然后以这个Token用CreateProcessWithTokenW创建任务。这样做是可以的.
但是如果当前没有资源管理器或者其他普通权限的任务怎么办?CreateToken自己构造一个Token也可以,但是那些参数看了就头大.
试了一下以超级用户方式启动任务管理器用菜单中的运行,居然是默认创建普通权限任务,有一个复选项是以超级用户权限启动任务.
用WINDBG跟踪了一下.发现任务管理器调用的是WdcRunTaskAsInteractiveUser这个函数.函数位域wdc.dll中.
函数的形式分析出来如下:
Delphi声明:
C++声明:
这是一个微软没有公开的函数.在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了.
下面给出我在项目中封装的一个执行代码.
项目中用到一个功能,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;
相关文章推荐
- Win7下超级管理员创建普通权限任务
- Win7下超级管理员创建普通权限任务
- 如何使普通用户创建的文件具有超级用户的权限呢
- 普通用户如何获取超级管理员权限的步骤
- .net 创建计划任务开机后自动以管理员身份启动运行 win7 ~ win10
- 利用注册表使普通用户夺取超级管理员权限!!
- 创建一个非超级管理员用户,并增加 sudo 权限
- win7管理员权限怎么设置如何将账户修改为最高超级管理员权限
- 赋予普通用户某个命令的超级管理员权限
- 普通用户如何获取超级管理员权限的步骤
- Oracle用超级管理员 创建用户并设置权限
- 数据库服务器的任务创建与管理员权限
- mongoDB权限设置之创建管理员和普通用户
- Windows 8提升普通管理员权限为超级管理员权限以及激活超级管理员Administrator
- win7win8一键获取管理员权限(超级管理员权限)
- centos赋予普通用户超级管理员权限
- win7win8一键取得超级管理员权限
- Linux创建普通账号并授予sudo权限
- 15.VC(custom)- 在Vista Win7 下提高管理员权限问题
- android 获取超级管理员权限,进行锁屏、恢复出厂设置