it-swarm-vi.tech

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

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?

135
Rick

Điều này cũng có thể được thực hiện thông qua lệnh nâng cao Nhắc bằng lệnh sc. Cú pháp là:

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

Lưu ý : Có khoảng trắng sau dấu bằng và có không = một trước nó.

Cảnh báo : depend= tham số sẽ ghi đè 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 giờ sẽ phụ thuộc chỉ trên 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
203
Kip

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 lệnh regedit, các dịch vụ có thể được tìm thấy trong 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 , từ đó 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.

42
pauska

Tôi đang tìm kiếm một phương thức PowerShell hoàn toàn (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)

Phương thức Change của lớp Win32_Service đã giúp chỉ ra 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[]
);
2
JoeGasper

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
Glenn Sullivan

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;
}
0
AndersK