Uruchamianie programu z poziomu delphi z uprawnieniami admina na viście

0

Witam.
Potrzebuje uruchomić program z uprawnieniami administratora z poziomu aplikacji delphi, problem w tym że program do uruchomienia znajduje się w folderze program files, i aby go uruchomić z uprawnieniami admina należy wybrać z menu kontekstowego "uruchom z uprawnieniami admina", ja potrzebuje zrobić to bezpośrednio z aplikacji delphi. Wie ktoś jak zrobić coś takiego? Jakiej funkcji użyć do tego? na razie używam shellexecute ale na viście nawet nie wywołuje okna UAC.

0

Poszukaj o manifestach na Windows Vista/7. Tam się kryje to co chcesz uzyskać.

0

Dzięki nnn, w linkach które podałeś znalazłem ciekawą funkcje RunAsAdmin. Na viście działa tak jak trzeba, teraz z kolei problem na xp. Pewnie program będzie uruchamiał odpowiednią funkcje zależnie od systemu (tylko jak sprawdzić na jakim systemie uruchomiony jest program?).

0

Ok problem z uruchamianiem jako admin rozwiązany, ale jeszcze pytanko: Jeśli moja aplikacja będzie w folderze program files to czy da się ją od razu uruchomić jako admin? Ewentualnie jakiś skrót na pulpicie z odpowiednim parametrem(jakim)?

0

Prosicie o kod, proszę bardzo tylko nie bijcie że 3 posty pod sobą...

w zależności od systemu program uruchamiam albo:

ShellExecute(0, 'open', pchar('sciezka_do_exe/app.exe'), nil, nil,SW_SHOW);// w xp 

albo

procedure RunAsAdmin(const aFile: string; const aParameters: string = ''; Handle: HWND = 0);
var
  sei: TShellExecuteInfo;
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 := PChar(aFile);
  sei.lpParameters := PChar(aParameters);
  sei.nShow := SW_SHOWNORMAL;

  if not ShellExecuteexA(@sei) then
    RaiseLastOSError;
end;                     

procedure TForm3.Button3Click(Sender: TObject);
begin
RunAsAdmin('sciezka_do_exe/app.exe');// w systemach vista lub win 7 (na 7 nie wiem czy działa)
//funkcja RunAsAdmin() jest troche przerobiona, tak aby działała w lazarusie, oryginalną wersje umieszczam niżej.
end;  

system sprawdzam za pomącą tej funkcji(też trochę przerobiona):

function GetOSVersion:integer;
var
VersionInfo: TOSVersionInfo;
Platform: string;
MajorVersion,MinorVersion,Build: DWORD;
begin
  VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
  GetVersionEx(VersionInfo);

  with VersionInfo do
  begin
  case dwPlatformId of
   VER_PLATFORM_WIN32s:         Platform := 'Windows 3x';
   VER_PLATFORM_WIN32_WINDOWS: Platform := 'Windows 95';
   VER_PLATFORM_WIN32_NT:         Platform := 'Windows NT';
  end;

  MajorVersion := dwMajorVersion;
  MinorVersion := dwMinorVersion;
  Build := dwBuildNumber;
  end;
  result:=majorversion;//5-> XP, 6->Vista, 7->Win7
end; 
 

oryginalna wersja RunAsAdmin(działa na delphi 7):

procedure RunAsAdmin(const aFile: string; const aParameters: string = ''; Handle: HWND = 0);
var
  sei: TShellExecuteInfo;
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 := PChar(aFile);
  sei.lpParameters := PChar(aParameters);
  sei.nShow := SW_SHOWNORMAL;

  if not ShellExecuteEx(@sei) then
    RaiseLastOSError;
end;

Dzięki wszystkim za pomoc ;)

0

Gdybyś zastosował w swojej aplikacji Manifest z wymogiem uprawnień administratora, to przy uruchomieniu twojej aplikacji UAC zapytałoby się o zgodę na podwyższenie uprawnień. Wtedy, każdy uruchamiany przez ShellExecute program (bez żadnych RunAs) jest także uruchamiany z podwyższonymi uprawnieniami i co ważne, UAC już się o to nie pyta. W twoim przypadku, każde wywołanie RunAs, będzie skutkowało zapytaniem UAC o zgodę.

Więc masz wybór, albo podwyższyć uprawnienia dla swojej aplikacji i potem wszystko uruchamiać jako administrator bez pytań, albo uruchamiać obcy program z uprawnieniami, a twoja aplikacja nadal będzie pracować na zwykłych uprawnieniach.

0

Radziłeś poczytać o manifeście. Zrobiłem to i wyczytałem (chyba nawet twoje posty) że w win7 manifest musi być cyfrowo podpisany, i jest z tym problem.
A mój program będzie używany na różnych systemach, w tym win7, poza tym inny program (konkretnie grę) uruchamia tylko raz, więc nie jest to aż taki problem.
PS
może ktoś mi wytłumaczyć dlaczego kod w delphi7 i lazarusie działa inaczej? konkretnie w delphi7 nie działa w ogóle, w lazarusie jest ok
oto kod:

[...]
FileMode:=fmOpenRead or fmShareDenyNone;
reset(f);
[...]

w delphi7 dostaje access denied gdy inny program używa pliku. W lazarusie tego problemu nie ma.

0

result:=majorversion;//5-> XP, 6->Vista, 7->Win7

Bezydura! Windows 7 jest opatrzony wersją NT 6.1 (czyli major: 6, minor: 1)

Dokładniej:

Windows 2000 ··········-> NT 5.0
Windows XP 32 ·········-> NT 5.1
Windows XP 64 ·········-> NT 5.2
Windows Server 2003 ···-> NT 5.2
Windows Server 2003 R2 -> NT 5.2
Windows Vista ·········-> NT 6.0
Windows Server 2008 ···-> NT 6.0
Windows 7 ·············-> NT 6.1
Windows Server 2008 R2 -> NT 6.1
0

Możliwe, tego nie sprawdzałem dokładnie, a na stronie z której wziąłem kod było napisane tylko o viście. Sorki;)

0

Wersja systemu Windows

Może coś trzeba poprawić/dodać, ale generalnie jest jak znalazł.

1 użytkowników online, w tym zalogowanych: 0, gości: 1