.NET App Leadcut لـ MSI عند تشغيله بواسطة المستخدم العادي
-
06-07-2019 - |
سؤال
لدي تطبيق 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