views:

315

answers:

5

I have an installer-like application that I have to run as elevated on Vista. But from there I have to start a new process as non-elevated. Any hints how to do this with Delphi2007?

+3  A: 

This blog post is detailed and useful

http://developersoven.blogspot.com/2007/02/leveraging-vistas-uac-with-delphi-part.html

The idea is to use your app with low privilege and COM Dll with elevated privilege. Then when you need elevation, you just fire up COM. Full MPLed source link is included in the post.

dmajkic
That is a really useful post, but note that Meelik wants to do exactly the opposite.
Craig Stuntz
+1  A: 

Note sure if this will help but there is a similar questions here its in c#.net but it may give you some clues where to look, or you could try a port to Delphi.

and just a tip try not to have update/install/setup in the application file name as vista will automatically add the security icon to there exe's.

Re0sless
A: 

You could use the CreateProcessWithLogonW() API call:

function CreateProcessWithLogonW(lpUsername: PWideChar; lpDomain: PWideChar;
  lpPassword: PWideChar; dwLogonFlags: DWORD; lpApplicationName: PWideChar;
  lpCommandLine: PWideChar; dwCreationFlags: DWORD; lpEnvironment: Pointer;
  lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo;
  var lpProcessInformation: TProcessInformation): BOOL; stdcall;
  external 'advapi32.dll' name 'CreateProcessWithLogonW';



procedure RunAs(AUsername, APassword, ADomain, AApplication: string);
const
  LOGON_WITH_PROFILE = $00000001;
var
  si: TStartupInfo;
  pi: TProcessInformation;
begin
  ZeroMemory(@si, SizeOf(si));
  si.cb := SizeOf(si);
  si.dwFlags := STARTF_USESHOWWINDOW;
  si.wShowWindow := SW_NORMAL;
  ZeroMemory(@pi, SizeOf(pi));

  if not CreateProcessWithLogonW(PWideChar(WideString(AUsername)),
    PWideChar(WideString(ADomain)), PWideChar(WideString(APassword)),
    LOGON_WITH_PROFILE, nil, PWideChar(WideString(AApplication)),
    0, nil, nil, si, pi)
  then
    RaiseLastOSError;

  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
end;
mghie
A: 

One way to accomplish this is to use Windows Task Scheduler.

This is discussed with code example in http://delphi.newswhat.com/geoxml/forumhistorythread?groupname=borland.public.delphi.rtl.win32&[email protected]

Meelik
A: 

See this example on MSDN.

TOndrej