2009-09-18 9 views
5

W mojej aplikacji muszę przechowywać ustawienia, które są "globalne" (tj. Nieokreślone przez użytkownika) w znanej i przewidywalnej lokalizacji.Zapisywanie "globalnych" danych jako standardowy użytkownik?

Chcę, aby aplikacja mogła być uruchamiana z dowolnego miejsca (jako standardowy użytkownik, NIE administrator), w tym wiele kopii z różnych lokalizacji i mieć możliwość odczytu i zapisu zapisanych plików konfiguracyjnych.

Dane muszą mieć dostęp do odczytu i zapisu dla wszystkich standardowych użytkowników, a nie tylko jednego.

Mając to na uwadze, cztery opcje zauważyć są nieodpowiednie: http://msdn.microsoft.com/en-us/library/bb206295(VS.85).aspx#ID0E1BA

Więc jakie są moje alternatywy?

Moja aplikacja napisana jest w C++ i tylko dla Windows. Potrzebuję obsługi systemu Windows XP i nowszych.

Dzięki.

EDIT:

celu wyjaśnienia, ignorować warunków wyścigu spowodowane wieloma instancjami. To pytanie dotyczy wyłącznie GDZIE SKŁADAĆ DANE. Nie widzę nigdzie nadaje czyli:

  1. przewidywalne (np% appdata% \ Foo jest 'przewidywalne' ścieżka, ale niestety dla konkretnego użytkownika)
  2. Global (np% ProgramData% \ Foo jest globalny droga ale niestety tylko użytkownikowi tworzenie ma zapisu dostępu)
  3. dostępne (standardowy użytkownik musi mieć możliwość tworzenia nowych plików w danym katalogu, to odnosi się do wszystkich użytkowników systemu)

Odpowiedz

2

Jeśli zdecydujesz, że nie jest właściwe CSIDL_COMMON_APPDATA (może CSIDL_COMMON_APPDATA jest dobrym domyślnym, ale chcesz, aby administrator mógł zmienić lokalizację) można mieć instalator napisać coś do HKLM\SOFTWARE\<your app subkey> który wskazuje żądaną ścieżkę wspólny katalog, który będzie przechowywać dane.

Alternatywą do umieszczenia wskaźnika w rejestrze HKLM jest posiadanie pliku konfiguracyjnego, który znajduje się w katalogu programu, który ma wskaźnik do katalogu współdzielonego. Z definicji katalog programu musi być zapisywany przez instalatora, jest zapisywalny przez administratorów (którzy mogą być odpowiedzialni za modyfikację konfiguracji) i może być odczytywany przez użytkowników. Zatem standardowy użytkownik może odczytać dobrze znaną lokalizację (albo podklucz HKLM, albo plik konfiguracyjny w katalogu programu), aby uzyskać wskaźnik do katalogu, który jest zapisywalny dla wszystkich standardowych użytkowników.

Niezależnie od konfiguracji wspólnego katalogu (programu instalacyjnego lub modułu konfiguracyjnego) należy się upewnić, że lista ACL wspólnego katalogu jest odpowiednio ustawiona dla standardowych zapisów użytkownika.

+0

"możesz poprosić program instalacyjny o napisanie czegoś do HKLM \ SOFTWARE \ " Zrobiłem to w szeroko rozproszonych aplikacjach komputerowych. Mam, aby instalator podał standardowe uprawnienia użytkownika do zapisu na tym kluczu. –

+1

@Jim: Nie wspominałem o ustawianiu listy ACL dla podklucza HKLM na coś, co można zapisać przez standardowych użytkowników (co można również zrobić dla podkatalogu katalogu programu), ponieważ uważam, że jest to ogólnie uważane za złą praktykę (chociaż ja ' nie jestem pewien, czy się zgadzam). Pomyślałem, że może to być problem z certyfikacją logo, choć nie wiem, czy to prawda, czy nie. –

-2

opcje :

  1. Mutex Plik do kontrolowania dostępu do pliku
  2. bazy danych do przechowywania ustawień
  3. Web Service, aby zapisać ustawienia, które mogą obsłużyć współbieżności
+0

Mój problem polega nie na synchronizacji, ale raczej na tym, że nie mogę znaleźć gdzieś globalnego, że nie-administrator może faktycznie zapisywać dane. – RaptorFactor

1

spróbować Folder publiczny w użytkownikowi profile katalogu:

CSIDL_COMMON_DOCUMENTS 

Edit: Albo używać

CSIDL_COMMON_APPDATA 

, ale jeśli to możliwe, ustaw uprawnienia dla grupy Użytkownicy uwierzytelnieni.

1

Prawdopodobnie szukasz CSIDL_COMMON_APPDATA. IIRC, który również powinien być dobrym wyborem, jeśli przejdziesz do dowolnego certyfikatu logo Windows. Jeśli nie spełnia Twoich wymagań, sprawdź numer this link on MSDN, aby znaleźć tam najlepiej dopasowany do swoich potrzeb.
Powodzenia.

+0

BTW: należy unikać przechowywania poufnych danych użytkownika w tym katalogu. – Dmitry

1

Nie można po prostu użyć stałej nazwy katalogu, np. c: \ FixedDataForYourProgram

Robimy to na XP. Nie próbowałem tego programowo na Vista/Win7, ale zalogowany jako standardowy użytkownik na Vista Nie mam problemu z tworzeniem katalogu w katalogu głównym.

Jestem pewien, że łamie to wiele zasad, ale jest to proste. Lubię proste.

+0

Proste ... i niechlujne. Utrudnia to aplikacjom pracę w trybie migracji między użytkownikami, w obecności profilów użytkowników mobilnych itp. – reuben

+0

Ale pytanie wymaga stałej lokalizacji. Spełnia to określone wymagania (przewidywalne/globalne/dostępne). Zbyt wiele wysiłku wkłada się w rozwiązywanie problemów, które nigdy nie powstają. – IanH