Problem z Vista i manifestem

0

Witam,

Mam problem ze swoją aplikacją pod systemami Vista, a polega on na tym, że po jej instalacji w "Program files" program nie może zapisywać w swoim katalogu nawet plików tekstowych. Wiem, że wynika to z wbudowanego mechanizmu UAC. Co prawda powinno do tego celu wykorzystywać inny katalog, ale co w sytuacji aktualizacji programu? Muszę mieć dostęp, aby usunąć starą wersję i zapisać nową...

Teoretycznie wystarczy utworzyć plik manifestu dla programu, który powinien rozwiązać problem, ale nie rozwiązuje. Znalazłem nawet metodę, która podczas kompilacji coś dodaje do exe'ca z utworzonego pliku REC, ale przy kompilacji program ignoruje ów plik i wywala komunikat: Duplicate resource: Type 24(user-defined),ID 1:FIle...... resource discarded.

Nie mam już pomysłu co mogę zrobić, aby moja aplikacja uruchamiała się z taki prawami, które umożliwią swobodny zapis w jej katalogu domowym. Dodam, że w innym folderze np na dysku D wszystko śmiga. Może coś podpowiecie.... :(

Pozdrawiam - Krzysztof

0

Długo szukałem rozwiązania problemu i w większości przypadków nie było odpowiedzi satysfakcjonującej albo wcale. Programiści... nawet nie wiedzą jak to rozwiązać... trzeba było szukać więc dalej.

I znalazłem
http://www.theabsolute.net/sware/delphivista.html#userinterface

Do tego tworzysz manifestu, który jednocześnie spełnia dwie role. Pozwala na wywołanie UAC z prawami administratora i jednocześnie nie zaburza styli Windows.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">  
	<assemblyIdentity 
	   version="1.0.0.0" 
	   processorArchitecture="*" 
	   name="UACAwareApplication" 
	   type="win32"/> 
	<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
		<security> 
			<requestedPrivileges>
				<requestedExecutionLevel level="requireAdministrator"/> 
			</requestedPrivileges> 
		</security> 
	</trustInfo> 
	<description>MOJA FIRMA</description>
	<dependency>
	    <dependentAssembly>
	        <assemblyIdentity
	            type="win32"
	            name="Microsoft.Windows.Common-Controls"
	            version="6.0.0.0"
	            processorArchitecture="X86"
	            publicKeyToken="6595b64144ccf1df"
	            language="*"
	        />
	    </dependentAssembly>
	</dependency>
</assembly> 

I nie musisz się już martwić, jak zaktualizować program w folderze Program Files.

ps. Vista jest bardziej natarczywa, Windows 7 dużo wprowadził w stosunku do UAC i jest lepiej.
Do pełni szczęścia brakuje jeszcze podpisu cyfrowego, aby aplikacja była w Windows rozpoznawana jako zaufana.

0

Dzięki za podpowiedź, ale właśnie coś takiego stosuję i to nie daje rozwiązania. Owszem, powoduje, że system podczas uruchamiania aplikacji woła o zgodę na uruchomienie w trybie pełnego dostępu i później wszystko śmiga, ale tylko jeśli uruchamiający użytkownik posiada uprawnienia admina. Natomiast jeżeli program uruchamia zwykły użytkownik to sytuacja taka powoduje, że podczas uruchamiania programu program żąda hasła admina, lub użytkownika o takich prawach.

Nie wyobrażam sobie sytuacji, że Pani Krysia ciągle prosi kogoś o wpisanie hasła.... ;-)

Jeśli wpiszemy: requestedExecutionLevel level="asInvoker" to oczywiście soft się odpala, pracuje na bazie bez problemów, ale jeśli trzeba coś zapisać lokalnie, lub zrobić aktualizację to jest kicha. Równie dobrze można nie stosować manifestów zewnętrznych, gdyż D2009 ma własny standardowo właśnie ustawiony na "asInvoker".

Chyba jedynym rozwiązaniem będzie przeniesienie konfiguracji programu do rejestru, bo tam można zapisywać, tylko każdy user windy będzie musiał przy pierwszym uruchomieniu skonfigurować program... eh... MS zawsze nam utrudni jakoś życie... :-/

0

Do trzymania konfiguracji masz odpowiedni folder w folderze usera o nazwie AppData i tam w Local możesz sobie trzymać plik z konfiguracją - Program Files nie jest do tego.

Co do aktualizacji - czynność ta musi być zatwierdzona przez admina zawsze - tu nie ma co obchodzić tego - nigdy nie wiadomo co idzie z netu. Teoretycznie admin powinien się znać i w razie potrzeby nie dać zezwolenia. Większość nowych programów zanim się zaktualizuje wymaga uprawnień administracyjnych i jest to normalne.

Wg. mnie M$ dobrze zrobił, że nie każdy może gmerać tam gdzie nie potrzeba zwykłemu userowi.

PS. http://stackoverflow.com/questions/471123/accessing-localapplicationdata-equivalent-in-delphi

0

PsCA masz rację i tak postanowiłem zrobić. Co trzeba zapisze w AppData, co trzeba to w rejestrze a do aktualizacji osobny mały program, którego uruchomienie będzie wymagało uprawnień admina. Co ciekawe, jeśli taki program wywołamy z aplikacji, która tego nie potrzebuje uruchamia się bez tego, ale nie wykona operacji dla admina odstępnych, nawet na koncie admina ;-)

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