שאלה כיצד להוסיף תלות בשירות Windows לאחר התקנת השירות


יש לי שירות Windows שעושה שימוש במסד נתונים של SQL Server. אין לי שליטה על ההתקנה של השירות, אבל רוצה להוסיף תלות בשירות כדי להבטיח שהוא מתחיל לאחר שרת SQL החלה. (שרת SQL פועל על אותה מכונה כמו השירות המדובר)

האם יש כלי להוסיף תלות או לערוך את הרישום ישירות?


118
2018-06-12 14:52






תשובות:


זה יכול להיעשות גם באמצעות שורת הפקודה מוגבה באמצעות sc פקודה. התחביר הוא:

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

הערה: יש מקום לאחר את השווה השווה, ויש לא אחד לפני זה.

אזהרהYou depend= הפרמטר יהיה להחליף רשימת תלות קיימת, לא לצרף. לדוגמה, אם ServiceA כבר תלוי ב- ServiceB וב- ServiceC, אם אתה מפעיל depend= ServiceD, ServiceA יהיה תלוי עכשיו רק on. (תודה מאט!)

דוגמאות

תלות בשירות אחר:

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 אחרת תקבל שגיאה: 'לא ניתן למצוא פרמטר positional המקבל את הארגומנט' - spuder


ניתן להוסיף תלות שירות על ידי הוספת ערך "DependOnService" לשירות ברישום באמצעות regedit הפקודה, השירותים ניתן למצוא תחת HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. את הפרטים ניתן למצוא בכתובת מאמר MS 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 אבל אני מפעיל חלונות 7 - Nick
. Net 1.1 צריך להיות מותקן ב- Windows 7. ראה את התשובה לשאלה זו: תשובות.microsoft.com/en-us/windows/forum/... - Glenn Sullivan
באמת, בשנת 2014 היית ההמלצה התקנת NET 1.1 על Win7 במקום רק recompiling זה 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')

Or, באמצעות 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