UAC i DLL

Oglądasz wersję archiwalną tematu "UAC i DLL" z forum pl.comp.lang.delphi



Tomasz Kaczanowski - 10 Gru 2007, 08:17
Mam taki problem

sie czasami bezpośrednio do napędu. Jest jednak mały problem, a nazwya
się UAC pod vistą. O ile w programie - nie ma problemu, to co zrobić z
poziomu biblioteki? Problem jest taki, że biblioteki uzywać będą nie



alter - 10 Gru 2007, 11:48

Mam taki problem

sie czasami bezpośrednio do napędu. Jest jednak mały problem, a nazwya
się UAC pod vistą. O ile w programie - nie ma problemu, to co zrobić z
poziomu biblioteki? Problem jest taki, że biblioteki uzywać będą nie



UAC jest na tyle pokręcone, że lepiej byłoby gdybyś podał ten
niedziałający kod. Inaczej problemem może być prawie wszystko

Pozdrawiam
alter



Tomasz Kaczanowski - 11 Gru 2007, 02:17


| Mam taki problem

| sie czasami bezpośrednio do napędu. Jest jednak mały problem, a nazwya
| się UAC pod vistą. O ile w programie - nie ma problemu, to co zrobić z
| poziomu biblioteki? Problem jest taki, że biblioteki uzywać będą nie

UAC jest na tyle pokręcone, że lepiej byłoby gdybyś podał ten
niedziałający kod. Inaczej problemem może być prawie wszystko



np ten kod:

hDevice:=CreateFile(pchar('\\.\PhysicalDrive'+inttostr(drv)),
GENERIC_READ, FILE_SHARE_READ OR FILE_SHARE_WRITE,
     nil, OPEN_EXISTING, FLAG_NO_BUFFERING, 0);
   if hDevice <INVALID_HANDLE_VALUE then
   begin
     ldistanceLow:=dword(LBA SHL 9);
     ldistanceHigh:=dword(LBA SHR (32-9));

FILE_BEGIN);
     if dwPointer <$FFFFFFFF then
     begin
       bytestoread:=blocks*bpers;
       SetLength(tempbuf,bytestoread);
       res:=ReadFile(hDevice,  tempbuf[0], bytestoread, numread, nil);
       if res then move(tempbuf[0], buf^, bytestoread);

       if not res then
       begin
         err:=GetLastError;
       end;
     end
     else
     begin
       err:=GetLastError;
     end;
     CloseHandle(hDevice);
   end
   else
   begin
     err:=GetLastError;

Jest blad przy odczycie - blad nr 5.
Jeśli wyłączone jest UAC bądź program, który korzysta z biblioteki
uruchomiony jest w trybie daministratora to działa. Opisane jest
wszedzie jak wymusić tryb administratora w programie, ale nigdzie nie
znalazlem jak to zrobic z wnetrza biblioteki.



alter - 11 Gru 2007, 10:40
Poczytaj trochę na temat CreateFile. W opisanej sytuacji ze względów
bezpieczeństwa wywołanie CreateFile wymaga pełnych praw administratora
(jak wiadomo UAC je zabiera). Jeżeli jesteś pewien, że każda aplikacja,
jaka korzysta z tego dll'a będzie zawsze uruchamiana przez użytkownika,
który ma dostęp do konta administratora to najprościej spreparować
odpowiedni manifest i wstawić go do zasobów danej aplikacji.

Istnieje również inne rozwiązanie, ale jest ono bardziej skomplikowane
ale za to nie wymaga tworzenia manifestu.

Pozdrawiam
alter




Tomasz Kaczanowski - 12 Gru 2007, 01:54

Poczytaj trochę na temat CreateFile. W opisanej sytuacji ze względów
bezpieczeństwa wywołanie CreateFile wymaga pełnych praw administratora
(jak wiadomo UAC je zabiera). Jeżeli jesteś pewien, że każda aplikacja,
jaka korzysta z tego dll'a będzie zawsze uruchamiana przez użytkownika,
który ma dostęp do konta administratora to najprościej spreparować
odpowiedni manifest i wstawić go do zasobów danej aplikacji.

Istnieje również inne rozwiązanie, ale jest ono bardziej skomplikowane
ale za to nie wymaga tworzenia manifestu.




nie ja ją pisałem, ja pisałem tylko bibliotekę, zresztą to wszystko jest
opisane wczesniej. I to, że mogę wstawić manifest i jak to zrobic, wiem,
interesuje mnie co zrobić, by biblioteka miała dostęp do urządzenia.



alter - 12 Gru 2007, 07:25


| Poczytaj trochę na temat CreateFile. W opisanej sytuacji ze względów
| bezpieczeństwa wywołanie CreateFile wymaga pełnych praw administratora
| (jak wiadomo UAC je zabiera). Jeżeli jesteś pewien, że każda
| aplikacja, jaka korzysta z tego dll'a będzie zawsze uruchamiana przez
| użytkownika, który ma dostęp do konta administratora to najprościej
| spreparować odpowiedni manifest i wstawić go do zasobów danej aplikacji.

| Istnieje również inne rozwiązanie, ale jest ono bardziej skomplikowane
| ale za to nie wymaga tworzenia manifestu.

nie ja ją pisałem, ja pisałem tylko bibliotekę, zresztą to wszystko jest
opisane wczesniej. I to, że mogę wstawić manifest i jak to zrobic, wiem,
interesuje mnie co zrobić, by biblioteka miała dostęp do urządzenia.



Ale możesz w takim układzie pokombinować z jakimiś aplikacjami do edycji
zasobów. Albo biblioteka niech będzie jedynie interfejsem
udostępniającym jakieś funkcje, które tak naprawdę będą wykonywane przez
jakąś usługę, z którą komunikuje się biblioteka. Albo możesz zalecić
użytkownikowi aby wyłączył UAC...

pozdrawiam
alter



Norbert - 13 Gru 2007, 10:25

Istnieje również inne rozwiązanie, ale jest ono bardziej skomplikowane
ale za to nie wymaga tworzenia manifestu.



Moze napisz kilka slow na ten temat, to mnie bedzie za chwile dotyczyc.
Dzieki z gory.

pozdrawiam
Norbert



alter - 13 Gru 2007, 11:04


| Istnieje również inne rozwiązanie, ale jest ono bardziej skomplikowane
| ale za to nie wymaga tworzenia manifestu.

Moze napisz kilka slow na ten temat, to mnie bedzie za chwile dotyczyc.
Dzieki z gory.

pozdrawiam
Norbert



Problem polega na tym, że najsensowniejszy fizyczny dostęp do dysku jest
poprzez CreateFile. Niestety CreateFile aby tego dokonać musi być
wywołana z pełnymi prawami administratora. UAC powoduje, że nawet admin
domyślnie ich nie posiada. Ale już usługi Windows tak. Wybór więc jest
prosty. Zresztą takie rozwiązanie jest stosowane przez niektóre
aplikacje np. do defragmentacji dysku.
Rozwiązanie jest banalnie proste ale posiada również swoje ograniczenia
(np. w możliwości obsługi obiektów).
1. Użytkownik uruchamia aplikację i aplikacja działa wg zadanego
schematu bezpieczeństwa (zapewnienie, że użytkownik nie będzie miał
dostępu do funkcji, do których nie powinien mieć - bardzo ważne)
2. Aplikacja korzysta z funkcjonalności opartej o CreateFile. Założenie
jest takie, że funkcja realizująca ma się znajdować w bibliotece.
        2.1. aplikacja wywołuje z biblioteki odpowiednią funkcję
        2.2. w kodzie funkcji komunikujemy się z zaprojektowaną przez nas i
działającą na danym komputerze usługą
        2.3. usługa sprawdza, czy zapytanie, które właśnie otrzymała pochodzi
od autoryzowanego klienta. Jeżeli nie to zwraca błąd, jeżeli tak
wykonuje lub zaczyna wykonywać (to zależy np. od wymagań stawianych
aplikacji) odpowiednią funkcjonalność i zwraca jej status. CreateFile
jest oczywiście wywoływane przez usługę
        2.4. funkcja w dll przekazuje status operacji do aplikacji

Wadą tego rozwiązania jest niestety niewątpliwie fakt iż to programista
tworzący usługę oraz bibliotekę dll ma obowiązek zaimplementowania
jakiejś formy autoryzacji użytkownika/klienta. Jeżeli tego nie zrobi to
aplikacja będzie zła, bo
1. Jeżeli nie będziemy sprawdzać czy użytkownik posiada w systemie
wystarczające prawa to dojdzie do sytuacji gdzie Gość będzie w stanie
np. wymazać całkowicie tablicę partycji albo sformatować partycję systemową.
2. Jeżeli usługa nie będzie miała przynajmniej ograniczeń co do tego z
jakich źródeł akceptować żądania to skutek jak wyżej jest prawdopodobnie
także tylko kwestią czasu.

Istnieje również rozwiązanie przez COM ale tego jeszcze nie próbowałem
więc się nie wypowiem.

Pozdrawiam
alter


Problem z utworzeniem DLL'a (troszke dlugie)
Przekazanie bitmapy do dll, tam jej obrobka i zwrot obrobionej
Pomocy - Access Violation - Klasa - DLL
Przekazywanie klasy przez DLL'a
dll + rundll32.exe = kiszka...
DLL'ka - prototyp ?
Zone Alarm i VSUTIL.DLL
  • bbs;do;kol;passat;b3
  • biuro nieruchomosci zakopane
  • dragon pink
  • czekanie na okres po pigulkach
  • policja stoleczna w bydgoszczy
  • posrednik slask
  • pomoc w wyborze cichego dysku
  • co sie dzieje z moim kompem
  • msi p965 neo f Pi9C4i9B9i9C2i982yty gi9C4i9B9i9C2i982i9C4i982i9C5i982wne
  • Zbiór wiadomości z for dyskusyjnych || Strona Główna