java win7 管理员权限_Win7下超级管理员创建普通权限任务

项目中用到一个功能,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值