Einzelnen Beitrag anzeigen

ol1uw

Registriert seit: 24. Jul 2004
Ort: Freiberg
68 Beiträge
 
Delphi 11 Alexandria
 

Re: Vista: Ein Programm mit Benutzerrechten starten

  Alt 12. Mai 2007, 20: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.
  Mit Zitat antworten Zitat