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

Odpowiedz Nowy wątek
2011-02-17 19:51
infinity
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.

edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-02-17 19:56
nnn
2011-02-17 20:34
Opi
0

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

Pozostało 580 znaków

2011-02-17 20:43
infinity
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?).

Pozostało 580 znaków

2011-02-17 21:01
infinity
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)?

jesli rozwiazales problem to podziel sie kodem zeby zostalo na forum dla przyszlych pokolen... - cimak 2011-02-17 21:06

Pozostało 580 znaków

2011-02-17 21:20
infinity
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 ;)

Pozostało 580 znaków

2011-02-17 21:34
Opi
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.

Pozostało 580 znaków

2011-02-17 23:14
infinity
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.

Już nie wymaga podpisu Manifest. I będzie on poprawnie działał na każdym systemie od Windows 98 do 7 (32-bit/64-bit). - Opi 2011-02-18 10:14

Pozostało 580 znaków

2011-02-18 10:11
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
edytowany 4x, ostatnio: Azarien, 2011-02-18 10:20

Pozostało 580 znaków

2011-02-18 17:23
infinity
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;)

Pozostało 580 znaków

2011-03-01 18:13
Wersja OS
0

Wersja systemu Windows

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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