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.

- Rejestracja:około 14 lat
- Ostatnio:ponad 13 lat
Wrzuciłem coś na google i dostałem to:
http://stackoverflow.com/questions/3300390/want-to-learn-if-my-application-has-admin-rights
http://stackoverflow.com/questions/1590434/is-it-possible-to-run-an-application-as-administrator-from-the-delphi-ide
http://stackoverflow.com/questions/1590434/is-it-possible-to-run-an-application-as-administrator-from-the-delphi-ide
http://www.delphi3000.com/articles/article_4176.asp?SK=
nie wiem czy ci coś to pomoże bo się na tym nie znam i nie programuję w Delphi
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)?

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 ;)

- Rejestracja:ponad 20 lat
- Ostatnio:około 24 godziny
- Postów:1029
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.
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.


- Rejestracja:ponad 21 lat
- Ostatnio:41 minut
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
Może coś trzeba poprawić/dodać, ale generalnie jest jak znalazł.