CreateProcessAsUser verlangt als ersten Parameter einen Token. Den kann man mit LogonUser bekommen. Nur leider schlägt LogonUser bei mir immer fehl:
Delphi-Quellcode:
function RunAs(const User, PW, App, Params: string): DWORD;
var
bReturn: Boolean;
dwReturn: DWORD;
hLogon: THandle;
si: TStartupInfo;
pi: TProcessInformation;
begin
SetLastError(0);
if EnablePrivilege('SeTcbPrivilege') = 0 then
begin
bReturn := LogonUser(PChar(User), nil, PChar(PW), LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_WINNT50, hLogon);
if bReturn then
begin
ZeroMemory(@si, sizeof(si));
si.cb := sizeof(si);
ZeroMemory(@pi, sizeof(pi));
if CreateProcessAsUser(hLogon, PChar(App), PChar(Params), nil, nil, False,
CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pi) then
dwReturn := 0
else
dwReturn := GetLastError;
CloseHandle(hLogon);
ZeroMemory(@PW[1], length(PW));
end
else
dwReturn := GetLastError;
end
else
dwReturn := GetLastError;
result := dwReturn;
end;
Wie Motzi hier im Forum schon gesagt hat, braucht man dazu das Privileg 'SeTcbPrivilege'. Das bekomme ich auch. Aber LogonUser schlägt trotzdem fehl.
Zu Testezwecken wollte ich einfach eine Konsole als Admin öffen (bin selber nur Benutzer). Als fehlermeldung bekomme ich immer:
Zitat:
---------------------------
Project1
---------------------------
Der Client besitzt ein erforderliches Recht nicht
---------------------------
OK
---------------------------