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...