Hallo zusammen,
ich habe mich die Tage mit dem Lösungsansatz befasst und dieser Quellcode ist dabei herausgekommen.
Jedoch habe ich ein kleines Problem mit einigen Zeilen (rot makiert). Meine Recherchen im Netz haben bisher noch keine positiven Ergebnisse gezeigt.
Code:
interface
uses
Windows;
function CreateProcessAsUserA(Index: String; Counter: Integer
): Cardinal;
function ProcessIdToSessionId (ProcessId : DWORD; var SessionId : DWORD) : BOOL;
stdcall; external kernel32 name 'ProcessIdToSessionId';
implementation
function CreateProcessAsUserA(Index: String; Counter: Integer
): Cardinal;
var
sui : TStartUpInfo;
Pi : TProcessInformation;
hNewToken: THandle;
hProcessToken: THandle;
dwSessionId: dword;
Prozess: Boolean;
processID: dword;
reLength: dword;
var
WTSGetActiveConsoleSessionId: function: DWord; stdcall;
begin
processID:= GetCurrentProcessID;
if ProcessIdToSessionId(processID,dwSessionID) then
if dwSessionID <> $FFFFFFFF then
begin
hProcessToken := 0;
OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY,
hProcessToken);
DuplicateTokenEx(hProcessToken,
MAXIMUM_ALLOWED,
Nil,
SecurityImpersonation,
TokenPrimary,
hNewToken);
GetTokeninformation(hNewToken,
TokenSessionID,
@dwSessionID,
sizeof(@dwSessionid),
reLength);
SetTokenInformation(hNewToken,
TokenSessionId,
@dwSessionId,
sizeof(dwSessionID));
//CreateProcessAsUser
Prozess:= CreateProcessAsUser(hNewToken,
nil,
PwideChar(index),
nil,
nil,
false,
Create_New_Console or NORMAL_PRIORITY_CLASS,
nil,
nil,
sui,
pi);
//Allocate process to CPU
SetProcessAffinityMask(pi.hProcess, Counter+1);
Result:= pi.dwProcessId;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end;
end;
end.
Die Funktion bricht bei SetTokenInformation ab. Daher vermute ich, dass es was mit der dwSessionID zusammenhängt.
Edit: Die Funktion läuft jetzt durch, jedoch ohne einen Prozess zu starten. dwSessionID wird immer der Wert 0 zugewiesen...
Kleine Verbesserung vorgenommen, jetzt bekommt dwSessionID seinen Wert, nur leider immer noch kein gestarter Prozess... :/