Projekt konfiguracji VS2008: udostępniane (przez wszystkich użytkowników) Pliki Danych aplikacji?

Towarzysze antropoidów i lilii i paddlewheels!

Rozwijam aplikację pulpitu Windows w C#/. Net / WPF, używając VS 2008. Aplikacja jest wymagana do zainstalowania i uruchomienia na komputerach Vista i XP. Pracuję nad projektem instalacji / Instalatora Windows, aby zainstalować aplikację.

Moja aplikacja wymaga dostępu do odczytu/modyfikacji/zapisu pliku bazy danych SQLCE (.sdf) i kilka innych plików typu bazy danych związanych z kontrolką innej firmy, której używam. Pliki te powinny być udostępniane wszystkim użytkownicy / logowania na komputerze, z których żaden nie może być wymagany do bycia administratorem. Oznacza to oczywiście, że pliki nie mogą znaleźć się we własnym katalogu instalacyjnym programu (Jak to często robiło się przed pojawieniem się Visty, tak, tak!).

Spodziewałem się, że rozwiązanie będzie proste. Vista i XP mają foldery shared-application-data przeznaczone do tego celu. ("\ProgramData " w Vista,"\Documents and Settings\All Users \ Application Data " W XP.). NET Środowisko.GetFolderPath (SpecialFolder.Common applicationdata) wywołanie istnieje, aby znaleźć ścieżki do tych folderów na danym komputerze, tak, tak!

Ale nie mogę dowiedzieć się, jak określić folder shared-application-data jako cel w projekcie instalacji.

Projekt instalacyjny oferuje folder "Common Files" , ale jest przeznaczony dla współdzielonych składników programu (Nie plików danych), zwykle znajduje się w "\Program Files " i ma te same ograniczenia bezpieczeństwa co inne w "\Program files " robi, tak, tak!

Projekt konfiguracji oferuje folder "Dane aplikacji użytkownika", ale jest to folder dla każdego użytkownika, którego dokładnie próbuję uniknąć, tak, tak!

Czy możliwe jest dodawanie plików do folderu shared-app-data w solidny sposób w wersji między Windows z projektu instalacyjnego VS 2008? Czy ktoś może mi powiedzieć jak?

Author: Lyman Enders Knowles, 2008-09-16

7 answers

Odpowiedź na moje pytanie dowiedziałem się z innych źródeł, tak, tak! Niestety, to nie rozwiązało mojego problemu! Co to robi ze mnie? Tak, tak!

Aby umieścić rzeczy w podkatalogu folderu Common Application Data z projektu instalacyjnego VS2008, wykonaj następujące czynności:

  1. Kliknij prawym przyciskiem myszy swój projekt instalacyjny w Eksploratorze rozwiązań i wybierz "Widok - > System plików".

  2. Kliknij prawym przyciskiem myszy "system plików na docelowej maszynie" i wybierz " Dodaj specjalny Folder -> Folder Niestandardowy".

  3. Zmień nazwę folderu niestandardowego na " wspólny Folder danych aplikacji."(To nie jest nazwa, która zostanie użyta dla folderu wynikowego, po prostu pomoże Ci utrzymać go prosto.)

  4. Zmień właściwość DefaultLocation folderu na " [CommonAppDataFolder] [Producent]\[ProductName]". Zwróć uwagę na podobieństwo do Właściwości DefaultLocation folderu aplikacji, w tym na dziwne użycie pojedynczego ukośnika wstecznego.

  5. Zachwyć się przez chwilę na śmieszny (ale niezaprzeczalny) fakt, że istnieje właściwość folderu o nazwie " Property."

  6. Zmień właściwość folderu na "COMMONAPPDATAFOLDER".

Pliki Danych umieszczone w folderze" Common Application Data " zostaną skopiowane do "\ProgramData\Manufacturer\ProductName" (Na Vista) lub "\Documents and Settings\All Users\Application Data\Manufacturer\ProductName" (NA XP) po uruchomieniu Instalatora.

Teraz okazuje się, że pod Vistą nie-Administratorzy nie uzyskuj dostępu do modyfikacji/zapisu plików tutaj. Więc wszyscy użytkownicy mogą czytać pliki, ale dostają to również w "\ Program Files". Ciekawe jaki jest cel wspólnego folderu danych aplikacji?

 20
Author: Lyman Enders Knowles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-13 17:32:08

Zamiast zaznaczać "Włącz ustawienia zabezpieczeń ClickOnce" i wybierać "to jest pełna aplikacja zaufania", można zmienić uprawnienia aplikacji CommonAppDataDirectory z niestandardową akcją w sekcji" install " projektu instalacyjnego. Oto co zrobiłem:

  1. Dodano niestandardową akcję wywołania zainstalowanej aplikacji (alternatywnie można utworzyć osobny program/bibliotekę dll i wywołać go zamiast tego)
  2. ustaw właściwość Arguments na "Install"
  3. zmodyfikowany Główna w programie.cs do sprawdzenia tego arg:

    static void Main(string[] args) { if (args != null && args.Length > 0 && args[0] == "Install") { ApplicationData.SetPermissions(); } else { // Execute app "normally" } }
  4. napisał funkcję SetPermissions do programowej zmiany uprawnień

    public static void SetPermissions() { String path = GetPath(); try { // Create security idenifier for all users (WorldSid) SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); DirectoryInfo di = new DirectoryInfo(path); DirectorySecurity ds = di.GetAccessControl(); // add a new file access rule w/ write/modify for all users to the directory security object
    ds.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.Write | FileSystemRights.Modify, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, // all sub-dirs to inherit PropagationFlags.None, AccessControlType.Allow)); // Turn write and modify on // Apply the directory security to the directory di.SetAccessControl(ds); } catch (Exception ex) { MessageBox.Show(ex.Message); } }

Ponieważ instalator działa z uprawnieniami administratora, program będzie mógł zmienić uprawnienia. Czytałem gdzieś, że "Włącz zabezpieczenia ClickOnce" może spowodować, że użytkownik zobaczy niepożądany monit przy starcie aplikacji. Zrobienie tego w sposób opisany powyżej zapobiegnie temu. Mam nadzieję, że to komuś pomoże. Wiem, że mogłem skorzystać z widziałem coś takiego kilka dni temu!

 10
Author: ejwipp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-08 21:12:45

Rozwiązałem to w ten sposób. Zachowałem plik bazy danych (.sdf) w tym samym folderze, w którym jest zainstalowana aplikacja (folder aplikacji). Na karcie bezpieczeństwo w oknie właściwości głównego projektu, sprawdziłem "Włącz ustawienia bezpieczeństwa ClickOnce" i wybrałem "to jest pełna aplikacja zaufania", przebudowałem i uruchomiłem konfigurację. Po tym nie ma problemu z bezpieczeństwem

Używam Visual Studio 2008 i Windows Vista

 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-29 04:05:43

Miałem ten sam problem. Projekt instalacyjny daje użytkownikowi możliwość zainstalowania aplikacji "tylko dla bieżącego użytkownika" lub " dla wszystkich użytkowników:. W związku z tym Plik bazy danych skończy się w folderze danych bieżącego użytkownika lub wszystkich użytkowników aplikacji. Konfiguracja musiałaby gdzieś zapisać te informacje, aby aplikacja mogła je później odzyskać, jeśli chodzi o dostęp do bazy danych. Skąd miałby wiedzieć, w którym folderze danych aplikacji szukać?

Aby uniknąć tego problemu, Chcę tylko zainstalować bazę danych w folderze All Users / Application Data, niezależnie od tego, czy aplikacja została zainstalowana dla jednego użytkownika, czy dla wszystkich użytkowników. Zdaję sobie oczywiście sprawę, że dwóch użytkowników nie mogło zainstalować aplikacji na tym samym komputerze bez nadpisywania sobie nawzajem danych. Jest to jednak tak odległa możliwość, że nie chcę jej rozważać.

Pierwszy element układanki, który dostałem tutaj :

Form_Load(object sender, EventArgs e)
{
  // Set the db directory to the common app data folder
  AppDomain.CurrentDomain.SetData("DataDirectory", 
            System.Environment.GetFolderPath
           (System.Environment.SpecialFolder.CommonApplicationData));
}

Teraz musimy się upewnić, że źródło danych zawiera symbol zastępczy DataDirectory. Ten kawałek pochodzi z tutaj . W Projektancie zbioru danych Znajdź właściwości zbioru danych, otwórz węzeł połączenia i edytuj właściwość ConnectionString, aby wyglądała następująco:

Data Source=|DataDirectory|\YourDatabase.sdf

Następnie postępowałem zgodnie z instrukcjami Lymana Endersa Knowlesa z góry, aby dodać folder danych wspólnej aplikacji do projektu instalacyjnego i umieścić plik bazy danych w tym folderze.

Następnie zastosowałem się do sugestii Ove z góry, tzn. sprawdziłem " Enable ClickOnce Ustawienia zabezpieczeń " i zaznaczono "jest to aplikacja pełnego zaufania.

Następnie aplikacja została dobrze wdrożona w systemie Vista, a plik bazy danych był dostępny zarówno do odczytu, jak i zapisu.

 1
Author: cdonner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-12 13:37:46

Podoba mi się poniżej, niektóre rzeczy wzięte z góry

  1. Kliknij prawym przyciskiem myszy swój projekt instalacyjny w Eksploratorze rozwiązań i wybierz "Widok - > System plików".

  2. Kliknij prawym przyciskiem myszy "system plików na docelowej maszynie" i wybierz "Dodaj Folder specjalny - > Folder Niestandardowy".

  3. Zmień nazwę folderu niestandardowego na " wspólny Folder danych aplikacji."(To nie jest nazwa, która zostanie użyta dla folderu wynikowego, po prostu pomoże Ci utrzymać go prosto.)

  4. Zmień właściwość defaultlocation folderu to "[CommonAppDataFolder] [Manufacturer] [ProductName]". Zwróć uwagę na podobieństwo do Właściwości DefaultLocation folderu aplikacji, w tym na dziwne użycie pojedynczego ukośnika wstecznego.

  5. Zachwyć się przez chwilę śmiesznym (ale niezaprzeczalnym) faktem, że istnieje właściwość folderu o nazwie "właściwość."Dzieci pełne wścieklizny, kto wymyśla takie gówno?

  6. Zmień właściwość folderu na "COMMONAPPDATAFOLDER".

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
 1
Author: Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-13 17:27:31

To działało dla mnie za pomocą VS2005, ale musiałem zmienić DefaultLocation, dodałem'\', aby oddzielić CommonAppDataFolder.

[CommonAppDataFolder]\[Manufacturer]\[ProductName]

Nie wiem, czy to była literówka, ale Lyman odnosił się do dziwnego użycia pojedynczego ukośnika wstecznego, ale to nie wydaje się poprawne.

 1
Author: Andrew Morton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-23 19:52:47

Nie jestem pewien, czy to pomoże w Twoim przypadku, czy nie.

Ale jeśli dodasz sekcję prywatną do pliku konfiguracyjnego aplikacji

Możesz określić dodatkowe foldery do sprawdzenia w aplikacji.

Jeśli chcesz zainstalować do innych folderów na komputerze, to jest problem. Zasadniczo cały powód, dla którego MS ograniczyło te rzeczy jest utrzymanie złośliwego kodu z maszyn, w których Użytkownik nie jest świadomy z czego oni instalują.

Więc to nie zadziała, jeśli potrzebujesz innego katalogu. To, co robi ta poprawka, pozwala określić, gdzie w aplikacji, aby wyszukać pliki......

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 19:39:13