ShellExecute i ostrzeżenie o zabezpieczeniach

0

Uruchamiając z aplikacji w Delphi inną aplikację komendą ShellExecute przed jej uruchomieniem Windows wyświetla ostrzeżenie o zabezpieczeniach. Jak je pominąć?

1

O ile dobrze kojarzę, to nie obejdziesz tego z poziomu aplikacji, a jedynie możesz wyłączyć pewne zabezpieczenia w samym systemie.

Zresztą jaki sens by miało umożliwienie apce wyłączenie zabezpieczeń? Twoja aplikacja pewnie nie robi niczego złego, ale z tego samego mechanizmu by mógła skorzystać jakaś szkodliwa aplikacja, która wprowadzi bez wiedzy i zgody użytkownika jakieś szkodliwe zmiany w systemie.

Rozumiem, że pisząc o "ostrzeżeniu o zabezpieczeniach" masz na myśli UAC - czyli coś w stylu poniższego obrazka:
https://img.raymond.cc/blog/wp-content/uploads/2007/03/user_account_control_prompt.png

Możesz rzucić okiem na poniższe linki. Ogólnie to da się to zabezpieczenie wyłączyć, ale jet to wyłączenie na poziomie systemu, a nie dla konkretnej aplikacji. Można jeszcze się zastanowić, czy zadania które wymagają zwiekszonych uprawnień naprawdę mają taką potrzebę, czy sa to "zwykłe" rzeczy, ale system nie wie o tym. W starszych wersjach Delphi był z tym problem, trzeba było grzebać w manifest:

This behavior is caused because the applications build with Delphi 7 by default does not have a manifest, or have one with no requestedExecutionLevel attribute. Because of that Windows thinks that you need administrator access [...]

https://stackoverflow.com/questions/923350/delphi-prompt-for-uac-elevation-when-needed
https://mydev4fun.wordpress.com/2013/02/21/disable-uac/
https://stackoverflow.com/questions/682182/disabling-uac-programmatically
https://stackoverflow.com/questions/4133337/how-do-i-avoid-uac-when-my-exe-file-name-contains-the-word-update

1

@krzynio: a na jakich uprawnieniach działa główna aplikacja?

IMO jedyna opcja na pozbycie się ostrzeżenia to wyłączenie UAC, ale z punktu widzenia bezpieczeństwa to głupi pomysł.

1

@krzynio: jaką aplikację uruchamiasz przez ShellEecute? Może to ona wymaga podwyższenia uprawnień?
Mam wiele aplikacji, które uruchamiają inne i nigdy nie miałem tego problemu. Jednak są one w stworzone w Lazarusie, a nie w Delhi.
Możesz też główną aplikację uruchamiać jako administrator, wtedy uruchamianie innych aplikacji nie powinno już pytać o podwyższenie uprawnień, ale nie jestem pewien, czy tak jest..

2
skrzat napisał(a):

Może to ona wymaga podwyższenia uprawnień?

Na pewno tak jest — w przypadku aplikacji nie wymagającej podwyższonych uprawnień, system nie prosi o potwierdzenie. A wiem, bo właśnie dłubię przy jednej swojej apce, która uruchamia inną apkę (nie wymagającą uprawnień admina i nie posiadającą podpisu cyfrowego) i żadne potwierdzenia nie są wymagane, choć UAC oczywiście jest włączone.

Co prawda robię to za pomocą TProcess w Lazarusie, ale to tylko wygodny wrapper na ShellExecute (pod Windows).

Jednak są one w stworzone w Lazarusie, a nie w Delhi.

To nie ma żadnego znaczenia. W końcu system ma to gdzieś, w czym program został stworzony i skompilowany. ;)

Możesz też główną aplikację uruchamiać jako administrator, wtedy uruchamianie innych aplikacji nie powinno już pytać o podwyższenie uprawnień, ale nie jestem pewien, czy tak jest..

Trzeba by sprawdzić, ale to może nie być takie oczywiste — nie wiem czy uprawnienia procesu-rodzica są w takim przypadku przenoszone na procesy potomne, pochodzące z zewnętrznych plików wykonywalnych. Szybki test powinien rozwiać wątpliwości.

0

Opcje są dwie:

  • wyłączamy UAC
  • uruchamiamy aplikacje z podniesionymi uprawnieniami (tylko że nie każdy użytkownik ma admin-a)
    I tak źle i tak niedobrze
0

Opcja pierwsza od razu odpada — nie powinno się jej w ogóle i nikomu polecać. Problemem nie jest istnienie i działanie UAC, a brak zrozumienia jak z tą usługą współpracować, żeby nie mieć problemów.

0

Oprócz UAC trzeba jeszcze odpalić inetcpl.cpl wejść w Security > custom level i wykonać zabieg który dołączam na screenie(mam angielską wersję windows 7 więc nie wiem jak będzie to w polskiej). u mnie działa bez problemu i nigdy nie mam żadnych ostrzeżeń. Na windows 10 też powinno działać

screen-uac-inetcpl.png

1

Ja z mojego doświadczenia zauważyłem, że np. antywirusy, gdzie doszło do wywołania ShellExecute traktują alikację jako wirusa. Co jeszcze zauważyłem, ze jak na formie umieściłem tylko button a w nim komendęShellExecute antywirus automatycznie zadziałał. Jeśli natomiast w kodzie programu było więcej procedur i funkcji już nie. Dziwna sprawa. Myślę, że *.exe przez antywirusa był sprawdzany pod względem wagi na dysku. Bo po co komuś tylko jedna procedura w *.exe ShellExecute Sprawdźcie to sami :-) Tak samo antywirusy i wszelkie zapory zadziałają, gdy nazwiesz na dysku plik wykonywalny Start, Setup, Instalacja itd. Zatem jak nazwałeś Twój plik wykonywalny uruchamiający inną aplikację. Począwszy od Windows 7 nie jest to takie proste i do tego ShellExecute :-) Mój poniższy program działający w komendzie DOSA z pozycji Windows wymusza uprawnienia admina "dwóm aplikacjom". Nie ma problemu z tym. Program nadrzędny jest adminem. Wywołuje podprogram, który sam musi być adminem. Nadanym przez program nadrzędny - jeśli podrzędny również ma atrybuty amina powinno zadziałać..

0

I nie żadne UAC!!!!!!

0

Generalnie możemy zgadywać, aż autor nie wrzuci konkretnego komunikatu lub screena. Niemniej takie ostrzeżenia często się włączają, gdy aplikacja jest pobrana z sieci, lub jest uruchamiana z sieci i nie jest podpisana. Jeśli taką aplikacje podpiszemy to przestanie ostrzegać o niezaufanym źródle aplikacji.

0

Sorki,długo mnie nie było więc nie pisałem.
Na pewno nie chodzi o UAC. UAC mam wyłączony.
Mam aplikację napisaną w Delphi, taki tam MES i ten MES czasem wywołuje korzystając z procedury ShellExecute drugą aplikację, którą jest siedzący w tray'u WEB server napisany w Lazarusie.
W chwili uruchamiania WEB Servera pojawia się ów komunikat o zabezpieczeniach. Obszedłem go dokonując wpisu w rejestrze do klucza LowRiskFileTypes i działa ale musiałem to zrobić ręcznie z poziomu regedita.
Próbowałem potem zakodować ten w wpis w MESie ale Windows nie pozwala i nie modyfikuje rejestru.
Kod jest prosty:

try
    with TRegistry.Create do begin
      RootKey := HKEY_CURRENT_USER;
      OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Associations', True);
      WriteString('LowRiskFileTypes', '.exe; .bat; .cmd; .lnk; .html');
      Free;
    end;
except
      on e: exception do
        MessageDlg(e.Message, mtError, [mbOK],0 );
end;

Nie do końca nie działa. To znaczy, na moim kompie kod działa, ale na korporacyjnych są zaimplementowane jakieś polisy, które nie pozwalają wywołania go z innej aplikacji. Prawdopodobnie zabrania tego McAfee albo Cylance. Mamy zaimplementowane takie polisy, które nie pozwalają na uruchamianie skryptów ani modyfikacji rejestru przez aplikacje inne niż systemowe, chyba, że znajdują się one w dedykowanym do tego celu folderze na komputerze lokalnym. Niestety MES jest zainstalowany na serwerze i stamtąd jest uruchamiany.
Pisząc pierwszy post tego nie wiedziałem, odkryłem to dopiero po jakimś czasie.
Tak czy inaczej dziękuję za podjęcie tematu. Dyskusja jakby nie patrzeć poszerzyła zagadnienie.

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