delphi:作为用户和SYSTEM帐户环境变量运行进程

时间:2017-01-20 18:34:12

标签: delphi winapi

我需要在SYSTEM下运行的另一个进程在当前用户下运行一个进程(系统进程以当前用户身份运行另一个进程)。

我可以使用此代码运行它,但环境变量存在问题...例如在新的用户模式'进程,我看到APPDATA值是C:\ Windows \ System32 \ config \ systemprofile \ AppData \ Roaming而不是C:\ Users \ username \ AppData \ Roaming

function RunProcessAsCurrentUser(FileName: string): Boolean;
var
  ProcessId: Integer;
  hWindow, hProcess, TokenHandle: THandle;
  si: Tstartupinfo;
  p: Tprocessinformation;
begin
    Result := False;
    hWindow := FindWindow('Progman', 'Program Manager');
    GetWindowThreadProcessID(hWindow, @ProcessID);
    hProcess := OpenProcess (PROCESS_ALL_ACCESS, FALSE, ProcessID);
    if OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, TokenHandle) then
    begin

      FillChar(si,SizeOf(si),0);
      with Si do begin
        cb := SizeOf( Si);
        dwFlags := startf_UseShowWindow;
        wShowWindow := SW_NORMAL;
        lpDesktop := PChar('winsta0\default');
      end;

      Result :=  CreateProcessAsUser(TokenHandle, nil,
        PChar('"'+FileName+'"'),
        nil, nil, false, Create_default_error_mode, nil, nil, si, p);
    end;
end;

问题在win7,8,10中是实际的

我认为所有进程设置都是从​​explorer.exe复制的(并且新进程在TaskManager中以用户身份运行)但看起来像系统保留的内容...请帮忙解决

1 个答案:

答案 0 :(得分:2)

使用CreateProcessAsUser()时,您应该使用CreateEnvironmentBlock()检索用户的环境:

  

检索指定用户的环境变量。然后可以将此块传递给CreateProcessAsUser函数。

将该值传递给lpEnvironment的{​​{1}}参数。否则,新进程将继承调用进程的环境。

例如:

CreateProcessAsUser()