Einzelnen Beitrag anzeigen

CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#12

Re: Programm von Dienst starten lassen (Jetzt aber wirklich

  Alt 22. Mai 2008, 05:20
Zitat von Dezipaitor:
Du willst also das Token vom Benutzer kopiere und nur Adminrechte einfügen? Nunja. Das müsste gehen.
Klingt gut. Die Frage ist nur: Wie?


Zitat von Dezipaitor:
Das geht auch mit dem normalen Benutzertoken. Dazu brauchst du nur die SessionID und WTSQueryUserToken
Und wie komme ich an die SessionID?

Prinzipiell würde ich das ja so machen:
Delphi-Quellcode:
function GetEnvironment(): LPVOID;
var
  LToken: THandle;
  LDupToken: THandle;
  LSessionID: DWORD;
begin
  Result := nil;

  LSessionID := WTSGetActiveConsoleSessionId; //<- da muss wohl was anderes hin...
  WTSQueryUserToken(LSessionID, @LToken);
  DuplicateTokenEx(LToken, TOKEN_ASSIGN_PRIMARY or TOKEN_ALL_ACCESS, nil, SecurityIdentification, TokenPrimary, LDupToken);

  if (not CreateEnvironmentBlock(Result, LDupToken, True)) then
    Result := nil;
end;



function RunProcess(FileName: string): Longword;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartupInfo.wShowWindow := SW_SHOW;
  if not CreateProcess(nil,
    @Filename[1],
    nil,
    nil,
    False,
    NORMAL_PRIORITY_CLASS or CREATE_NEW_PROCESS_GROUP, //<- stimmen die Flags so?
    GetEnvironment, //<- hier die Umgebung des normalen Benutzers übergeben
    nil,
    StartupInfo,
    ProcessInfo)
    then
      Result := WAIT_FAILED;
end;
Aber WTSGetActiveConsoleSessionId liefert mir ja nur die SessionID von SYSTEM, bringt also nichts. Wie muss der Code statt dessen lauten, damit ich die Umgebung dann bei CreateProcess mit übergeben kann?


Huch, doch schon so spät. Du siehst, mir lässt das keine Ruhe. Ich gehe jetzt erstmal schlafen...
  Mit Zitat antworten Zitat