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


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

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

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


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

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

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

    Delphi声明:

    [delphi] view plaincopy
    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了.


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

    [delphi] view plaincopy
    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.   
    25.     //如果能找到WdcRunTaskAsInteractiveUser那么就应该是Windows7  
    26.     if Assigned(WdcRunTaskAsInteractiveUser) then  
    27.     begin  
    28.       if Length(Param) > 0 then  
    29.         fullname := format('"%s" %s', [fullname, Param]);  
    30.       // fullname + '  ' + Param;  
    31.       // 最后一个参数39是逆向出来的.不知道含义.TaskMgr给的就是固定的39  
    32.       // 如果给0的话,EXE等是可以启动的,但是文件夹,MP3等启动不了  
    33.       e := WdcRunTaskAsInteractiveUser(PChar(fullname), PChar(dir), 39);  
    34.       Result := e = S_OK;  
    35.     end;  
    36.   end;  
    37.   //如果没执行成功,通常就是没有WdcRunTaskAsInteractiveUser,可能系统是Vista或者XP  
    38.   if not Result then  
    39.   begin  
    40.     //  
    41.     ZeroMemory(@sei, sizeof(sei));  
    42.     sei.cbSize := sizeof(SHELLEXECUTEINFO);  
    43.     sei.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI;  
    44.     sei.lpFile := PChar(fullname);  
    45.     sei.lpVerb := 'Open';//如果这里给'runas'可以以超级用户权限启动  
    46.     sei.nShow := SW_SHOW;  
    47.     if Length(Param) > 0 then  
    48.       sei.lpParameters := PChar(Param)  
    49.     else  
    50.       sei.lpParameters := nil;  
    51.     sei.lpDirectory := PChar(dir);  
    52.     ShellExecuteEx(@sei);  
    53.     if sei.hProcess <> 0 then  
    54.       CloseHandle(sei.hProcess);  
    55.   
    56.   end;  
    57. end;  
  • 相关阅读:
    Java之内存分析和String对象
    Android之MVC模式
    Java之排序总结
    Android之单元测试学习
    Silverlight 拖拽功能
    Silverlight 调用WebServices
    Silverlight IIS 7.5 部署SilverLight4网站以及问题解决
    Silverlight 控件和对话框 源自MSDN 参考
    Silverlight 动画示例
    Sliverlight 动画详细介绍
  • 原文地址:https://www.cnblogs.com/ljl_falcon/p/2420975.html
Copyright © 2020-2023  润新知