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;
http://blog.csdn.net/wr960204/article/details/6600581
Win7下超级管理员创建普通权限任务的更多相关文章
- win7开启超级管理员账户(Administrator)
win7开启超级管理员账户(Administrator) 不同于XP系统,Windows7系统据说出于安全的考虑,将超级管理员帐户"Administrator"在登陆界面给隐藏了, ...
- Win7 下以管理员身份运行批处理文件,切换JDK版本
Win7下 切换JDK的批处理命令 1. 批处理文件(必须以管理员身份执行)内容如下 @echo off rem --- Base Config 配置JDK的安装目录 --- :init set JA ...
- Django在Win7下安装与创建项目hello word示例
Django在Win7下的安装及创建项目hello word的例子 有关python 的django 框架安装与开发的小例子.Django在Win7下的安装及创建项目hello word.1.安装:命 ...
- VS2005 工程在win7下使用管理员权限运行
想关资料 http://stackoverflow.com/questions/13030492/set-administrator-privilege-for-my-c-application-in ...
- vs2005 ,2008,2010中引入app.manifest(即c#程序在win7下以管理员权限运行方法)
打开VS2005.VS2008.VS2010工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件:如没有,按如下方式创建:鼠标右击工程在菜单中选择“属性”,点击工 ...
- csharp:引入app.manifest,程序在win7下以管理员权限运行配置方法
https://msdn.microsoft.com/en-us/library/windows/desktop/hh848036(v=vs.85).aspx https://msdn.microso ...
- Win7下运行VC程序UAC权限问题 VC2010设置UAC权限方法
https://msdn.microsoft.com/en-us/library/bb756929.aspx 我使用的是VS2010,设为连接器清单文件的uac执行级别 直接项目右键---属性---配 ...
- VS2005 VS2008编译的程序在Win7下以管理员身份运行的设置
在VS2005或者VS2008 里面,直接项目右键---属性---连接器---清单文件---uac执行级别 选择requireAdministrator 重新编译 这样你的程序直接运行就拥有管理 ...
- WIN7下用笔记本创建无线网
系统要求:WIN7 硬件要求:拥有无线网卡 网络要求:已经连接internet 1.启用并设定虚拟Wifi网卡:运行以下命令启用虚拟无线网卡(相当于打开路由器): netsh wlan set h ...
随机推荐
- C++自定义命名空间
关于C++自定义命名空间,今天验证了一下命名空间如何使用,和嵌套命名空间以及出现的bug. 如何自定义命名空间,实例如下: insertion_sort.h和insertion_sort.cpp #p ...
- OpenCV学习(1)OpenCV简介
简介 OpenCV的全称是:Open Source Computer Vision Library,OpenCV是一个开源的跨平台的计算机视觉库,可以运行在Linux.Windows和Mac OS操作 ...
- leetcode Linked List Cycle II python
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = ...
- 【grunt整合版】学会使用grunt打包前端代码
grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...
- codeforces 10 D. LCIS LCIS O(n^2)算法
题目链接 给出两个序列, 求出他们的最长公共上升子序列. 两层循环, 内层循环j, 外层i. 如果a[i] == b[j], 那么dp[j] = max(dp[j], dp[best]+1), bes ...
- php命名空间使用
对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...
- SSH Session Recorder
If you want to record your root ssh session create a file .bash_profile . and copy below line by l ...
- DbConnectionFactory 数据库连接
/** * */package com.sprucetec.dbatch.tmsfee;import java.io.Serializable;import java.sql.Connection;i ...
- aliyun 启用ECS iptables
iptables -t nat -A POSTROUTING -s 0.0.0.0/24 -o eth0 -j MASQUERADEservice iptables saveecho 1 > / ...
- extend vg(pv,lv)use HotPlug Storage PV for VMI(ECC Env)
Preface: 前期存储未规划好,业务快速扩展,数据高安全需求(异地,More one copy),需求多多?NM干着干着活就会时不时的坑爹起来了!particularly Real Product ...