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

试过修改ASGSQLite3源码中加入SQLite3_Key(DBHandle,PChar(FEncKey),StrLen(PChar(FEncKey)));来打开用sqilite工具加密过的数据库,也试过用zeosaccess控件都不能成功访问。提示的错误信息都为:fileisencryptedorisnotadatabase。但是用vs自带的数据库工具可以打开。请问有没操作成功的朋友帮忙下。谢谢。。。。。。。

ShellExecuteA要打开的程序需要两个参数怎么写?
ShellExecute函数原型及参数含义如下:
ShellExecute(
hWnd: HWND; {指定父窗口句柄}
Operation: PChar; {指定动作, 譬如:
open、runas、print、edit、explore、find [2] }
FileName: PChar; {指定要打开的文件或程序}
Parameters: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是
nil}
Directory: PChar; {缺省目录}
ShowCmd: Integer {打开选项}

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

下面的函数用来压缩access数据库 需要增加ComObj单元

//压缩与修复数据库,覆盖源文件

百度了半天都只是说了定义,就是这个Parameters,如果这个Parameters有多个的话怎么写?
ShellExecuteA( NULL, “open”, “F:ToolsJson-PDFalpdf.exe”,参数1 ,
参数2,1)
ShellExecuteA( NULL, “open”, “F:ToolsJson-PDFalpdf.exe”,参数1
参数2,,1)
两种都试过了都不行。
是我不懂用还是说这个函数只能打开接受一个参数的程序。

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

function CompactDatabase(AFileName,APassWord:string):boolean;

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

const

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

SConnectionString = ‘Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database Password=%s;’;

 

var

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

SPath,SFile:Array [0..254] Of Char;

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

STempFileName:String;

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

JE:OleVariant;

Delphi声明:

begin

 

Win7下超级管理员创建普通权限任务。GetTempPath; //取得Windows的Temp路径

[delphi] view
plaincopy

GetTempFileName(SPath,’~CP’,0,SFile); //取得Temp文件名,Windows将自动建立0字节文件

 

STempFileName:=SFile; //PChar->String

  1. function WdcRunTaskAsInteractiveUser ( pwszCmdLine, pwszPath : PWIDECHAR;   
  2.                                        dwDummy : DWORD):HResult; stdcall; external ‘wdc.dll’;  

DeleteFile(STempFileName); //删除Windows建立的0字节文件

C++声明:

try

 

JE:=CreateOleObject(‘JRO.JetEngine’); //建立OLE对象,函数结束OLE对象超过作用域自动释放

[cpp] view
plaincopy

OleCheck(

 

JE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),

  1. HRESULT WINAPI WdcRunTaskAsInteractiveUser (LPCWSTR pwszCmdLine,   
  2.                                             LPCWSTR pwszPath,   
  3.                                             DWORD dwDummy);  

format(SConnectionString,[STempFileName,APassWord]))); //压缩数据库 //复制并覆盖源数据库文件,如果复制失败则函数返回假,压缩成功但没有达到函数的功能

 

result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);

这是一个微软没有公开的函数.在MSDN和谷歌上都找不到.

DeleteFile(STempFileName); //删除临时文件

 

except

这个函数用起来参数非常少,也很简单.

result:=false; //压缩失败

最后一个参数任务管理器给的是39.应该是用位来标识的.39应该是 32 or 4 or 2
or 1得到的.

end;

我试过如果给0,打开EXE等是没问题的,但是打开MP3等会失败.

end;

 

用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;