سؤال كيفية إضافة التبعية على خدمة Windows بعد تثبيت الخدمة


لدي خدمة Windows التي تستخدم قاعدة بيانات SQL Server. ليس لدي السيطرة على تثبيت الخدمة ، ولكن أود أن أضيف تبعية على الخدمة لضمان أن يبدأ بعد أن بدأ خادم SQL. (يتم تشغيل خادم SQL على نفس الجهاز مثل الخدمة المعنية)

هل هناك أداة لإضافة تبعية أو ربما تحرير التسجيل مباشرة؟


118
2018-06-12 14:52


الأصل




الأجوبة:


ويمكن أيضا أن يتم ذلك عن طريق موجه الأوامر المرتفع باستخدام sc أمر. الصيغة هي:

sc config [service name] depend= <Dependencies(separated by / (forward slash))>

ملحوظة: هناك مساحة بعد علامة يساوي ، وهناك ليس واحد قبل ذلك.

تحذير: depend= سوف المعلمة اعادة الكتابة قائمة التبعيات القائمة ، وليس إلحاق. على سبيل المثال ، إذا كانت ServiceA تعتمد بالفعل على ServiceB و ServiceC ، إذا قمت بتشغيل depend= ServiceD، سوف تعتمد ServiceA الآن فقط على ServiceD. (شكر مات!)

أمثلة

الاعتماد على خدمة واحدة أخرى:

sc config ServiceA depend= ServiceB

أعلاه يعني أن ServiceA لن تبدأ حتى يبدأ ServiceB. إذا قمت بإيقاف ServiceB ، ستتوقف ServiceA تلقائيًا.

الاعتماد على العديد من الخدمات الأخرى:

sc config ServiceA depend= ServiceB/ServiceC/ServiceD/"Service Name With Spaces"

أعلاه يعني أن ServiceA لن تبدأ حتى يبدأ ServiceB و ServiceC و ServiceD. إذا قمت بإيقاف أي خدمة من ServiceB أو ServiceC أو ServiceD ، فستتوقف ServiceA تلقائيًا.

لإزالة جميع الاعتماديات:

sc config ServiceA depend= /

لسرد التبعيات الحالية:

sc qc ServiceA

181
2018-01-28 21:59



كان في الأصل حدد الإجابة التي تشير إلى كيفية تحرير السجل. لكن استخدام الأمر SC هو أكثر انسجاما مع ما كنت أبحث عنه. شكرا. - Rick
إذا كنت ترغب في رؤية التبعيات الحالية قبل تغييرها باستخدام طريقة Kip ، يمكنك كتابة sc qc YourServiceName - mivk
فقط كن حذرا ... أنا فقط استخدم هذا ولم أكن أدرك أنه سيحل محل التبعيات الحالية .. كان هناك اثنان لخدمتي التي لا أتذكرها .. الآن هم ذهبوا .. حسنا! لذا تأكد من تشغيل الأمرmivk المذكور أولاً لرؤية أي تبعيات أخرى أولاً. - Matt
إذا كنت تحبني ، فلدى خدمتك فراغات في الاسم ، أرفقها بين علامتي اقتباس. - Lazlow
في حالة استخدام powershell ، تأكد من استخدام sc.exe وإلا فستحصل على خطأ: "لا يمكن العثور على معلمة موضعية تقبل وسيطة" - spuder


يمكنك إضافة تبعيات الخدمة عن طريق إضافة قيمة "DependOnService" إلى الخدمة في السجل باستخدام regedit القيادة ، يمكن العثور على الخدمات تحت HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. التفاصيل يمكن العثور عليها في مقالة KB KB 193888، والتي منها ما يلي مقتطف من:

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


41
2018-06-12 14:53



بقرة مقدسة! كان هذا أسرع إجابة تلقيتها على الإطلاق. بالكاد عدت إلى الصفحة الرئيسية. - Rick
+1 شكرا ، عملت بالنسبة لي. - Rich


كتبت تطبيق بسيط .net لإدارة تبعيات الخدمة ، إذا كنت مهتمًا. انه مجانا.

http://webpages.charter.net/bushman4/servicedependencymanager.html


1
2018-01-31 16:38



هو يقول لي أحتاج .NET 1.1 لكنني أشغل windows 7 - Nick
.Net 1.1 يجب أن يتم تثبيته على Windows 7. انظر إجابة هذا السؤال: answers.microsoft.com/en-us/windows/forum/... - Glenn Sullivan
حقا ، في عام 2014 كنت توصي بتركيب .NET 1.1 على Win7 بدلا من مجرد إعادة ترجمته لمدة 4.0؟ شكرا ، لا. - Endrju


كنت أبحث عن طريقة PowerShell بحتة (لا regedit أو sc.exe) التي يمكن أن تعمل على 2008R2 / Win7 وأحدث ، وجاءت مع هذا:

من السهل أن تفعل regedit مع PowerShell:

Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation' -Name DependOnService -Value @('Bowser','MRxSmb20','NSI')

أو ، باستخدام WMI:

$DependsOn = @('Bowser','MRxSmb20','NSI','') #keep the empty array element at end
$svc = Get-WmiObject win32_Service -filter "Name='LanmanWorkstation'"
$svc.Change($null,$null,$null,$null,$null,$null,$null,$null,$null,$null,$DependsOn)

ال يتغيرون أسلوب من فئة Win32_Service ساعد على الإشارة إلى حل:

uint32 Change(
[in] string  DisplayName,
[in] string  PathName,
[in] uint32  ServiceType,
[in] uint32  ErrorControl,
[in] string  StartMode,
[in] boolean DesktopInteract,
[in] string  StartName,
[in] string  StartPassword,
[in] string  LoadOrderGroup,
[in] string  LoadOrderGroupDependencies[],
[in] string  ServiceDependencies[]
);

1
2018-02-13 03:40



اختبار. يعمل جيدا. شكرا للمشاركة. - CJBS


في C ++ (ATL) فعلت هذا

bool ModifyDependOnService(void)
{
  CRegKey R;
  if (ERROR_SUCCESS == R.Open(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\services\\MyService"))
  {
    bool depIsThere = false;

    // determine if otherservice is installed, if yes, then add to dependency list.
    SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
    if (hSCManager)
    {
      SC_HANDLE hService = OpenService(hSCManager, L"OtherService", SERVICE_QUERY_STATUS);
      if (hService)
      {
        depIsThere = true;
        CloseServiceHandle(hService);
      }
      CloseServiceHandle(hSCManager);
    }

    std::wstring key = L"DependOnService";
    if (depIsThere )
    {
      const wchar_t deps[] = L"RPCSS\0OtherService\0";
      R.SetValue(key.c_str(), REG_MULTI_SZ, deps, sizeof(deps));
    }

    R.Close();
    return true;
  }
  return false;
}

0
2017-08-02 06:58