Registriert seit: 24. Jul 2004
Ort: Freiberg
69 Beiträge
Delphi 11 Alexandria
|
Re: Vista: Ein Programm mit Benutzerrechten starten
12. Mai 2007, 21:30
Folgendes habe ich mal verwendet um von einen Programm ,welches mit Systemrechten läuft, eine Anwendung
zustarten als aktueller User.
Keine Ahnung ob es unter Vista geht (nur unter XP getestet) und ob es in deinem Fall brauchbar ist.
Delphi-Quellcode:
program csfax;
uses
Windows, SysUtils, Dialogs,
tlhelp32,registry;
{$R *.res}
var
Reg: TRegistry;
fax: string;
prog: string;
hToken, pToken: Cardinal;
bResult: Boolean;
pi: TProcessInformation;
si: TStartupInfo;
proctoken, Procid: Cardinal;
function GetProcessID(Exename: string): DWORD;
var
hProcSnap: THandle;
pe32: TProcessEntry32;
begin
result := 0;
hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
if hProcSnap <> INVALID_HANDLE_VALUE then
begin
pe32.dwSize := SizeOf(ProcessEntry32);
if Process32First(hProcSnap, pe32) = true then
begin
while Process32Next(hProcSnap, pe32) = true do
begin
if pos(UpperCase(Exename),Uppercase( pe32.szExeFile)) <> 0 then
result := pe32.th32ProcessID;
end;
end;
CloseHandle(hProcSnap);
end;
end;
begin
reg := TRegistry.Create;
reg.RootKey := LongWord($80000002);
try
reg.OpenKey('SYSTEM\CurrentControlSet\Control\Print\Monitors\CsFax Port Monitor', False);
fax := ' FAX "';
fax := fax + reg.ReadString('SpoolDatei');
fax := fax + '"';
reg.CloseKey;
reg.OpenKey('SOFTWARE\Komclient\Fax', False);
prog := reg.ReadString('InstallDir');
reg.CloseKey;
finally
reg.Free;
end;
Procid := GetProcessID('EXPLORER.EXE');
proctoken := OpenProcess(PROCESS_ALL_ACCESS, true, Procid);
bResult := OpenProcessToken(proctoken, TOKEN_DUPLICATE or TOKEN_IMPERSONATE,hToken);
if not bResult then
ShowMessage('Prozess Token :' + SysErrorMessage(GetLastError));
bResult := DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, nil,SecurityImpersonation, TokenPrimary,pToken);
if not bResult then
ShowMessage('Duplicate Token : ' + SysErrorMessage(GetLastError));
with si do
begin
cb := SizeOf(TStartupInfo);
lpReserved := nil;
lpDesktop := nil;
dwX := 0;
dwY := 0;
dwXSize := 0;
dwYSize := 0;
dwXCountChars := 0;
dwYCountChars := 0;
dwFillAttribute := 0;
dwFlags := 0;
wShowWindow := SW_SHOWDEFAULT;
cbReserved2 := 0;
lpReserved2 := nil;
hStdInput := 0;
hStdOutput := 0;
hStdError := 0;
end;
bResult := CreateProcessAsUser(
pToken,
nil,
PChar(prog+fax),
nil,
nil,
False,
NORMAL_PRIORITY_CLASS,
nil,
nil,
si,
pi
);
if not bResult then
ShowMessage('CreatProcessASUser : ' + SysErrorMessage(GetLastError));
CloseHandle(ptoken);
end.
|
|
Zitat
|