2013-09-30 5 views
5

jestem przenoszenie mojej aplikacji w systemie Windows 8. Program wykorzystuje ścieżkęWindows 8: Aplikacja nie jest w stanie zapisu do katalogu C: ProgramData

C: \ ProgramData \ MyProgramName \

do przechowywania kopii zapasowych. Działa dobrze na Windows 7, ale dostał "Odmowa dostępu", gdy uruchomiłem go na Windows 8.

Jaki jest właściwy sposób i miejsce przechowywania kopii zapasowych mojego programu (niezwiązane z żadnym konkretnym użytkownikiem)?

+0

Czy tworzysz aplikacje Windows Store lub winform/wpf? – Xyroid

+1

Natywny C++ na komputer. – tmporaries

+0

Może to pomóc: http://stackoverflow.com/questions/16276139/difference-between-program-data-and-appdata. Zasadniczo (nie mogę znaleźć linku, który przeczytałem zaledwie dzień lub dwa temu, przepraszam - historia przeglądarki nie jest znaleziona) Otrzymujesz dostęp do zapisu do jednego folderu podczas instalowania programu. Późniejsze próby zapisu do tego folderu zakończy się niepowodzeniem. Podczas próby zapisu danych podczas faktycznego korzystania z programu (w odróżnieniu od fazy instalacji), musisz użyć innego folderu. Podejrzewam, że lepsze miejsce do wykorzystania jest wymienione w pytaniu, do którego się przyłączyłem. – enhzflep

Odpowiedz

4

C:\ProgramData ma ustawienia bezpieczeństwa, które uniemożliwiają zapisanie się tam przez użytkownika standardowego. To nie jest nowe w Windows 8, Windows 7 był taki sam, a równoważny folder na Vista jest również zabezpieczony w ten sposób. Być może twoje środowisko Windows 7 ma wyłączony UAC, lub może zabezpieczyłeś C:\ProgramData lub C:\ProgramData\MyProgramName, aby umożliwić dostęp do zapisu dla standardowego użytkownika.

Istnieje kilka podejść do korzystania z tego folderu. Niektóre aplikacje zapisują tam tylko podczas instalacji, podczas gdy proces instalacyjny działa na podwyższonym poziomie. Następnie sama aplikacja, która działa jako użytkownik standardowy, może czytać, ale nigdy nie próbuje pisać.

Innym podejściem jest stworzenie przez instalatora podkatalogu o numerze C:\ProgramData, który jest zabezpieczony przed dostępem do zapisu dla zwykłego użytkownika lub innego użytkownika/grupy, który programista uzna za właściwy.

4

Widzę wiele programów przechowujących ich dane aplikacji niezwiązane z użytkownikiem we wspólnym folderze aplikacji. Ok, właściwie to, co robią, to utworzenie folderu wewnątrz wspólnego folderu aplikacji do przechowywania ich danych.

Aby uzyskać ścieżkę do wspólnego folderu aplikacji, można wywołać funkcję SHGetFolderPath z CSIDL_COMMON_APPDATA jako identyfikatorem folderu. Jeśli nie musisz obsługiwać niczego wcześniej niż Windows Vista, możesz wywołać funkcję SHGetKnownFolderPath i przekazać FOLDERID_ProgramData jako znany identyfikator folderu.

Ah! Nie wiedziałem, że zwykły folder aplikacji nie może być zapisany przez normalnych użytkowników. Na szczęście wydaje się, że jest zalecane rozwiązanie. Zobacz ten artykuł na temat usługi MSDN, Data and Settings Management, który stwierdza: "Jeśli aplikacja wymaga od zwykłych użytkowników posiadania dostępu do zapisu do podkatalogu aplikacji CSIDL_COMMON_APPDATA, aplikacja musi jawnie modyfikować zabezpieczenia tego podkatalogu podczas instalacji aplikacji. muszą być udokumentowane w Kwestionariuszu Dostawcy. "

+0

'CSIDL_COMMON_APPDATA' i' FOLDERID_ProgramData' zwykle rozwijają się do 'C: \ ProgramData'. Jak radzisz sobie z problemem bezpieczeństwa? –

+0

@DavidHeffernan: "security" nie jest rzeczownikiem, którego można używać w izolacji. Zabezpiecz jakie informacje przed jakim przeciwnikiem? – MSalters

+0

@MSalters 'FOLDERID_ProgramData' jest zabezpieczony przed standardowym pisaniem użytkownika. O to właśnie chodzi. Ta odpowiedź nie rozwiązuje tego problemu. –