Mam zestaw aplikacji Win32, które udostępniają informacje przy użyciu segmentu pamięci współużytkowanej utworzonego z CreateFileMapping()
i MapViewOfFile()
. Jedną z aplikacji jest usługa systemowa; pozostałe są uruchamiane przez zalogowanego użytkownika. W systemie Windows XP nie było problemu. Nazwaliśmy nasze segmenty "Global \ Something" i wszystko było dobrze.Jak współużytkować pamięć między usługami a procesami użytkownika?
Dodatkowe zabezpieczenia w systemie Vista (i prawdopodobnie Windows 7) wydają się uniemożliwiać działanie tej architektury. Normalni użytkownicy nie mogą tworzyć obiektów (błąd Win32 5) w globalnej przestrzeni nazw. MSDN wskazuje, że jeśli konto ma uprawnienie "twórz globalne", wszystkie powinny być dobrze, ale nie wydaje się, aby tak było w praktyce. Również funkcje "integralności" Visty wydają się uniemożliwiać procesom użytkownika "niskiej integralności" dostęp do obiektu pamięci wspólnej o wysokiej integralności utworzonego przez usługę. Wygląda na to, że powinienem to naprawić za pomocą jakiegoś magicznego zaklęcia, ale mam trudności w nauce mówienia sacl.
Pytanie brzmi: Jaki jest właściwy sposób korzystania z segmentu pamięci dzielonej między usługami a normalnymi procesami użytkownika?
Aby uniknąć łatwej odpowiedzi "po prostu wyłącz UAC", jesteśmy w dość zamkniętym środowisku, a to nie jest możliwe.
Edytuj: Zarówno usługa, jak i proces użytkownika, wymagają dostępu do segmentu w trybie odczytu/zapisu.
Niestety, normalni użytkownicy również muszą mieć dostęp do zapisu – Clay
Zaktualizowana odpowiedź. Trzeba tylko poprawić deskryptor bezpieczeństwa. – Michael
Dobra odpowiedź - jesteśmy w dziwnej sytuacji bezpieczeństwa. Użytkownicy końcowi mają zaufanie do interakcji z systemem (w ten sposób mogą modyfikować pamięć należącą do usługi), ale jesteśmy zobowiązani do ograniczenia ich dostępu (UAC musi być włączony itp.). Witamy w szaleństwie świata sieci rządowej. – Clay