Cách thêm phụ thuộc vào Dịch vụ Windows SAU khi dịch vụ được cài đặt


133

Tôi có một Dịch vụ Windows sử dụng cơ sở dữ liệu SQL Server. Tôi không có quyền kiểm soát việc cài đặt dịch vụ, nhưng muốn thêm một phụ thuộc vào dịch vụ để đảm bảo rằng nó bắt đầu sau khi máy chủ SQL đã khởi động. (Máy chủ SQL đang chạy trên cùng một máy với dịch vụ được đề cập)

Có một công cụ để thêm một phụ thuộc hoặc có thể chỉnh sửa sổ đăng ký trực tiếp?

Câu trả lời:


199

Điều này cũng có thể được thực hiện thông qua một dấu nhắc lệnh nâng cao bằng cách sử dụng sclệnh. Cú pháp là:

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

Lưu ý : Có một không gian sau dấu bằng, và có không một trước khi nó.

Cảnh báo : depend=tham số sẽ ghi đè lên danh sách phụ thuộc hiện có, không nối thêm. Vì vậy, ví dụ, nếu ServiceA đã phụ thuộc vào ServiceB và ServiceC, nếu bạn chạy depend= ServiceD, ServiceA sẽ chỉ phụ thuộc vào ServiceD. (Cảm ơn Matt !)

Ví dụ

Phụ thuộc vào một dịch vụ khác:

sc config ServiceA depend= ServiceB

Ở trên có nghĩa là ServiceA sẽ không bắt đầu cho đến khi ServiceB bắt đầu. Nếu bạn dừng ServiceB, ServiceA sẽ tự động dừng.

Phụ thuộc vào nhiều dịch vụ khác:

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

Ở trên có nghĩa là ServiceA sẽ không bắt đầu cho đến khi ServiceB, ServiceC và ServiceD bắt đầu. Nếu bạn dừng bất kỳ ServiceB, ServiceC hoặc ServiceD, ServiceA sẽ tự động dừng.

Để loại bỏ tất cả các phụ thuộc:

sc config ServiceA depend= /

Để liệt kê các phụ thuộc hiện tại:

sc qc ServiceA

5
Nếu bạn muốn xem các phụ thuộc hiện có trước khi thay đổi chúng bằng phương pháp của Kip, bạn có thể nhập sc qc YourServiceName
mivk

1
Hãy cẩn thận ... Tôi chỉ sử dụng cái này và không nhận ra rằng nó sẽ ghi đè lên các phụ thuộc hiện có .. có hai dịch vụ của tôi mà tôi không nhớ .. bây giờ chúng đã biến mất .. oh tốt! Vì vậy, hãy đảm bảo bạn chạy lệnh @mivk được đề cập trước để xem bất kỳ phụ thuộc nào khác trước.
Matt

1
Bạn có thể truy vấn phụ thuộc được cấu hình hiện tại cho một dịch vụ bằng cách sử dụng sc qc [service name]lệnh
gerrytan

4
Nếu giống như tôi, Dịch vụ của bạn có khoảng trắng trong tên, hãy đặt nó trong dấu ngoặc kép.
Lazlow

6
Nếu sử dụng powershell, hãy đảm bảo bạn sử dụng sc.exenếu không bạn sẽ gặp lỗi: 'Không thể tìm thấy tham số vị trí chấp nhận đối số'
spuder

42

Bạn có thể thêm phụ thuộc dịch vụ bằng cách thêm giá trị "DependOnService" vào dịch vụ trong sổ đăng ký bằng regeditlệnh, dịch vụ có thể được tìm thấy bên dưới HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Service name>. Các chi tiết có thể được tìm thấy tại bài viết MS KB 193888 , trong đó phần sau đây là một đoạn trích từ:

Để tạo một phụ thuộc mới, chọn khóa con biểu thị dịch vụ bạn muốn trì hoãn, bấm Chỉnh sửa, rồi bấm Thêm Giá trị. Tạo một tên giá trị mới "DependOnService" (không có dấu ngoặc kép) với kiểu dữ liệu REG_MULTI_SZ, sau đó bấm OK. Khi hộp thoại Dữ liệu xuất hiện, nhập tên hoặc tên của các dịch vụ bạn muốn bắt đầu trước dịch vụ này với một mục nhập cho mỗi dòng, sau đó bấm OK.


7
Bò thần! Đó là câu trả lời nhanh nhất tôi từng nhận được. Tôi hầu như không trở lại trang chủ.
Rick

2

Tôi đang tìm kiếm một phương thức hoàn toàn PowerShell (không có regedit hoặc sc.exe) có thể hoạt động trên 2008R2 / Win7 và mới hơn, và đã đưa ra phương pháp này:

Dễ dàng là thực hiện regedit với PowerShell:

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

Hoặc, sử dụng 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)

Các thay đổi phương pháp của lớp Win32_Service giúp điểm đến một giải pháp:

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

Tôi đã viết một ứng dụng .net đơn giản để quản lý các phụ thuộc dịch vụ, nếu bạn quan tâm. Nó miễn phí.

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


1
Nó đang nói với tôi rằng tôi cần .NET 1.1 nhưng tôi đang chạy windows 7
Nick

1
.Net 1.1 cần được cài đặt trên Windows 7. Xem câu trả lời cho câu hỏi này: answer.microsoft.com/en-us/windows/forum/ mẹo
Glenn Sullivan

9
Thực sự, vào năm 2014, bạn đã khuyên bạn nên cài đặt .NET 1.1 trên Win7 thay vì chỉ biên dịch lại cho 4.0? Cảm ơn, không.
Endrju

0

Trong C ++ (ATL) tôi đã làm như thế này

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.