سؤال

لدي تطبيق C# يستخدم منشئ MSI المدمج في Visual Studio 2005.

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

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

كيف أتجول في هذا؟ لقد غيرت عددًا من الإعدادات التي تحاول الالتفاف على هذا دون حظ.

تحرير: لدي installAllusers = مجموعة حقيقية.

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

المحلول

كما هو موضح هنا, ، يمكن لـ Visual Studio إنشاء "اختصارات معلن عنها" فقط تستخدم ملف MSI للتحقق من وجود جميع الملفات وقيم التسجيل.

في نفس الرابط ، يمكنك العثور على الحل: قم بتحرير قاعدة بيانات MSI لإضافة قيمة في جدول الخصائص. لقد اختبرته ، عليك فقط أن تضيف "Ambleadvtshortcuts"مع القيمة" 1 ".

لإضافتها ، يمكنك استخدام أداة ORCA التي تعد جزءًا من Windows Installer SDK. هذه هي الطريقة اليدوية ... وأفترض أنك لن تحبها.

لذلك نظرت إلى أبعد من ذلك ووجدت أنه يمكنك القيام بذلك باستخدام سطر أوامر ونص VBS الذي يوفره جهاز تثبيت النافذة SDK:

Cscript WiRunSQL.vbs Test.msi "INSERT INTO `Property` (`Property`.`Property`,`Property`.`Value`) VALUES ('DISABLEADVTSHORTCUTS',1)"

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

تعمل جيدا بالنسبة إلي !

مصادر إضافية :
مرجع جدول خاصية MSI
تحرير MSI مع سطر الأوامر

نصائح أخرى

عادة ما يكون هناك خيار عند التثبيت للتثبيت لـ "الجميع" أو "أنا فقط". تأكد من التحقق من الجميع. يمكنك حتى تعيين ذلك على أنه افتراضي عند إنشاء MSI.

كملاحظة إضافية ، كانت الإصدارات القديمة من MS Office لديها نفس المشكلة (ربما لا تزال كذلك ؛ لم أكن بحاجة للتحقق من الإصدارات الحديثة - وربما هذا يعني أنه لا يوجد حل). بالعودة إلى الوراء عندما اعتدت أن أعمل في متجر كمبيوتر صغير كلما أنشأنا بناءًا جديدًا ، سنقوم دائمًا بإنشاء حسابات المستخدم الأولية ثم نبدأ في المكتب يدويًا مرة واحدة للحصول على هذه الخطوة الإضافية للمستخدمين.

في الأساس ، يعد اختصار سطح المكتب اختصارًا خاصًا يؤدي إلى فحص مرونة تثبيت Windows - في محاولة لاستعادة الملفات المفقودة والمجلدات وإدخالات التسجيل.

على الأرجح ، أود أن أقول إن لديك بعض إدخالات سجل المستخدم (HKCU أو HKCR) المفقودة ، وبالتالي يحاول تثبيت Windows العثور على MSI لإعادة إنشائها.

إذا كتبت MSI أي إدخالات تسجيل إلى HKCU ، فعندما يقوم مستخدم جديد بتشغيل التطبيق لأول مرة ، يرى Windows Installer أن الإدخالات ليست موجودة لهذا المستخدم وتحاول إنشائها. لماذا يعتقد Windows Installer أنه يحتاج إلى أن ملف MSI الأصلي لهذا هو خارج عني (يجب أن يكون التثبيت في C: Windows Installer كافيًا ، ولكن لا يبدو).

على أي حال ، فإن استبدال الاختصار ليس اختصارًا كاملاً ، لأن العمليات الأخرى ، مثل استدعاء مكونات COM ، يمكن أن تستدعي نفس عملية الشفاء الذاتي الذي يستدعيه الاختصار المعلن.

تحرير يونيو 2010: كان MSI الذي أنشأته تحت VS 2005 على Windows XP. عندما حاولت استخدام نفس MSI لتثبيت/إلغاء التثبيت تحت Vista ، لم يكن إلغاء التثبيت نظيفًا للغاية. لم أقم بتقييم المدى أو السبب ، لكنني لا أوصي باستخدام هذا الحل على Vista دون مزيد من التحقيق.

المنشور الأصلي:

ما زلت لم أجد حلاً حقيقيًا لمشكلتي على الرغم من أن الحل البديل - قليلًا من الاختراق - يعمل بشكل جيد بما يكفي لأغطيتي. لقد وجدت الاقتراح في بعض المواقع الأخرى (سأقوم بنشر رابط إليه إذا كان بإمكاني العثور عليه مرة أخرى).

لقد قمت بإنشاء ملف VBS يحتوي على وظيفتين: أحدهما يقوم بإنشاء اختصار والآخر ينشئ بنية الدليل حسب الضرورة. عندما يتم تنفيذ الملف ، فإنه يستدعي Makehortcut عدة مرات كما يراه المطور مناسبًا.

يعمل ملف VBS الثاني بنفس الطريقة ولكنه يحذف الاختصارات.

أتصل بالملف الأول كجزء من إجراء مخصص (انقر بزر الماوس الأيمن على مشروع الإعداد ، عرض ، الإجراءات المخصصة) في مجلد التثبيت. أدعو الثانية في مجلد إلغاء التثبيت.

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

فيما يلي الملفان في حال يريد أي شخص استخدامهما:

"إنشاء اختصارات

MakeShortcut "%AllUsersProfile%\Start Menu\Programs\My Prog Folder", _
             "My Prog", _
             "%ProgramFiles%\My prog\prog.exe"


Function MakeShortcut (location, text, target)

    Dim objShortcut
    Dim objShell
    Dim expLocation

    Set objShell = CreateObject("WScript.Shell")
    expLocation  = objShell.ExpandEnvironmentStrings(location)
    expTarget    = objShell.ExpandEnvironmentStrings(target)

    MakeDirectory(expLocation)

    set objShortcut = objShell.CreateShortcut(expLocation & "\" & text & ".lnk") 
    objShortcut.TargetPath = expTarget
    objShortcut.Save
End Function


Function MakeDirectory (newPath)

    Dim objFSO
    Dim arrPath
    Dim length
    Dim count
    Dim path

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    If objFSO.FolderExists(newPath) Then    
        Exit Function
    End If

    path = ""
    count = 0
    arrPath = split(newPath, "\")
    length = ubound(arrPath)
    While count <= length 
        path = path + arrPath(count) + "\"
        count = count + 1
        If Not objFSO.FolderExists(path) Then 
            objFSO.CreateFolder(path)
        End If
    Wend
End Function

حذف الاختصارات

DeleteShortcut "%AllUsersProfile%\Start Menu\Programs\My Prog Folder", _
               "My Prog.lnk", _
               True


Function DeleteShortcut (location, shortcut, delLoc)

    Dim objShortcut
    Dim objShell
    Dim expLocation

    Set objShell = CreateObject("WScript.Shell")
    Set objFSO   = CreateObject("Scripting.FileSystemObject")
    expLocation  = objShell.ExpandEnvironmentStrings(location)

    DeleteDirectory(expLocation)

    If objFSO.FileExists(expLocation) Then
       objFSO.DeleteFile expLocation & "\" & shortcut
    End If 

    If delLoc = True Then
        DeleteDirectory location
    End If

End Function


Function DeleteDirectory (path)

    Dim objFSO

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    If objFSO.FolderExists(path) Then  
        objFSO.DeleteFolder path, True
    End If
End Function
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top