سؤال

لدي مشكلة هنا في نشر MSI الذي أعمل عليه (باستخدام InstallShield).لدينا برنامج يعمل في الخلفية ويحتاج إلى التشغيل لكل مستخدم، ويجب أن يبدأ تشغيله تلقائيًا دون تدخل المستخدم.

المشكلة هي مع كائن نهج المجموعة/الدليل النشط (GPO/AD) يتم بدء تشغيل التطبيق في سياق SYSTEM قبل أن يقوم أي شخص بتسجيل الدخول بدلاً من أن يكون المستخدم الذي على وشك تسجيل الدخول.يمكن تشغيل التطبيق مرة واحدة فقط لكل مستخدم، ويبدو أن عملية SYSTEM تمنع عملية المستخدم من البدء.وهذا يعني أن أجهزة الكمبيوتر تحتاج إلى إعادة التشغيل مرتين قبل أن يتم نشر البرنامج للمستخدمين.كيف يمكننا أن نوقف هذا؟

في الأساس سير العمل الحالي هو:

  1. يتم تشغيل التثبيت/الترقية...قتل تطبيق الخلفية
  2. تثبيت ملفات جديدة
  3. تطبيق خلفية بدء التشغيل

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

من الناحية المثالية، سأطلب من فريق التطوير تصحيح ملف EXE لمنع التشغيل في سياق النظام، ولكن هذه دورة إصدار بعيدة، وأنا أبحث عن حل قائم على المثبت مؤقتًا.

(لا أعرف برنامج التثبيت...لذلك أعتقد فبسكريبت ربما يكون هذا هو الحل الأمثل إذا لم يكن هناك عناصر InstallShield أصلية يمكنني استخدامها.)

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

المحلول

يمكنك استخدام ال تسجيل الدخولUser خاصية Windows Installer كشرط لبدء تشغيل EXE.

نصائح أخرى

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

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

لدى Microsoft ميزة تسمى Active Setup والتي ستسمح لك بتشغيل "شيء قابل للتشغيل" مرة واحدة لكل مستخدم، عند تسجيل الدخول.يمكن أن يكون هذا أي شيء بدءًا من البرنامج النصي وحتى الملف القابل للتنفيذ.انظر إجابتي هنا لمزيد من التفاصيل: تحديث سجل كل ملف تعريف على Windows Server 2003

آها!كنت أعلم أنه يجب أن يكون هناك حل أنظف ...الكود الذي كنت أعمل عليه بدأ يبدو كالتالي:

On Error Resume Next 
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = 'BackgroundProcess.exe'")
For Each objProcess in colProcessList
    colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain)
    If strNameOfUser = "SYSTEM" Then    
        objProcess.Terminate()
    End If
Next
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top