我需要在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中以用户身份运行)但看起来像系统保留的内容...请帮忙解决
答案 0 :(得分:2)
使用CreateProcessAsUser()
时,您应该使用CreateEnvironmentBlock()
检索用户的环境:
检索指定用户的环境变量。然后可以将此块传递给
CreateProcessAsUser
函数。
将该值传递给lpEnvironment
的{{1}}参数。否则,新进程将继承调用进程的环境。
例如:
CreateProcessAsUser()