Einzelnen Beitrag anzeigen

pate444

Registriert seit: 24. Jul 2011
16 Beiträge
 
#7

AW: Service Application - CreateProcess...

  Alt 9. Nov 2011, 07:54
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... :/

Geändert von pate444 ( 9. Nov 2011 um 10:37 Uhr)
  Mit Zitat antworten Zitat