Programy - Poradnik
Kontrolka Delphi TService i "System Error. Code: 5. Odmowa dostępu." w Win Vista i Win 7.
Delphi zawiera wygodną "kontrolkę" do budowy aplikacji serwisowych dla windows (File|New|Other...|Delphi Projects: Service Application).
Uruchamiając gotowy (skompilowany) program z parametrem "/install" zainstalujemy naszą aplikację jako windowsowy serwis (stanie się usługą widoczną jedynie w "Menedżer zadań windows"). Analogicznie "/uninstall" spowoduje wypisanie aplikacji z windowsowych usług. Dodając parametr "/silent" spowodujemy pominięcie wyświetlania okienka potwierdzającego zainstalowanie/odinstalowanie usługi. Aplikacja zarejestrowana jako usługa będzie aktywna po zresetowaniu komputera (od tej pory będzie się uruchamiać automatycznie przy każdym starcie komputera).
W Windows Vista i Windows 7 po próbie instalacji serwisu zobaczymy komunikat (nawet jeśli pracujemy na koncie administratora):
Application Error
Exception EOSError in module KeyLogger.exe at 0000F02E.
System Error. Code: 5.
Odmowa dostępu.
W ten sposób Windows chroni się przed niekontrolowanymi zamachami na bezpieczeństwo systemu (np. przed instalacją KeyLoggera).
Aby zainstalować serwis w Vista/Win7 należy najpierw uruchomić program "Wiersz polecenia" lub "Total Commander" w trybie administratora (prawy klawisz myszki nad ikonką programu, wybór z menu kontekstowego: "Uruchom jako administrator"). Z poziomu tych programów możliwe będzie zainstalowanie naszego serwisu.
Bardziej eleganckim rozwiązaniem będzie przygotowanie odpowiedniego pliku "manifestu" i dołączenie go do pliku wykonywalnego naszego programu jako zasób. W starszych wersjach Delphi (np. 2006) wystarczy taki zasób podłączyć do naszej aplikacji. Nowe programy skompilowane nowymi wersjami Delphi (np. 2009) zawierają już plik manifestu - niestety, nieodpowiedni dla naszych celów. Samo podłączenie dodatkowego manifestu ze zmienionym poziomem bezpieczeństwa z "asInvoker" na "requireAdministrator" nic nie poprawi. Natomiast próba kompilacji naszego programu, po dodaniu do projektu źródła (plik *.RC) kompilatora zasobów (program brcc32.exe), spowoduje wyświetlenie ostrzeżenia o konflikcie w zasobach. Przed dołączeniem zasobu z prawidłowym plikiem manifestu należy usunąć istniejący w "*.RES" nieodpowiedni manifest (np. edytorem zasobów dołączanym do starych wersji Delphi).
Jeśli posiadamy komercyjny program instalacyjny, to prawdopodobnie on sam się zatroszczy o prawidłowe zarejestrowanie naszej usługi bez dodatkowych zabiegów (należy sprawdzić w dokumentacji instalatora).
Jeden ze sposobów dołączenia manifestu do aplikacji serwisowej
1. Wczytujemy skompilowany program do dowolnego "Listera" (np. klawisz {F3} w Total Commander).
2. Kopiujemy do schowka końcowy fragment pliku pierwotnej wersji naszej aplikacji z manifestem, przenosimy ze schowka do pliku tekstowego, zapisujemy na dysku pod nazwą np. "Serwisowy.Manifest". Ewentualnie tekst formatujemy.
3. W pliku manifestu zmieniamy poziom bezpieczeństwa z level="asInvoker" na level="requireAdministrator".
4. Przygotowujemy plik np. "PoziomAdministratora.RC" i wpisujemy do niego wiersz:
1 24 "Serwisowy.Manifest"
5. Kompilujemy źródło: brcc32.exe PoziomAdministratora.RC
6. Otrzymujemy plik z zasobem: PoziomAdministratora.RES
7. Usuwamy z pliku zasobów naszej aplikacji zasób z manifestem.
8. Dopisujemy do pliku *.DPR (po linijce {$R *.RES}):
{$R PoziomAdministratora.RES}
9. Kompilujemy projekt. Sprawdzamy koniec pliku wykonywalnego ("Listerem"), czy uzyskaliśmy pożądany efekt (level="requireAdministrator").