VS2008 إعداد المشروع:مشترك (من قبل كافة المستخدمين) بيانات التطبيق الملفات ؟

StackOverflow https://stackoverflow.com/questions/76760

سؤال

زميل وشبيهو و منصات زنبق و paddlewheels!

انا تطوير ويندوز سطح المكتب التطبيق في C#/.NET/WPF, باستخدام VS 2008.التطبيق يتطلب تثبيت و تشغيل على ويندوز فيستا و XP الآلات.أنا أعمل على برنامج الإعداد/Windows Installer المشروع إلى تثبيت التطبيق.

بلدي التطبيق يتطلب قراءة/تعديل/الكتابة الوصول إلى SQLCE ملف قاعدة بيانات (.sdf) وغيرها من قاعدة بيانات من نوع الملفات ذات الصلة إلى طرف ثالث مراقبة أنا باستخدام.هذه الملفات يجب أن تكون مشتركة بين جميع المستخدمين/تسجيل الدخول على جهاز الكمبيوتر ، أي من الذي يمكن أن يكون مطلوبا أن يكون مسؤول.هذا يعني بالطبع أن الملفات لا يمكن أن تذهب في البرنامج نفسه دليل التثبيت (كما مثل هذه الأمور غالبا ما فعلت قبل وصول Vista, نعم, نعم!).

وكان من المتوقع أن الحل يكون بسيط. Vista و XP سواء تقاسمت-التطبيق-بيانات المجلدات المخصصة لهذا الغرض. ("\ProgramData" في ويندوز فيستا, "\Documents and Settings\All Users\Application Data" في XP.) على .صافي البيئة.GetFolderPath(SpecialFolder.CommonApplicationData) دعوة موجود العثور على مسارات هذه المجلدات على جهاز الكمبيوتر, نعم, نعم!

ولكن أنا لا يمكن معرفة كيفية تحديد مشترك-التطبيق-بيانات المجلد هدفا في إعداد المشروع.

إعداد مشروع "الملفات المشتركة" مجلد ، ولكن هذا هو المقصود مشترك مكونات البرنامج (لا ملفات البيانات), عادة ما يقع تحت "\ملفات البرنامج" ولها نفس القيود الأمنية أي شيء آخر في "ملفات البرنامج \" لا ، نعم ، نعم!

إعداد مشروع "المستخدم بيانات التطبيق" مجلد ، ولكن هذا لكل مستخدم مجلد ، وهو بالضبط ما أحاول تجنب, نعم, نعم!

هل من الممكن لإضافة الملفات المشتركة-التطبيق-بيانات المجلد قوية عبر ويندوز-نسخة من VS 2008 إعداد المشروع ؟ يمكن لأحد أن يقول لي كيف ؟

هل كانت مفيدة؟

المحلول

لقد تعلمت الجواب على سؤالي من خلال مصادر أخرى ، نعم ، نعم!ومن المحزن أنه لم يحل مشكلتي!ما الذي جعل لي -- المثبت العلوي?نعم, نعم!

وضع الأشياء في sub-directory المشتركة مجلد بيانات التطبيق من VS2008 إعداد المشروع ، وهنا ما يمكنك القيام به:

  1. انقر بزر الماوس الأيمن فوق إعداد المشروع في "مستكشف الحلول" ثم اختيار "عرض -> نظام الملفات".

  2. انقر بزر الماوس الأيمن فوق "نظام الملفات على الجهاز الهدف" واختيار "إضافة مجلد خاص -> مجلد مخصص".

  3. إعادة تسمية مجلد مخصص على "المشتركة مجلد بيانات التطبيق." (هذا ليس الاسم الذي سيتم استخدامه المجلد الناتج انها فقط لمساعدتك على إبقاء مباشرة.)

  4. تغيير المجلد DefaultLocation الملكية "[CommonAppDataFolder][الصانع]\[اسم المنتج]".ملاحظة التشابه مع DefaultLocation الملكية من مجلد التطبيق ، بما في ذلك غريبة استخدام واحد مائل.

  5. أعجوبة في لحظة سخيفة (حتى الآن لا يمكن إنكارها) الواقع أن هناك خصائص المجلد المسمى "الممتلكات".

  6. تغيير المجلد العقار إلى "COMMONAPPDATAFOLDER".

ملفات البيانات توضع في المشترك "بيانات التطبيق" المجلد سيتم نسخها إلى "\ProgramData\الصانع\ProductName" (على ويندوز فيستا) أو "\Documents and Settings\All Users\Application Data\الصانع\ProductName" (إكس بي) عندما المثبت هو تشغيل.

الآن اتضح أن تحت ويندوز فيستا غير المسؤولين لا تعديل/الكتابة الوصول إلى الملفات هنا.لذلك كل المستخدمين على قراءة الملفات, لكنها تحصل على هذا في "ملفات البرنامج \" كذلك.إذا ما أتسائل هي النقطة المشتركة مجلد بيانات التطبيق?

نصائح أخرى

بدلا من التحقق من "تمكين ClickOnce الأمن إعدادات" واختيار "هذا هو الثقة الكاملة التطبيق" ، فمن الممكن لتغيير أذونات التطبيق الخاص بك CommonAppDataDirectory مع إجراء مخصص تحت عنوان "تثبيت" من إعداد المشروع.هنا هو ما فعلته:

  1. وأضاف إجراء مخصص للاتصال التطبيق تثبيت (بالتناوب يمكنك إنشاء برنامج منفصل/dll وندعو أن بدلا من ذلك)
  2. مجموعة حجج الملكية إلى "تثبيت"
  3. تعديل الرئيسية في البرنامج.cs للتحقق من أن arg:

    static void Main(string[] args) { if (args != null && args.Length > 0 && args[0] == "Install") { ApplicationData.SetPermissions(); } else { // Execute app "normally" } }
  4. كتب SetPermissions وظيفة برمجيا تغيير الأذونات

    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); } }

منذ المثبت يعمل مع المشرف حقوق البرنامج سوف تكون قادرة على تغيير الأذونات.قرأت في مكان ما أن "تمكين ClickOnce الأمن" يمكن أن يسبب للمستخدم رؤية غير موجه في التطبيق بدء التشغيل.نفعل كما هو موضح أعلاه سيتم منع هذا من الحدوث.آمل أن يساعد هذا شخص.وأنا أعلم أنني يمكن أن يكون استفاد من رؤية شيء مثل هذا قبل بضعة أيام!

لا تحل بهذه الطريقة.ظللت ملف قاعدة البيانات (.sdf) في نفس المجلد حيث تم تثبيت التطبيق (تطبيق مجلد).على علامة التبويب أمان في خصائص نافذة المشروع الرئيسي ، راجعت "تمكين ClickOnce الأمن إعدادات" ثم اختيار "هذا هو الثقة الكاملة التطبيق" ، بناء وركض الإعداد.بعد أن لا مشكلة الأمن

أنا باستخدام Visual Studio 2008 أو نظام التشغيل Windows Vista

بالنسبة لي فقد عملت باستخدام VS2005 ولكن اضطررت الى تغيير DefaultLocation ، أضفت '\' للتفريق بين CommonAppDataFolder.

[CommonAppDataFolder][الصانع][اسم المنتج]

لا أعرف إذا كان هذا خطأ مطبعي ولكن ليمان لم يشر إلى الغريب استخدام واحد مائل ولكن هذا لا يبدو صحيحا.

كان عندي نفس المشكلة.المشروع الإعداد يعطي المستخدم الخيار لتثبيت التطبيق "للمستخدم الحالي فقط" أو "لجميع المستخدمين:.وبالتالي فإن ملف قاعدة البيانات في نهاية المطاف إما للمستخدم الحالي أو جميع المستخدمين مجلد بيانات التطبيق.الإعداد يجب أن تكتب هذه المعلومات في مكان ما بحيث التطبيق يمكن استرجاعها في وقت لاحق, عندما يتعلق الأمر إلى الوصول إلى قاعدة البيانات.وإلا كيف هل تعرف أي مجلد بيانات التطبيق أن ننظر ؟

لتجنب هذه المشكلة ، أنا فقط أريد أن تثبيت قاعدة البيانات في جميع المستخدمين/مجلد بيانات التطبيق ، بغض النظر عما إذا تم تثبيت التطبيق على مستخدم واحد أو لجميع المستخدمين.أدرك بالطبع أن اثنين من المستخدمين لا يمكن تثبيت التطبيق على الكمبيوتر نفسه دون الكتابة فوق البيانات بعضها البعض.هذا هو مثل هذا الاحتمال البعيد ، على الرغم من أن كنت لا ترغب في النظر في ذلك.

أول قطعة من اللغز لدي هنا:

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));
}

الآن نحن بحاجة إلى التأكد من أن مصدر البيانات يحتوي على DataDirectory نائبا.هذه القطعة جاءت من هنا.في مجموعة البيانات مصمم العثور على بيانات خصائص فتح عقدة اتصال و تعديل سلسلة_الاتصال خاصية البحث كما يلي:

Data Source=|DataDirectory|\YourDatabase.sdf

ثم تابعت ليمان أندرز نولز' تعليمات من فوق على كيفية إضافة مشترك مجلد بيانات التطبيق إلى إعداد المشروع و وضع قاعدة بيانات الملف في هذا المجلد.

ثم يتبع أوفي اقتراح من فوق ، أيراجعت "تمكين ClickOnce الأمن إعدادات" ثم اختيار "هذا هو الثقة الكاملة من التطبيق.

بعد أن تطبيق المنتشرة بشكل جيد على ويندوز فيستا ملف قاعدة البيانات يمكن الوصول إليها لكل من يقرأ ويكتب.

أنا أحب أدناه مفهوم بعض الاشياء التي اتخذت من أعلاه

  1. انقر بزر الماوس الأيمن فوق إعداد المشروع في "مستكشف الحلول" ثم اختيار "عرض -> نظام الملفات".

  2. انقر بزر الماوس الأيمن فوق "نظام الملفات على الجهاز الهدف" واختيار "إضافة مجلد خاص -> مجلد مخصص".

  3. إعادة تسمية مجلد مخصص على "المشتركة مجلد بيانات التطبيق." (هذا ليس الاسم الذي سيتم استخدامه المجلد الناتج انها فقط لمساعدتك على إبقاء مباشرة.)

  4. تغيير المجلد DefaultLocation الملكية "[CommonAppDataFolder][الصانع][اسم المنتج]".ملاحظة التشابه مع DefaultLocation الملكية من مجلد التطبيق ، بما في ذلك غريبة استخدام واحد مائل.

  5. أعجوبة في لحظة سخيفة (حتى الآن لا يمكن إنكارها) الواقع أن هناك خصائص المجلد المسمى "الممتلكات". الرضع كامل من داء الكلب الذي يأتي مع هذا الهراء ؟

  6. تغيير المجلد العقار إلى "COMMONAPPDATAFOLDER".

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

لست متأكدا إذا كان هذا سيساعد في القضية أم لا.

ولكن إذا قمت بإضافة قسم خاص إلى التطبيق الخاص بك config

يمكنك تحديد مجلدات إضافية للتحقق في التطبيق الخاص بك.

إذا ما تقوله هو أن كنت تريد أن تكون قادرة على تثبيت في مجلدات أخرى على الجهاز ، ثم هذا هو المشكلة.أساسا السبب كله أن السيدة قد قيدت هذه الاشياء هو الحفاظ على الشيفرات الخبيثة خارج آلات حيث يكون المستخدم على علم ما هي تركيب.

لذا, هذا لن تعمل إذا كنت بحاجة إلى دليل آخر.ما هذا الإصلاح لا تسمح لك بتحديد حيث داخل التطبيق الخاص بك للبحث عن الملفات......

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top