BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
{
if(!lpName)
{
return FALSE;
}
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);pe32.dwSize = sizeof(PROCESSENTRY32);if (Process32First(hProcessSnap, &pe32))
{
do
{
if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
FALSE,pe32.th32ProcessID);
bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);
CloseHandle (hProcessSnap);
return (bRet);
}
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE;CloseHandle (hProcessSnap);
return (bRet);
}软件开发网BOOL RunProcess(LPCSTR lpImage)
{
if(!lpImage)
{
return FALSE;
}
HANDLE hToken;
if(!GetTokenByName(hToken,"EXPLORER.EXE"))
{
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb= sizeof(STARTUPINFO);
si.lpDesktop = TEXT("winsta0\\default");BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL,
FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
CloseHandle(hToken);
if(bResult)
{
OutputDebugString("CreateProcessAsUser ok!\r\n");
}
else
{
OutputDebugString("CreateProcessAsUser false!\r\n");
}
return bResult;

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,TLhelp32;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
       Function GetProcessIdFromName(_GetPID:String):String;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
     var
        hUserTokenDup:THandle ;
        pi:PROCESS_INFORMATION;
        si:STARTUPINFO ;
         PID:DWORD;
      begin
      PID:=DWORD(GetProcessIdFromName('explorer.exe'));
    OpenProcessToken(OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,FALSE,PID),TOKEN_EXECUTE,hUserTokenDup);
            ZeroMemory(@si, sizeof(STARTUPINFO));
            si.cb:= sizeof(STARTUPINFO);
            si.lpDesktop:=PChar('winsta0\\default');
            si.wShowWindow := SW_SHOWNORMAL;
           // ZeroMemory(@pi, sizeof(pi));
            CreateProcessAsUser(hUserTokenDup,'c:\q.exe', nil,nil,nil,FALSE, CREATE_NEW_CONSOLE   or
                      NORMAL_PRIORITY_CLASS,nil, nil, si, pi);end;Function TForm1.GetProcessIdFromName(_GetPID:String):String;
    var
         h:thandle;
         f:boolean;
         lppe:tprocessentry32;
    begin
         h := CreateToolhelp32Snapshot(TH32cs_SnapProcess, 0);
         lppe.dwSize := sizeof(lppe);
         f := Process32First(h, lppe);     //lppe.szExeFile是进程的名字,自己挑选你要的
         while integer(f) <> 0 do
         begin
           if lppe.szExeFile = _GetPID then
           begin
             Result:=(inttostr(lppe.th32ProcessID));
             break;
           end;
           f := Process32Next(h,lppe);
         end;
    end;
    end.
    改好了,可以运行。但是q.exe还是打不开,不知道为什么
      

  2.   

    来自MSDN ,对于Windows XP Professional,如果一台计算机加入到一个工作组中,而且"Force network logons using local accounts to authenticate as Guest"的限制被激活的话,此函数会失败。 另外,如果在调用的时候使用了TOKEN_ALL_ACCESS请求,函数也可能会失败。这是因为TOKEN_ALL_ACCESS可能包含了TOKEN_ADJUST_SESSIONID(在Winnt.h中被定义)。TOKEN_ADJUST_SESSIONID是一个新的访问mask,是在Windows 2000和Windows XP中新增的。在Windows NT 4.0中,访问令牌的访问控制列表中是没有这个值的。所以,如果一个应用程序是使用新的Platform SDK中的Winnt.h但却在Windows NT 4.0下运行的话,在调用OpenProcessToken()或者OpenThreadToken时指定了TOKEN_ALL_ACCESS的话,函数也会失败(使用GetLastError()返回的是ERROR_ACCESS_DENIED)。 
      

  3.   

    谢谢你,我已经解决了是进程PID问题。。