Avatar billede spil2vind Nybegynder
29. oktober 2010 - 11:11 Der er 8 kommentarer og
1 løsning

Kan ikke bruge winexec til at kalde program som kræver administrator rettigheder

Hej

Jeg har et program som kører uden administrator rettigheder, men som i forbindelse en opdatering af programmet kræver kald af et andet program, som skal lægge nye programmer ned i "Program Files" folderen og som spørger ikke tilladelse til at køre med administrator rettigheder.

Hvis jeg lægger kaldet af programmet ind i en CMD fil i "Program Files" folderen virker det ok, men synes til er meget forkert at gøre sådan.

Er der nogen som har nogen gode ideer?

1)
WinExec('test.cmd para1 para2', SW_SHOWNORMAL);
hvor CMD filen ser således ud
Programnavn.exe para1 para2

og

2)
WinExec('ProgramNavn.exe para1 para2', SW_SHOWNORMAL);

1 virker perfekt, men 2 virker ikke

Pft
Carsten
Avatar billede spil2vind Nybegynder
29. oktober 2010 - 18:59 #1
Ups, har jeg beskrevet noget som ikke kan lade sig gøre? Eller er der ikke nogen nørder tilstede :-)
Avatar billede spil2vind Nybegynder
29. oktober 2010 - 23:17 #2
Uha gør jeg noget forkert ?
Avatar billede spil2vind Nybegynder
31. oktober 2010 - 23:12 #3
Da jeg ikke har modtaget nogen indlæg omkring mit problem, opfatter jeg det som det ikke på nogen måde er muligt, at gøre det som jeg har beskrevet, hvis der er noegn som skulle have en work around til brug af CMD, så er de meget velkomne
Avatar billede hrc Mester
08. november 2010 - 10:50 #4
spil2vind: Det er ærgerligt når der ikke kommer respons på ens spørgsmål.

http://www.bobswart.nl/weblog/Blog.aspx?RootId=5:1442 - men Bob har ikke en bedre løsning end din.

Det her fandt jeg på Experts-exchange men løsningen på spørgerens problem kunne jeg desværre ikke se:

function RunAsAdmin(const Handle: Hwnd; const Path, Params: string): Boolean;
var
  sei: TShellExecuteInfoA;
begin
  FillChar(sei, SizeOf(sei), 0);
  sei.cbSize := SizeOf(sei);
  sei.Wnd := Handle;
  sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
  sei.lpVerb := 'runas';
  sei.lpFile := PAnsiChar(Path);
  sei.lpParameters := PAnsiChar(Params);
  sei.nShow := SW_SHOWNORMAL;
  Result := ShellExecuteEx(@sei);
end;

Endelig kan dette her måske få dig videre: http://www.delphipages.com/forum/showthread.php?t=146756

Håber det måske kan hjælpe. Du kan måske finde lidt mere på Google (+delphi "run as administrator")
Avatar billede spil2vind Nybegynder
08. november 2010 - 12:00 #5
Tak hrc, afprøver svaret fra expert exchange, det ser ok ud :-)
Avatar billede spil2vind Nybegynder
08. november 2010 - 14:24 #6
Har afprøvet nedenstående og der sker intet. Man får ikke ikke nogen værdi for shExecInfo.hInstApp som er større end 32

function VistaExecElevated(FileName, CLParams, Dir : String; var ExitCode: DWORD; const Wait: DWORD = 0): LongWord;
var
  shExecInfo : TShellExecuteInfo;
  iWaitRes: DWORD;
begin
Result := 0;
if FileName <> '' then begin
  FillChar(shExecInfo, SizeOf(shExecInfo), 0);
  shExecInfo.cbSize := SizeOf(shExecInfo);
  {if hHandle <> null then
    shExecInfo.WND := Hhandle;}
  shExecInfo.fMask  := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI;
  //shExecInfo.hInstApp := NULL;
  shExecInfo.lpVerb := PWideChar('runas');
  shExecInfo.lpFile := PWideChar(FileName);
  if CLParams <> '' then
    shExecInfo.lpParameters := PWideChar(CLParams);
  if Dir <> '' then
    shExecInfo.lpDirectory := PWideChar(Dir);
  shExecInfo.nShow := SW_HIDE;  {SW_SHOW}
  ShellExecuteEx(@shExecInfo);
  Result := shExecInfo.hInstApp;
  if Result > 32 then begin
    // wait on process ?
    if (Wait > 0) then begin
      iWaitRes := WaitForSingleObject(shExecInfo.hProcess, Wait);
      // timeout reached ?
      if (iWaitRes = WAIT_TIMEOUT) then begin
          //Result := 0;
          TerminateProcess(shExecInfo.hProcess, 0);
        end;
      // get the exitcode
      GetExitCodeProcess(shExecInfo.hProcess, ExitCode);
      end;
    // close handle, because SEE_MASK_NOCLOSEPROCESS was set
    CloseHandle(shExecInfo.hProcess);
    end;
end;
end;
Avatar billede spil2vind Nybegynder
08. november 2010 - 14:51 #7
Igen tak hrc, du hjalp mig på vej, smid et svar, nedenstående virker korrekt, kan ikke lige gennemskue hvorfor ovenstående ikke lige virker.

function RunAsAdmin(const Path, Params: string): Boolean;
var
  sei: TShellExecuteInfo;
begin
  FillChar(sei, SizeOf(sei), 0);
  sei.cbSize := SizeOf(sei);
  sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
  sei.lpVerb := PWideChar('runas');
  sei.lpFile := PWideChar(ExtractFileName(Path));
  sei.lpDirectory := PWideChar(ExtractFilePath(Path));
  sei.lpParameters := PWideChar(Params);
  sei.nShow := SW_SHOWNORMAL;
  Result := ShellExecuteEx(@sei);
end;
Avatar billede spil2vind Nybegynder
16. november 2010 - 23:37 #8
Skal vi ikke se at få dette spørgsmål lukket HRC, send et svar
Avatar billede spil2vind Nybegynder
13. marts 2011 - 16:22 #9
Lukker sagen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester