Usuwanie pliku po restarcie a prawa admina

0

Piszę program (a właściwie jego część - Update) i mam problem z tym że przewiduję przypadek w którym Update.exe będzie musiał zaktualizować samego siebie. Wiadomo uruchomionego programu nie da się usunąć ale można zmienić jego nazwę to załatwia sprawę podmiany ale nie do końca bo zostanie mi plik dajmy na to Update.exe.tmp.
Teoretycznie mógłbym wywołać MoveFileEx z parametrem MOVEFILE_DELAY_UNTIL_REBOOT i sprawa załatwiona ale nie mogę bo co jeżeli aplikacja będzie zainstalowana w folderze gdzie potrzebne są prawa admina? Update.exe nie ma praw admina nadanych od początku działania (manifest) i tylko wtedy gdy aktualizacja jest dostępna (jeżeli trzeba) prosi użytkownika o ich nadanie. To załatwiłem w taki sposób że pliki są kopiowane poprzez IFileOperation (ten interfejs pozwala na podniesienie dla niego uprawnień ale nie pozwala na takie coś jak wspomniana funkcja MoveFileEx).
Pytanie jak pozbyć się tego tymczasowego pliku Update.exe.tmp jeżeli znajduje się w folderze do którego dostęp wymaga praw admina. Mogła by go usuwać sama aplikacja która uruchamia się po aktualizacji ale przecież 2 razy (pierwszy raz Update.exe) z kolei nie będzie prosić o nadanie praw admina.
Jakieś wpisy w rejestrze i uruchamianie skryptów przy starcie systemu też raczej odpada bo skrypt bez praw admina też nic nie zrobi... Naprawdę trochę nad tym siedzę, w Google szukać chyba nie umiem (są różne sposoby ale nie załatwiają sprawy gdy potrzeba praw admina) albo już za długo siedzę bo nic nie widzę i nie umiem wymyślić. Może ktoś już coś z tym kombinował. Proszę o podpowiedzi.
PS: Nie zamieszczam żadnego kodu bo nie ma czego.

1

A czy moduł updateujący nie mógłby się zapisywać z zasobów głównego programu i wywoływać z lokalizacji gdzie chyba zawsze masz prawa zapisu jak %Temp%. No chyba, że tam też nie zawsze się da usuwać. Pewnie ktoś doradzi tutaj coś lepszego.

0

Racja by było by jakieś rozwiązanie nawet nie musiałby być w zasobach bo skopiować plik Update.exe z folderu do którego potrzeba uprawnień (np. Program Files) do Temp chyba mogę bez problemu a tam chyba mogę bez uprawnień usuwać pliki to teoretycznie wszystko było by ok (że sam na to nie wpadłem!!!). Jak nikt nie wymyśli coś lepszego to tak zrobię. Wada jest taka, że wymagało by to podawania i/lub zapisywania gdzieś lokalizacji głównego programu (to już nie problem) ale może ktoś wymyśli coś lepszego. Dzięki.

0

Spoko, o ile nie ma jakichś udziwnień w tej kwestii. Bo ciekawe czy jeśli poprzez rejestr lub zmienną środowiskową przestawimy na próbę ścieżkę dla tempa na Program Filea, to czy UAC nie będzie się czepiać zapisu do tej lokalizacji. Ponoć UAC można wyłączyć poprzez rejestr, do następnego restartu. Także luki w bezpieczeństwie pewnie są, ale niestety takie czasy że systemy idą w stronę bajerów wizualnych i upierdliwych mechanizmów robiących z usera idiotę. A według mnie powinno się stawiać na prostotę i funkcjonalność.

0

@kAzek - mimo wszystko poleciłbym kombinowanie z katalogami, do modyfikacji których nie potrzeba uprawnień administratora; Nie ingeruj też w działanie UAC - nie wydaje mi się to rozsądnym posunięciem; Niestety nie znam zbyt dobrze UAC więc dokładnie nie wiem na co pozwoli, a na co nie - trzeba by o tym nieco poczytać;

Ewentualnie możesz pokombinować w ten sposób, że to aplikacja główna usuwa plik tymczasowy (mając stosowne uprawnienia) podczas rozruchu (jeśli ten plik istnieje); Wiele czasu na tym się nie straci;


olesio napisał(a)

Ponoć UAC można wyłączyć poprzez rejestr, do następnego restartu.

Ja jako użytkownik takiego programu byłbym bardzo niezadowolony, gdyby jakiś program ingerował w bezpieczeństwo systemu wyłączając mi zabezpieczenia; Jeśli faktycznie istnieje taka możliwość to omijałbym ją szerokim łukiem;

olesio napisał(a)

Także luki w bezpieczeństwie pewnie są, ale niestety takie czasy że systemy idą w stronę bajerów wizualnych i upierdliwych mechanizmów robiących z usera idiotę.

Być może tak, ale obstawiam, że dlatego wprowadzono UAC bo użytkownicy systemu często po prostu są idiotami (bez obrazy, piszę ogólnie i nie mam nikogo na myśli) - sami bardzo często "pozwalają" na zaśmiecenie systemu i narażenie go na szkodliwe oprogramowanie; A nawet, jeśli nie brać pod uwagę malware'u to instalacjami programów potrafią całkowicie zawalić system; Myślący użytkownik (czyli w większości przypadków ludzie znający komputery) dba o system co dnia, przez co kontroluje go w jakimś tam stopniu; Niestety w 99% przy korzystaniu z cudzego komputera naprawdę krew zalewa, bo mimo "dwujajowości" działają 2x wolniej, niż 10-letnie laptopy;

W mojej ocenie zabezpieczenia systemu nie są dostosowane do obrony przed szkodliwym oprogramowaniem, a szkodliwym użytkownikiem; Dlatego też dla tych, którzy dbają o porządek i stabilność systemu, UAC jest upierdliwym dziwolągiem;

To tylko moje zdanie oparte na setkach niemiłych spotkań z cudzymi komputerami... :]

0

Aplikacja może wiele czasu nie straci ale użyszkodnika wprowadzi w odpowiedni nastrój (co by nie napisać dosłownie o co chodzi) jak 2 razy zapyta o zgodę. Ja wiem o tym brałem pod uwagę aby Update był w "Dane Aplikacji" tylko że mam z tym problem bo chcę aby program nie wymagał instalatora wystarczy wypakować i ma działać dlatego zrobiłem na razie jak pisał @olesio przed odpaleniem kopiuję update.exe do temp zobaczymy jak to się sprawdzi a wygląda że powinno.

Co do UAC pamiętam czasy kiedy programista był panem systemu ring 0 to nie było nic nadzwyczajnego do osiągnięcia (na poziomie programu nie sterownika) teraz nam umilają życie każą kupować jakieś certyfikaty co by było że jesteśmy "zaufanymi" ale faktycznie poziom bezpieczeństwa systemu poszedł do przodu. Tak zgadza się jest to czasami upierdliwe jak choćby w moim przypadku ale jak by nie było podnosi bezpieczeństwo tak sobie myślę napisz teraz wirusa który zmodyfikuje/skasuje ci pliki systemowe bez Twojej zgody dawniej to był żaden problem mogłeś nawet zrobić format C: (z jakimś parametrem nie pamiętam że nie pytał nawet użytkownika o zgodę). Wiem że UAC bywa upierdliwy i czasami faktycznie z użytkownika robi potencjalnego idiotę ale co w jaki sposób ma kontrolować stan wiedzy użytkownika? A przecież z tego co wiem gdzieś (nie pamiętam nawet gdzie nie było mi to potrzebne zwłaszcza jak piszę programy to chcę testować w środowisku "szarego" użytkownika) można ustawić "poziom upierdliwości" UAC.

0

Ja wiem o tym brałem pod uwagę aby Update był w "Dane Aplikacji" tylko że mam z tym problem bo chcę aby program nie wymagał instalatora wystarczy wypakować i ma działać dlatego zrobiłem na razie jak pisał @olesio przed odpaleniem kopiuję update.exe do temp zobaczymy jak to się sprawdzi a wygląda że powinno.

I to jest sensowne rozwiązanie, na dodatek jeśli przeniesiesz plik updatera do katalogu %Temp% to nie musisz go w ogóle usuwać; Mnóstwo aplikacji służących do czyszczenia i optymalizacji systemu właśnie ten i wiele innych katalogów czyści; Sporo aplikacji zostawia w tych folderach pliki i pięknie Odkurzacz (czy Glary Utilities) usuwa co zbędne; No chyba, że plik aktualizatora zajmuje dziesiątki megabajtów to wtedy można się pokusić o natychmiastowe usunięcie;

Co do drugiej części o UAC - dobrze, że ją wprowadzono; To był duży krok naprzód jeśli chodzi o zabezpieczenie systemu; Może i idealny nie jest, ale sporo syfu blokuje i nie pozwala zdestabilizować systemu, a to zawsze się chwali; Minus jest ten, że programiści muszą więcej się napracować aby dostosować program do tych zabezpieczeń.

0

Chyba mnie ktoś wywołał do tablicy? ;)

Jeśli chcecie obejść autostart bez UAC, czyli usunąć plik przy starcie systemu za pomocą aplikacji wymagającej podwyższonych uprawnień należy program umieścić w harmonogramie zadań.

W skrócie:

  1. Uruchamiasz program z manifestem, który wywoła zapytanie UAC z zezwoleniem na start,

  2. Wskazujesz, który plik chcesz usunąć przy starcie systemu,

  3. Dodajesz swój program za pomocą komendy do harmonogramu zadań:
    "schtasks /create /sc onlogon /tn "NAZWA_PROGRAMU" /tr "\"' + Application.ExeName + '\" /PARAMETR_PROGRAMU" /rl highest /f"
    gdzie /PARAMETR_PROGRAMU ustawiasz sobie sam, aby Twój program wiedział, że ma przystąpić do usuwania, a nie do zwykłego uruchomienia

  4. Restart systemu, Twój program robi swoje, a na zakończenie porządkuje po sobie, czyli usuwa siebie z harmonogramu:
    "schtasks /delete /tn "NAZWA_PROGRAMU" /f"

0

Nie wiem nie chce mi się sprawdzać bo już rozwiązałem problem przez kopiowanie do TEMP ale czy do dodania do harmonogramu bądź przy uruchamianiu programu nie będzie trzeba podnieść uprawnień? To nic nie daje równie dobrze moja apka mogła by go kasować gdyby miała odpowiednie uprawnienia chodziło o to aby 2x nie prosić u uprawnienia.

0

Podałem, że podnosisz uprawnienia raz przy dodaniu do harmonogramu. Potem z harmonogramu UAC nie pyta się użytkownika, mimo, że aplikacja startuje z najwyższymi uprawnieniami. Mało tego, można dodać skrót na pulpit bezpośrednio do harmonogramu i wywoływać swój program z w/w uprawnieniami bez pytań ze strony UAC.

0

No tak tylko że Update zapyta o pozwolenie ma podniesienie uprawnień (nie dla całej aplikacji tylko dla IFileOperation) a później aplikacja i co mi to daje? Gdyby aplikacja miała pytać to po co mi jakiś harmonogram wystarczyło by aby aplikacja skasowała ten plik. Chodziło o to aby 2x nie pytać.

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